首页 > 解决方案 > 在 Javascript/Node 中将大数转换为字符串

问题描述

我看过其他相关问题,但它们并没有解决我的问题,或者我可能以某种方式错过了完全相同的已解决查询。

这是问题所在。我调用的服务返回一个 JSON 响应,其中一些键具有大数字作为值,我想将它们传递给我的视图和显示。问题是他们正在四舍五入,这是我不想要的。实际上它来自我现在正在做的缓冲区:

JSON.parse(res.body.toString()) // res.body is a Buffer

并发送查看。如何以字符串的形式保留整个数字并将其发送到视图,以便 UI 可以使用完全相同的数字。

我认为可能是一个替代品会有所帮助,但它也不起作用。

const replacer = (key, value) => {
    if (typeof value === 'number') {
        return JSON.stringify(value);
    }
    return value;
};

//78787878977987787897897897123456786747398
const obj = {
    name: 'John',
    income: 78787878977987787897897897123456786747398,
    car: null
};

var buf = Buffer.from(JSON.stringify(obj));
console.log(buf.toString());
// console.log(JSON.stringify(buf.toString()))

// console.log('func res: ', replacer('key', 78787878977987787897897897123456786747398))
// console.log(obj.income.toString())
console.log(JSON.stringify(obj, replacer));

您可以推荐一些外部受信任的库,或者更好的是,仅通过直接代码向我推荐解决方案

编辑:

简而言之,结果是:String在从服务器返回之前将响应转换为。一旦它进入 JS(Buffer在我的例子中),转换就已经发生了,这意味着从应用程序端,没有什么可以检索它。

如果不修改服务器响应,请告诉我是否有真正的解决方案。

标签: javascriptnode.jsnumber-formatting

解决方案


不幸的是,该数字高于 max_safe_integer,因此如果它解析为数字,即使稍后将其转换回字符串(例如使用reviver函数,第二个参数为JSON.parse),它也不可靠。但幸运的是,由于您有一个 JSON 字符串,您可以在ingreplace之前将数值与字符串值一起使用。JSON.parse例如:

const resBody = '{"foo":"bar", "objs":[{"name":"John", "income": 78787878977987787897897897123456786747398}]}';
const resBodyReplaced = resBody.replace(/: *(\d+)/g, ':"$1"');
console.log(JSON.parse(resBodyReplaced).objs[0].income);


推荐阅读