javascript - 将 `Intl.NumberFormat` 与 `maximumFractionDigits` 和 `maximumSignificantDigits` 一起使用

标签 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 约束。这是怎么回事?考虑到这个约束在浏览器中被忽略,这似乎符合规范,但我想不出一个原因。

最佳答案

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

The following properties fall into two groups: minimumIntegerDigits, minimumFractionDigits, and maximumFractionDigits in one group, minimumSignificantDigits and maximumSignificantDigits in the other. If at least one property from the second group is defined, then the first group is ignored.

必须有一些覆盖行为来处理属性设置冲突,但在您的示例中,人们可能有理由希望覆盖行为不是完全或全无(因为对小数位数限制的调整落在指定范围内有效数字)。不幸的是,如果设置了有效数字属性,规范只是忽略任何小数或整数数字限制。

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

const sigDigits = (n, min, max, minf, maxf) => {
  let num = new Intl.NumberFormat('en-US', {
    minimumSignificantDigits: min,
    maximumSignificantDigits: max
  })
  .format(n);
  
  num = new Intl.NumberFormat('en-US', {
    minimumFractionDigits: minf,
    maximumFractionDigits: maxf
  })
  .format(num);
  
  return num;
};

const result = sigDigits(10.123456789, 1, 3, 0, 0);
console.log(result);
// 10

关于javascript - 将 `Intl.NumberFormat` 与 `maximumFractionDigits` 和 `maximumSignificantDigits` 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55834596/

相关文章:

api - 您如何在Google Visualization Chart API中设置百分比?

Java/Android - 设置 DecimalFormat 以仅显示尾数

java - 在车队管理应用程序中使用 node.js

javascript - 如何在 Klaviyo 中将数字转换为逗号分隔值

javascript - 为什么错误边界没有在 react 组件中触发?

javascript - ng-class 在 AngularJS 中不起作用

ios - 货币符号和值之间的间距 : iOS swift 3

Objective-C:将数字格式化为序数:1, 2, 3, .. to 1st, 2nd, 3rd

javascript - 深度对象的 getPathValue() 函数

javascript - 在 Ember.js Handlebar 模板表达式中呈现动态生成的 {{link-to}} 链接