小程序数据如何格式化

这是上一个开发遗留的问题,下面两个图片红线区域的数据web端可以显示文字,但是移动端他那边之前的解释是:小程序不能new function,是引用不了;所以不能显示格式化后的内容,所以想请问一下小程序有什么方法来显示格式化的内容吗。

img

img

for (let i = 0; i < this.measureArr.length; i++) {
                    this.realValueArr.map(item => {
                        if (this.measureArr[i].measureId == item.measureId) {
                            if (this.measureArr[i].sampleTime !== item.sampleTime) this.measureArr[i]
                                .sampleTime = item.sampleTime;
                            if (this.measureArr[i].sampleValue !== item.sampleValue) this.measureArr[i]
                                .sampleValue = item.sampleValue;
                        }
                    });
                }
                this.Info = this.measureArr;
                console.log(JSON.parse(JSON.stringify(this.Info)));
                let printf =this.Info[8].printf;
                console.log("需格式化内容..",   JSON.parse(printf));
            },

这个printf就是我需要格式化的内容现在是第二张图片所示


这个是我同事给我的格式化代码但是他是使用了new function导致小程序这边就会报错
/*
 * 格式化显示
 * val: 采样值
 * fmt: 格式化内容
*/
export function formatDisplay(val, fmt){
    console.log("val",val);
    console.log("fmt",fmt);
    if(val === undefined || val === null || val === '') return null;
    if(!fmt) return val;
    if(fmt.type == 0){
        if(!fmt.script){
            return val
        }
        // 脚本模式
        if(fmt.script.indexOf('\br') != -1 || fmt.script.indexOf('\\br') != -1) {
            fmt.script = fmt.script.replace(new RegExp('\\\\br', 'gm'), '<br />')
        }
        var func = new Function("$val", fmt.script);
        var state = func(+val);
        return state || val;
    }
    else if(fmt.type == 1){
        // 保留小数位
        return (val*1).toFixed(fmt.scale);
    }
    else if(fmt.type == 2){
        // 按位解析
        var state = '';
        var split = fmt.split || ",";
        for(var bit in fmt){
            if(!isNaN(bit)){
                var x = Math.pow(2, bit);
                if((val&x) == x){
                    if(state == '')
                        state = fmt[bit];
                    else
                        state += split + fmt[bit];
                }
            }
        }
        return state || fmt["default"] || val;
    }
    else if(fmt.type == 3){
        // 按值解析
        return fmt[String(val)] || fmt["default"] || val;
    }
    else if(fmt.type == 4){
        // 拆分显示
        var state = '';
        var split = fmt.split || ",";
        var items = fmt.items;
        if(Array.isArray(items) && items.length){
            for(var i = 0; i < items.length; i++){
                var item = items[i];
                var from = item.from;
                var to = item.to || from;
                var x = Math.pow(2,to-from+1)-1;
                var v = val>>from&x;
                if(item.gain) v *= item.gain;
                if(item.scale) v = v.toFixed(item.scale);
                var unit = item.unit || '';
                var name = item.name ? item.name + ':' : '';
                if(state == '')
                    state = `${name}${v}${unit}`;
                else
                    state += split + `${name}${v}${unit}`;
            }
        }
        return state || val;
    }

    throw "无法识别类型:"+fmt.type;
}

这个数字是否有具体的字典值,4代表什么,2代表什么...这应该有明确的含义吧?找你们同事确认一下这些数字具体表示的含义,然后在小程序这里接收到值的时候,根据这些数字的含义做一个转换。

可以试一下wxs中写处理函数,然后在标签中去使用;不知道这么说有没有理解对
wxs 文件

var formatTime = function (time) {
  // .....
}
module.exports.formatTime

引入之后直接使用就行(引入我不会)

<text>{{until.formatTime(time)}} </text>


https://www.baidu.com/link?url=lxZ5pzvugnTfP4BFe_FoaAAH5F003QLbpw8zPikJwcFsyH7BeI4pK0D_KSfLw0LO3ReyMZtjM88AfR56uuzOUq&wd=&eqid=9741d955000477fa0000000363f4b156

在小程序中,由于安全原因,确实不能使用new Function函数来动态地执行字符串作为代码。但是你可以使用其他方式来格式化数据,比如使用内置的JavaScript方法和API,如parseFloat()、parseInt()等

参考GPT和自己的思路,在小程序中,你可以使用 WXML 的数据绑定语法和内置过滤器来格式化数据,从而实现格式化展示。

具体来说,你可以在 WXML 中使用 {{}} 来进行数据绑定,例如:

<view>{{sampleValue}}</view>

这里的 sampleValue 就是你需要格式化的数据字段。

然后,你可以使用内置过滤器来对数据进行格式化。内置过滤器有很多种,包括 currency、date、time、number 等等。以 number 为例,你可以使用以下语法来对数据进行格式化:

<view>{{sampleValue | number}}</view>

这样,sampleValue 就会被格式化成数字格式,例如 1,234.56。

除了内置过滤器,你也可以自定义过滤器来实现更复杂的数据格式化需求。具体来说,你可以在页面的 .js 文件中定义一个过滤器函数,然后在 WXML 中使用这个过滤器函数来格式化数据。例如:

// 在 .js 文件中定义一个过滤器函数
function formatSampleValue(value) {
  return value.toFixed(2);
}

// 在 WXML 中使用过滤器函数
<view>{{sampleValue | formatSampleValue}}</view>

这样,sampleValue 就会被格式化成保留两位小数的数字格式。

希望这些信息可以帮助到你实现在小程序中显示格式化的内容。如果对您有帮助,请给与采纳,谢谢。

// 将数据转换为 JSON 格式
String jsonData = new Gson().toJson(data);
// 将 JSON 格式的数据转换为 Java 对象
MyObject myObject = new Gson().fromJson(jsonData, MyObject.class);

接收到数据之后,用for循环 过滤一下,根据数据字典,新增或者修改属性。

以下答案基于ChatGPT与GISer Liu编写:
根据你提供的信息,这里有一个可能的解决方案:

  • 在小程序中新建一个方法,将该方法用于格式化sampleValue。例如:
formatSampleValue: function(value) {
  // 这里是你的格式化逻辑
  // 这里假设你要把 sampleValue 保留两位小数,可以使用 toFixed 方法
  return Number(value).toFixed(2);
}
  • 在模板中使用新建的 'formatSampleValue
    <view>{{ formatSampleValue(Info[index].sampleValue) }}</view>
    
    在模板中使用上述方法可以实现显示格式化后的 'sampleValue'

你也可以根据你的具体需要进行更改和调整。

img

img


昨天没有补充完整就是第一个是我小程序接收到格式化的数据需要展示的和web端一样

如果你的小程序不能够支持 new Function(),那么你可以使用 eval() 函数来动态执行JavaScript代码。

为了格式化纯数字,你可以编写一个函数来解析这个纯数字并将其转换为格式化的字符串,然后使用 eval() 函数来动态执行该函数。

例如,你可以这样编写一个函数来将数字转换为带有千位分隔符的字符串:

function formatNumber(num) {
  return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

然后你可以在你的代码中使用 eval() 函数来动态执行这个函数,如下所示:

apiPostReal_values(params).then(res => {
  if (res.success) {
    var data = res.data[0];
    console.log("data",data);
    this.Info[index].sampleTime = data.sampleTime;
    this.Info[index].sampleValue = eval('(function() { return ' + data.sampleValue + '; })()');
    uni.showToast({
        icon: 'none',
        title: '刷新成功',
        duration: 1500
    });
  }
});

在这个示例中,我们将 data.sampleValue 的值包装在一个自执行函数中,该函数返回这个值,并使用 eval() 函数来动态执行这个函数,从而获得格式化后的字符串。

从你提供的信息来看,小程序报错是因为在这段代码中使用了new Function()来创建一个新函数。

小程序是基于微信内置的JavaScript解释器运行的,它的安全机制比较严格,不允许使用一些高危操作,比如动态创建函数,这可能会导致安全风险。因此,你需要使用其他的方式来实现相同的功能。

一种可行的方法是使用模板字符串(Template literals)来代替new Function(),例如:

let fmt = JSON.parse(printf);
let script = fmt.script;
let val = this.Info[8].sampleValue;
let state = eval('`'+script+'`');
console.log("格式化后的内容:", state);


这段代码中,我们使用了eval()函数来执行模板字符串,从而达到动态执行代码的目的。需要注意的是,在使用eval()时,需要确保动态生成的代码是安全的,并避免出现安全漏洞。

那就别用 new Function了,试试看用eval函数