我有这样提供的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, "'")
}
答案 0 :(得分:1)
当 最后两位数不小数且需要添加.00
并且 <时,问题并不是非常明确的/ em>最后两位是小数,只需要在正确的地方添加.
。
以下代码假设 6 或更少的数字,需要添加.00
,否则最后2位数字被视为小数,并添加.
当你运行它时,前两行是你的示例数据,下面两行是我在数字之前添加1
的示例,以演示如何处理这些长度的数量。
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;
为了解释为什么正则表达式是这样的:
(\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,
});
};