原生BigInt和Intl.NumberFormat用于准确的货币计算和显示?

时间:2018-08-23 10:29:33

标签: javascript google-chrome bigint currency-formatting

您可能知道,FutureBuilder在JavaScript中。处理金钱时精度有限可能会成为问题。为了克服这个问题,可以使用BigInt,它显然需要整数值。

不是以美元为基本单位,而是以美分作为十进制小数(例如¢10的0.1 + 0.2 == 0.30000000000000004),则很容易使用分作为基础单位(¢10的0.10),使其成为仅整数

但是,当呈现给用户时,您可能希望以美元而不是美分显示价值。但是您不能将10除以BigInt

Number

另一方面,Intl.NumberFormat似乎也没有提供执行此操作的方法。那么,您能做什么呢?

基于10的简单方法是在数字字符串的位置-2处插入一个句点并将其传递给格式化程序:

> BigInt(10) / 100
Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions

这是要走的路吗?有更好的解决方案吗?

我知道let formatter = Intl.NumberFormat("en-US", { style: "currency", currency: "USD" }) let s = (BigInt(10) + BigInt(20)).toString() // "30" s = s.padStart(2, "0") // zero-pad single digit (if input 0..9) s = s.slice(0, -2) + "." + s.slice(-2) // ".30" formatter.format(s) // "$0.30" 也会由于舍入而产生format(0.30000000000000004),但这是关于BigInt + UI的一个普遍问题。

1 个答案:

答案 0 :(得分:0)

如错误消息所述,将您的BigInt明确转换为Number。不要像这样做那样使用中间字符串:

let toDisplayValue = n => Number(n) / 100;

console.log(toDisplayValue(BigInt(1234567)));
console.log(toDisplayValue(BigInt(45)));