使用撇号作为千位分隔符格式化数字

时间:2016-11-03 10:49:41

标签: javascript regex

我有这样提供的API编号774317,我必须将其转换为此值774' 317.00,所以如果还有2个小数,则应该像这样用句号分隔

77431745 => 774'317.45

根据这个回答https://stackoverflow.com/a/2901298/3918577我将它分成几千个(所以它将其格式化为774 317),但最后2位小数对我来说是问题,因为我不是很好RegEX.Below是我用于此

的代码
convertMonetary(value) {
  return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, "'")
}

3 个答案:

答案 0 :(得分:1)

最后两位数小数且需要添加.00并且 <时,问题并不是非常明确的/ em>最后两位小数,只需要在正确的地方添加.

以下代码假设 6 或更少的数字,需要添加.00,否则最后2位数字被视为小数,并添加.

当你运行它时,前两行是你的示例数据,下面两行是我在数字之前添加1的示例,以演示如何处理这些长度的数量。

&#13;
&#13;
function convertMonetary(inp) {
  return inp.replace(/^(\d*?\d{1,6})(\d{2})?$/, function(m, whole, dec) {
    return whole.replace(/\B(?=(\d{3})+(?!\d))/g, "'") + ((dec!=undefined)?'.'+dec:'.00');
  });
}

document.getElementById('outp').value = 
  '77431745  => ' + convertMonetary('77431745') + '\n' +
  '774317    => ' + convertMonetary('774317') + '\n\n' +
  '177431745 => ' + convertMonetary('177431745') + '\n' +
  '1774317   => ' + convertMonetary('1774317')
&#13;
<textarea id="outp" rows="10" style="width:100%"></textarea>
&#13;
&#13;
&#13;

为了解释为什么正则表达式是这样的:

(\d*?\d{1,6})乍一看可能没什么意义,为什么不做\d+。问题是后者{1,6}的{​​{1}}量词是贪婪的,第一个\d量词\d不是,这使得*?只有当一行中有超过6位数时才匹配。

答案 1 :(得分:0)

根据@Aaron的建议,问题是固定的。

我在执行RegEx之前使用了toFixed(),并且将值除以1,代码在下面。

convertMonetary(value) {
    let val = (value/1).toFixed(2)
    return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, "'")
}

谢谢。

答案 2 :(得分:0)

在瑞士国家/地区代码( de-CH )中使用 toLocaleString(),这是一个示例实用程序:

export const formatNumber = (x, places = 2, country = 'de-CH') => {
  return Number(x || 0).toLocaleString(country, {
    maximumFractionDigits: places,
    minimumFractionDigits: places,
  });
};