Intl.NumberFormat 0或2个小数位

alt*_*alt 10 javascript

我的格式化程序看起来像这样

const formatter = new Intl.NumberFormat('en-NZ', {
  style: 'currency',
  currency: 'NZD',
  minimumFractionDigits: 2,
});
Run Code Online (Sandbox Code Playgroud)

如何调整此值以使整数具有0小数位数

formatter.format(4); // want output "$4"
Run Code Online (Sandbox Code Playgroud)

分数总是显示两位数?

formatter.format(4.1); // want output "$4.10"
Run Code Online (Sandbox Code Playgroud)

crt*_*tag 24

The correct way to do it when using Intl.NumberFormat is to set both maximumFractionDigits and minimumFractionDigits options in constructor while validating input value using a modulo % for a whole number (per /sf/answers/3480721051/ which is a CORRECT answer!). The accepted answer is sort of string manipulation.

const fraction = new Intl.NumberFormat('en-NZ', {
  style: 'currency',
  currency: 'NZD',
  minimumFractionDigits: 0,
  maximumFractionDigits: 0,
});

const formatter = new Intl.NumberFormat('en-NZ', {
  style: 'currency',
  currency: 'NZD',
  minimumFractionDigits: 2,
});

let number = 4.1;
  if(number % 1 == 0)
console.log(fraction.format(number));
  else
console.log(formatter.format(number));

number = 4;
  if(number % 1 == 0)
console.log(fraction.format(number));
  else
console.log(formatter.format(number));
Run Code Online (Sandbox Code Playgroud)

  • @Acidic9 你是否尝试只使用“maximumFractionDigits”?我发现它给出了一个错误,你不能同时使用两者。 (2认同)

Ger*_*NCO 20

我会实现两种不同的格式并使用模数验证它 %

4 % 1 == 0
4.1 % 1 == .1
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)

4 % 1 == 0
4.1 % 1 == .1
Run Code Online (Sandbox Code Playgroud)

  • 似乎是最安全的选择 (2认同)
  • 确实如此,您可以尝试编辑代码段上的“数字”以查看功能 (2认同)

yod*_*duh 9

2023 答案

如果小数位全为零,则可以使用新Intl.NumberFormat选项TrailingZeroDisplay来去除小数位,否则将使用最小和最大小数位选项。这复制了使用两个格式化程序和仅一个格式化程序的答案的行为

const formatter = new Intl.NumberFormat('en-NZ', {
  style: 'currency',
  currency: 'NZD',
  minimumFractionDigits: 2,
  maximumFractionDigits: 2,
  trailingZeroDisplay: 'stripIfInteger'
});
Run Code Online (Sandbox Code Playgroud)
formatter.format(4); // outputs "$4"
formatter.format(4.0); // outputs "$4"
formatter.format(4.1); // outputs "$4.10"
formatter.format(4.145); // outputs "$4.15"
Run Code Online (Sandbox Code Playgroud)


ksh*_*ine 6

您可以尝试这样的事情:

formatter.format(amount).replace(/\D00$/, '');
Run Code Online (Sandbox Code Playgroud)

  • 所提出的解决方案在某些区域设置中不起作用,在这种区域设置中,格式化程序会附加而不是附加货币代码/符号。例如,`sk`语言环境和`EUR`货币产生`12,50€`。另外,您需要考虑不同的分数分隔符(逗号,点)。在这种情况下,您可以使用[formatToParts](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/formatToParts)代替产生数组的`format`方法每个片段都有唯一标识的地方。然后,您需要做的就是有条件地过滤掉“ fraction”和“ decimal”片段。 (2认同)

小智 6

当我研究这个时,我在 Github 上发现了一篇关于它的帖子,建议同时使用 maximumFractionDigits 和 minimumFractionDigits。文章指出,如果两者都没有使用,则会引发错误。

// works
var Intl = require('intl');
new Intl.NumberFormat("en", { 
  maximumFractionDigits: 0, 
  minimumFractionDigits: 0, 
  style: 'currency', 
  currency: 'USD'
}).format(4000.33)
Run Code Online (Sandbox Code Playgroud)

https://github.com/ember-intl/ember-intl/issues/167