如何用逗号而不是点对价格进行四舍五入?

How to round of prices with comma's instead of dots?

提问人:jiggy1965 提问时间:5/20/2019 更新时间:5/20/2019 访问量:924

问:

在荷兰,我们在数字中使用逗号,而在其他国家/地区则使用点。例如,我们使用 39,99,在其他国家/地区使用 39.99。

在带有价格的提要中,我们会使用逗号来获得价格,但是我无法将它们用作数字并将它们四舍五入逗号后面(或点后面)两位数。

var num1 = "39,1234";
var num = parseInt(num1);
var n = num.toFixed(2);
console.log(n);

这是一个这样的数字。我希望它能得到 39,12。他们的想法是首先将它用作字符串。然后将该字符串转换为一个数字,并使用 toFixed 将其四舍五入为两个数字。但它的结果是 39,00 而不是 39,12。

也许我想错了,我应该使用其他方式使 39,1234 被视为 39.1234,以便将其正确四舍五入为一个数字?

如何使用 39,1234 作为数字 39,1234 而不是字符串?这样我就不必通过提要并在所有价格中首先用点替换逗号?

JavaScript的

答:

3赞 chatnoir 5/20/2019 #1

编辑:正则表达式版本

早些时候我没有意识到 OP 最初希望它恢复为“xx,xx”格式。这是一个更优雅的解决方案:

var num1 = "39,1234";

let n = num1.replace(/(?<=,\d{2})(\d*)$/,"");

console.log(n); //32,12

正则表达式解释:

(?<=,\d){2}开始后跟数字的 lookbehind 匹配,其中 2 个。Lookbehind 匹配不会被替换。,\d{2}

(\d*)$当我们找到 lookbehind 模式时,我们匹配更多的数字,所有这些数字,直到我们到达字符串的末尾。这是将被替换的比赛。\d*$

原创解决方案

你想要的是:

var num1 = "39,1234";

var n = parseFloat(num1.replace(",",".")).toFixed(2);
console.log(n); //39.12

// replaces it back to ",", but now it's a string!
n = n.replace(".",",")

console.log(n); //39,12

解释:

  1. 首先将“,”替换为“.”replace()

  2. 转换为浮点数(非整数)parseFloat()

  3. 设置为小数点后 2 位,使用.toFixed(2)

  4. 将“.”改为“,”。但现在它是一根绳子!

注意:如果货币值包含千分隔符,这将不起作用。例如“40.200,1576”。如果是这种情况,请添加另一行以去除分隔符,然后再将其传递到该行。.num1 = num1.replace(".","")parseFloat(...)

评论

0赞 jiggy1965 5/20/2019
当它起作用时,它会输出 39.12。然后我可以再次用逗号输出 39,12 吗?
0赞 chatnoir 5/20/2019
只是想让你知道我已经用一个更优雅的正则表达式解决方案更新了答案。
0赞 Chanaka Weerasinghe 5/20/2019 #2

试试这个

comdecimal= num1.replace(".","")
alert(comdecimal);
dotdecimal= comdecimal.replace(",",".") 
alert(dotdecimal); 
dotdecimal = Math.round(dotdecimal* 100) / 100;
alert(dotdecimal);

评论

0赞 VLAZ 5/20/2019
这可能会失败"1.039,1234"
0赞 Tamir Nakar 5/20/2019 #3

由于您使用的是货币,因此我建议使用 JS ES6 指定的 NumberFormat 功能。您的代码应如下所示,并且易于重用:

const formatter = new Intl.NumberFormat('nl-NL', {
  style: 'currency',
  currency: 'EUR',
  minimumFractionDigits: 2
});


console.log(formatter.format('145,53'.replace(',','.')));
//"€ 145,53" 

评论

0赞 VLAZ 5/20/2019
这是相反的问题(至少最初是这样) - OP 想要获取格式化的数字并读取它,然后再次格式化地输出它。
0赞 Tamir Nakar 5/20/2019
你说得对,我编辑了它,所以它得到了带有“,”的输入。