Regex格式字符串数字与逗号和2个小数在javascript

regex format string number with commas and 2 decimals in javascript

本文关键字:2个 小数 javascript 格式 字符串 数字 Regex      更新时间:2023-09-26

我有一个字符串n,这是一个数字。下面的代码在需要的地方添加了逗号,但我还想更改小数的数量。在适当的地方也应该四舍五入。

var parts = n.split(".");
var num = parts[0].replace(/'B(?=('d{3})+(?!'d))/g, ",") + (parts[1] ? "." + parts[1] : "");

这将像1234.567这样的数字变成1,234.567。但我需要我的数字看起来像:1,234.57

我试着把parts[1]转换成一个数字,然后四舍五入,然后把它连接回来;但这很容易出错。

我如何通过改变我的正则表达式得到这个结果?谢谢。

编辑:2019年9月18日,

由于新的api可用,我认为指出您可以使用toLocaleString选项更简单地完成此操作会有所帮助:

const numbers = [1, 1000, 2345.67, 21589.334719999995];
const options = { 
  minimumFractionDigits: 2,
  maximumFractionDigits: 2 
};
numbers.forEach(num => {
  const formatted = Number(num).toLocaleString('en', options);
  console.log(formatted);
});


原始回答

要添加逗号,您可以使用:
n = parseFloat(n).toFixed(2)
var withCommas = Number(n).toLocaleString('en');

这里是小提琴

var val = Math.round(Number(n) *100) / 100;
var parts = val.toString().split(".");
var num = parts[0].replace(/'B(?=('d{3})+(?!'d))/g, ",") + (parts[1] ? "." + parts[1] : "");

你可以直接使用toFixed

var parts = (+n).toFixed(2).split(".");
var num = parts[0].replace(/'B(?=('d{3})+(?!'d))/g, ",") + (+parts[1] ? "." + parts[1] : "");

小提琴

这也会将1234.0000转换为1234.00,但您可以通过转换为三进制中的数字来避免这种情况,因为零是假的

我认为这是有用的

var n=1234.567
var parts = n.toFixed(2).split(".");
var num = parts[0].replace(/('d)(?=('d{3})+(?!'d))/g, "$1,") + 
    (parts[1] ? "." + parts[1] : "");
console.log(num);

如果您想要1,234.567的结果,则将toFixed(2)更改为toFixed(3)

var valueString="1500"; //can be 1500.0 or 1500.00 
var amount=parseFloat(valueString).toFixed(2);
var formattedString= amount.toString().replace(/'B(?=('d{3})+(?!'d))/g, ",");
console.log(formattedString); //outputs 1,500.00

当涉及到在JavaScript中格式化货币时,toLocaleString是很棒的。您不需要将其与toFixed结合使用,并且在某些情况下(整数,带有个位数分数的数字)将不起作用。下面是一个示例函数:

const formatCurrency = (num, locale = 'en-US', currency = 'USD', minimumFractionDigits = 2) => {
    if (isNaN(num)) {
        return num;
    }
  return num.toLocaleString(locale, {style: 'currency', currency, minimumFractionDigits});
};

没有超自定义字符串格式模式,也没有在特定场景下工作的链式方法。

下面是一个例子

通过转换为三进制中的数字来避免这种情况,因为零是假的

n = parseFloat(n).toFixed(2)
var withCommas = Number(n).toLocaleString('en');
withCommas = (withCommas.indexOf(".")== -1) ? `${withCommas}.00` : withCommas;

添加到@Rob M的答案(最小和最大2dp):

function getMe2DecimalPointsWithCommas(amount) {
    return Number(amount).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}

我认为这是用不同的区域设置格式化数字的简单方法

const NumberFormatter = (value, decimal) => {
  return parseFloat(parseFloat(value).toFixed(decimal)).toLocaleString(
    "en-IN",
    {
      useGrouping: true,
    }
  );};

代替"en-IN"您可以指定语言。比如"ja-JP"、"en-US"answers"de-DE"等等。它将根据区域设置对数字和符号进行分组。

Ref: Format Numbers