代码之家  ›  专栏  ›  技术社区  ›  David Mulder

同时将'intl.numberFormat'与'maximumFractionDigits'和'maximumSignificantDigits'一起使用

  •  0
  • David Mulder  · 技术社区  · 5 年前

    运行时

    console.log(new Intl.NumberFormat('en-US', {
      minimumFractionDigits: 0,
      maximumFractionDigits: 0,
      maximumSignificantDigits: 3,
      minimumSignificantDigits: 1 
    }).format(10.123456789));

    我希望产量 10 . 相反,由于某种原因,它输出 10.1 它打破了 maximumFractionDigits: 0 约束。发生什么事?考虑到这个限制在浏览器中被忽略了,这似乎是根据规范的,但我无法掩饰其原因。

    0 回复  |  直到 5 年前
        1
  •  1
  •   benvc    5 年前

    来自 Intl.NumberFormat parameter descriptions (增加了重点):

    以下属性分为两组: minimumIntegerDigits , minimumFractionDigits maximumFractionDigits 在一组中, minimumSignificantDigits maximumSignificantDigits 另一个。 如果 定义第二个组中的至少一个属性,然后定义第一个 组被忽略。

    必须有一些重写行为来处理属性设置冲突,但是在您的示例中,您可能会合理地希望重写行为不是全部或全部都是空的(因为对小数位数限制的调整在有效位数的指定范围内s)。不幸的是,如果设置了有效数字属性,那么规范只是忽略小数或整数的任何限制。

    如果有人来找一种方法,利用这两种类型的属性来格式化一个数字,下面是一个非常基本的例子,连续使用这两个构造函数(注意,这会很快变得混乱,格式要求更复杂)。

    const sigDigits = (n, min, max, minf, maxf) => {
      let x = new Intl.NumberFormat('en-US', {
        minimumSignificantDigits: min,
        maximumSignificantDigits: max
      }).format(n);
      return new Intl.NumberFormat('en-US', {
        minimumFractionDigits: minf,
        maximumFractionDigits: maxf
      }).format(x);
    }
    
    let result = sigDigits(10.123456789, 1, 3, 0, 0);
    console.log(result);
    // 10