【问题标题】:Force JSON.stringify to use decimal notation强制 JSON.stringify 使用十进制表示法
【发布时间】:2015-10-05 00:11:09
【问题描述】:

当我将数据从客户端发送到服务器时,我使用的框架 (angularjs) 使用 JSON.stringify() 将数据转换为 JSON。 (它可能使用angular.toJson(),但它使用JSON.stringify() 来完成这项工作。)我猜stringify 函数在下面调用toString()...

问题是非常小的和非常大的值会用科学计数法写出来。这对我来说是个问题,因为服务器很难确定如何处理该值,从而导致保存数据出现问题。我希望我的对象被字符串化为十进制表示,例如.0000004 而不是 4e-7

这可能吗?是否可以全局执行此操作,这样我就不必修改每个 POST 到数据库?

【问题讨论】:

  • "服务器很难确定如何处理该值" ... ?? 4e-7 是一个非常好的数字,它的具体含义与 0.0000004 相同。你的服务器端 JSON 工具是什么?
  • 我刚刚在chrome下测试过,JSON.stringify下面没有调用toString。 JSON.stringify({toString: function(){return "foo";}});退货"{}"
  • c# - JavaScriptSerializer 正在将值转换为对象。然后我把它扔到一个 DataTable 中,我必须猜测数据类型。
  • 数值的科学记数法是明确有效的 JSON。如果您的服务器端 JSON 解析器无法将该表示正确地转换为某种数字形式,那么我会说它是一个无功能的 JSON 解析器。
  • 另请注意,您的 JSON 解析器从 JSON 中的数值构造的 whatever 数字类型,几乎 100% 确定无论输入值是否为科学计数法。 可能整数和非整数的处理方式不同,但如果 0.00000044e-7 在解析 JSON 后以完全相同的数值结束,我会感到非常惊讶。

标签: javascript json angularjs


【解决方案1】:

这可能不适用于所有情况,但我使用过

JSON.stringifyDecimal = function(...args) {
    return JSON.stringify(...args).replace(/[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,function(match) {
    return (parseFloat(match)).toFixed((!match.toUpperCase().includes("E") ? (match.split('.')[1] || []).length : 20)).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1');
  });
};

输入:[1.7e-5,5.6666],[1.8e-3,7.211555],[1.9e-2,2.456]

输出:[[0.000017,5.6666],[0.0018,7.211555],[0.019,2.456]]

此实现允许多达 20 位小数的精度。

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2013-11-07
    • 2016-02-06
    • 2014-10-12
    • 2017-05-14
    相关资源
    最近更新 更多