javascript Intl. Number设置0或两个小数位的格式

qvtsj1bj  于 2023-09-29  发布在  Java
关注(0)|答案(6)|浏览(102)

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

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

我怎样才能调整它,使整数有0个小数位

formatter.format(4); // want output "$4"

而分数总是显示两位数

formatter.format(4.1); // want output "$4.10"
igetnqfo

igetnqfo1#

使用Intl.NumberFormat时,正确的方法是在构造函数中设置 maximumFractionDigitsminimumFractionDigits 选项,同时使用整数的模%验证输入值(每个https://stackoverflow.com/a/49724586/1362535这是正确的答案!)。公认的答案是某种字符串操作。

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));
jobtbby3

jobtbby32#

你可以试试这样的东西:

formatter.format(amount).replace(/\D00$/, '');

更新:
作为对@Marek几个月后的评论的回应,上面的正则表达式已经处理了不同的十进制符号(.,),但它确实不处理尾随的货币符号。可以这样修复:

formatter.format(amount).replace(/\D00(?=\D*$)/, '');
qgzx9mmu

qgzx9mmu3#

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

4 % 1 == 0
4.1 % 1 == .1

希望这对你有帮助:)

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

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


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));
xxslljrj

xxslljrj4#

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

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

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

zynd9foi

zynd9foi5#

**更新:请看@yoduh的答案,我的答案并没有完全回答这个问题。

现在看来,最简单的方法是简单地将“minimumFractionDigits”设置为0,将“maximumFractionDigits”设置为2,就像这样:

const formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'usd',
  maximumFractionDigits: 2,
  minimumFractionDigits: 0,
}); 

console.log('No decimals: ', formatter.format(1000));
console.log('Decimals: ', formatter.format(999.99));
velaa5lx

velaa5lx6#

2023答案

一个新的Intl.NumberFormat选项尾随ZeroDisplay可用于剥离分数数字 * 如果 * 分数数字都是零,否则将使用最小和最大分数数字选项。这将使用两个格式化程序和一个格式化程序复制答案的行为

const formatter = new Intl.NumberFormat('en-NZ', {
  style: 'currency',
  currency: 'NZD',
  minimumFractionDigits: 2,
  maximumFractionDigits: 2,
  trailingZeroDisplay: 'stripIfInteger'
});
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"

相关问题