请将Intl.NumberFormat与maximumFractionDigits和maximumSignificantDigits一起使用

时间:2019-04-24 16:23:24

标签: javascript number-formatting

运行时

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

我希望输出为10。出于某种原因,它输出10.1,这打破了maximumFractionDigits: 0约束。这是怎么回事?考虑到所有浏览器都忽略了此约束,看来这是符合规范的,但我只是无法确定其原因。

1 个答案:

答案 0 :(得分:1)

Intl.NumberFormat parameter descriptions中(添加了重点):

  

以下属性分为两组:minimumIntegerDigits,   minimumFractionDigitsmaximumFractionDigits在一组中,   minimumSignificantDigitsmaximumSignificantDigits中的另一个。 如果   至少定义了第二组中的一个属性,然后是第一个   组将被忽略。

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

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

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