【问题标题】:Default rounding strategy in Intl.NumberFormat.prototype.format()Intl.NumberFormat.prototype.format() 中的默认舍入策略
【发布时间】:2021-02-13 06:03:02
【问题描述】:

我想了解在使用 Intl.NumberFormat.prototype.format() 时隐式发生的小数舍入行为。格式化函数的 MDN 文档缺少对该行为的清晰描述。

我们以下面这段代码为例:

const amount = 654321.985;
const formattedAmount = new Intl.NumberFormat('en-EN', {
    style: 'currency',
    currency: 'EUR',
}).format(amount);

console.log(formattedAmount); // => €654,321.99

这种情况下的舍入策略是什么,它取决于什么?我认为这涉及到许多因素,例如浏览器、区域设置和货币,但找不到对此的确认。

在玩弄了这个样本之后,我可以看到小数部分向上取整,然后向下取整,即 .9849 变为 .98。该策略似乎遵循nearest integer, ties to even 规则。同时,我知道考虑到ECMAScript specification,逻辑可能会更复杂。

【问题讨论】:

    标签: javascript ecmascript-6 decimal


    【解决方案1】:

    来自 MDN 示例,见下文:

    Intl.NumberFormat('en-EN', {
        style: 'currency',
        currency: 'EUR',
    }).resolvedOptions()
    
    // properties
    currency: "EUR"
    currencyDisplay: "symbol"
    currencySign: "standard"
    locale: "en"
    maximumFractionDigits: 2
    minimumFractionDigits: 2
    minimumIntegerDigits: 1
    notation: "standard"
    numberingSystem: "latn"
    signDisplay: "auto"
    style: "currency"
    useGrouping: true
    __proto__: Object
    

    您在第 13.2 和 13.3 节中提供的 TC39 文档似乎提供了很多信息:

    // typing Intl.NumberFormat in console results takes you nowhere, but
    // typing `Intl.NumberFormat.prototype` in console results in:
    constructor: ƒ NumberFormat()
    format:
    formatToParts: ƒ formatToParts()
    resolvedOptions: ƒ resolvedOptions()
    Symbol(Symbol.toStringTag): "Intl.NumberFormat"
    get format: ƒ format()
    

    13.3.3 内部插槽:

    必须是必须包含子字符串“{number}”的字符串值。 "positivePattern" 必须包含子字符串 "{plusSign}" 但不能 "{减号}";

    图案的形状似乎是 positivePattern = "{plusSign}{number}"

    也在13.4.5 Intl.NumberFormat.prototype.resolvedOptions ( ):

    [[MinimumIntegerDigits]]    "minimumIntegerDigits"
    [[MinimumSignificantDigits]]    "minimumSignificantDigits"
    [[MaximumSignificantDigits]]    "maximumSignificantDigits"
    

    另外,别忘了查看 MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat

    【讨论】:

      猜你喜欢
      • 2021-05-05
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多