如何使用 Javascript 将货币字符串转换为双精度值?

IT技术 javascript jquery
2021-02-06 22:27:53

我有一个文本框,里面有一个货币字符串,然后我需要将该字符串转换为双精度值以对其执行一些操作。

"$1,100.00"1100.00

这需要在所有客户端发生。我别无选择,只能将货币字符串作为货币字符串作为输入,但需要将其强制转换/转换为 double 以允许进行一些数学运算。

6个回答

删除所有非点/数字:

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));
请记住,这取决于语言环境,因为其他语言环境使用“,”表示小数(例如 1.100,00€)。其他一些语言环境甚至每组使用不同的标准位数(如 3 位小数)。
2021-03-12 22:27:53
另请记住,某些会计应用程序将数字括在括号中以表示负值。例如:($5.00) = -$5.00
2021-03-15 22:27:53
我知道我在这里回复可能晚了几年,但如果“货币 = 0”,你也需要小心。你会得到一个 javascript 错误,说currency.replace 不是一个函数。我只是添加了一个简单的检查是否货币 = 0 以避免这种情况。
2021-03-15 22:27:53
似乎这只适用于有.00尾随的地方。否则有效的货币表示,例如“$1100”和“$1100”。将减少两个数量级。
2021-03-26 22:27:53
为了处理字符串中的负数,我在要接受的字符列表中添加了一个“-”,即 .replace(/[^0-9-\.]+/g, "")
2021-03-26 22:27:53

会计.js是要走的路。我在一个项目中使用过它,使用它的经验非常好。

accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
accounting.unformat("€ 1.000.000,00", ","); // 1000000

你可以在GitHub 上找到它

更新:那个库有 71 个未解决的问题,并且在 5 个月内没有被编辑,所以我不相信它。github.com/openexchangerates/accounting.js/issues
2021-03-28 22:27:53

使用正则表达式去除格式(美元和逗号),并使用 parseFloat 将字符串转换为浮点数。`

var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;
+ .05为了什么?
2021-03-16 22:27:53
值得注意的是,在添加货币时,您不应该对任何非“玩具”应用程序使用浮动。您最终将得到准确的总数。
2021-04-08 22:27:53
当 parseFloat("151.20" * 100) 给你 15119.999999999998 但 parseFloat("151.40" * 100) 给你 15140 时,你会感到惊讶和不高兴。永远不要使用 parseFloat 来赚钱。使用特定的库来处理金钱,例如accounting.js 或这里建议的任何其他库。
2021-04-09 22:27:53

我知道这是一个老问题,但想提供一个额外的选择。

jQuery Globalize 能够将特定于文化的格式解析为浮点数。

https://github.com/jquery/globalize

给定字符串“$13,042.00”,并将 Globalize 设置为 en-US:

Globalize.culture("en-US");

您可以像这样解析浮点值:

var result = Globalize.parseFloat(Globalize.format("$13,042.00", "c"));

这会给你:

13042.00

并允许您与其他文化一起工作。

我知道这是一个老问题,但 CMS 的答案似乎有一个小小的缺陷:它仅在货币格式使用“.”时才有效。作为小数点分隔符。例如,如果您需要使用俄罗斯卢布,字符串将如下所示:“1 000,00 rub”。

我的解决方案远不如 CMS 优雅,但它应该可以解决问题。

var currency = "1 000,00 rub."; //it works for US-style currency strings as well
var cur_re = /\D*(\d+|\d.*?\d)(?:\D+(\d{2}))?\D*$/;
var parts = cur_re.exec(currency);
var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00'));
console.log(number.toFixed(2));

假设:

  • 货币值使用十进制表示法
  • 字符串中没有不属于货币value的数字
  • 货币值的小数部分包含 0 或 2 位数字 *

regexp 甚至可以处理诸如“1,999 美元和 99 美分”之类的事情,尽管它不是预期的功能,不应依赖它。

希望这会帮助某人。

@sheavens 感谢您报告它。抱歉这么晚才修复它,但新版本实际上也适用于这些金额。
2021-03-17 22:27:53
这是非常糟糕和危险的,这将小于 10 的数字乘以 100。我在用它测试所有数字之前愚蠢地使用了它:(
2021-03-21 22:27:53
谢谢你。最佳答案。简单而强大。我会将它与 (\D*)(\d.*?\d)(?:\D+(\d{2}|-))?(\D*)$ 一起使用来获取货币和 - 用于美分。所以你也可以解析像 1.000,- € 这样的字符串。货币将在parts[1] 或part[4] 中,part[3] 包括美分作为数字或-。比你可以像你想要的那样规范化字符串。
2021-04-10 22:27:53