如何使用 Javascript 将货币字符串转换为双精度?
Posted
技术标签:
【中文标题】如何使用 Javascript 将货币字符串转换为双精度?【英文标题】:How to convert a currency string to a double with Javascript? 【发布时间】:2009-02-17 22:57:55 【问题描述】:我有一个文本框,其中包含一个 currency 字符串,然后我需要将该字符串转换为双精度字符串以对其执行一些操作。
"$1,100.00"
→ 1100.00
这需要发生在所有客户端。我别无选择,只能将 currency 字符串作为 currency 字符串作为输入,但需要将其转换/转换为双精度以允许进行一些数学运算。
【问题讨论】:
【参考方案1】:删除所有非点/数字:
var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));
【讨论】:
这似乎只适用于有.00
尾随的情况。否则,货币的有效表示,例如“$1100”和“$1100”。将减少两个数量级。
请记住,这取决于语言环境,因为其他语言环境使用 ',' 表示小数(例如 1.100,00€)。其他一些语言环境甚至每组使用不同的标准位数(如 3 位小数)。
为了处理字符串中的负数,我在要接受的字符列表中添加了一个“-”,即 .replace(/[^0-9-\.]+/g, "" )
另外请记住,一些会计应用程序将数字括在括号中以表示负值。例如:($5.00) = -$5.00
如果您的货币是巴西货币,这将不起作用,因为它们使用“,”分隔符。【参考方案2】:
使用正则表达式去除格式(美元和逗号),并使用 parseFloat 将字符串转换为浮点数。`
var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;
【讨论】:
值得注意的是,在添加货币时,您不应将浮点数用于任何非“玩具”应用程序。您最终会得到不确切的总数。 当 parseFloat("151.20" * 100) 给你 15119.999999999998 但 parseFloat("151.40" * 100) 给你 15140 时,你会感到惊讶和不高兴。永远不要使用 parseFloat 来赚钱。使用特定的库来处理金钱,例如 accounting.js 或此处建议的任何其他库。+ .05
是干什么用的?【参考方案3】:
accounting.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【参考方案4】:我知道这是一个老问题,但想提供一个额外的选择。
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
并允许您与其他文化合作。
【讨论】:
【参考方案5】:我知道这是一个老问题,但 CMS 的答案似乎有一个小小的缺陷:它只有在货币格式使用“。”时才有效。作为小数分隔符。 例如,如果您需要使用俄罗斯卢布,则字符串将如下所示: “1 000,00 卢布。”
我的解决方案远没有 CMS 的优雅,但它应该可以解决问题。
var currency = "1 000,00 rub."; //it works for US-style currency strings as well
var cur_re = /\D*(\d+|\d.*?\d)(?:\D+(\d2))?\D*$/;
var parts = cur_re.exec(currency);
var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00'));
console.log(number.toFixed(2));
假设:
货币值使用十进制表示法 字符串中没有不属于货币值的数字 货币值的小数部分包含 0 位或 2 位数字 *正则表达式甚至可以处理诸如“1,999 美元和 99 美分”之类的东西,尽管它不是预期的功能,也不应该依赖它。
希望这会对某人有所帮助。
【讨论】:
谢谢。最佳答案。简单而强大。我会将它与 (\D*)(\d.*?\d)(?:\D+(\d2|-))?(\D*)$ 一起使用来获取货币和 - 获取美分。所以你也可以解析像 1.000,- € 这样的字符串。货币将在part[1] 或part[4] 中,part[3] 包括美分作为数字或-。比你可以像你想要的那样规范化字符串。 这是非常糟糕和危险的,它将小于 10 的数字乘以 100。我在用它测试所有数字之前愚蠢地使用了它:( @sheavens 感谢您的报告。抱歉这么晚才修复它,但新版本实际上也适用于这些金额。【参考方案6】:这个例子运行正常
var currency = "$1,123,456.00";
var number = Number(currency.replace(/[^0-9\.]+/g,""));
console.log(number);
【讨论】:
【参考方案7】:// "10.000.500,61 TL" price_to_number => 10000500.61
// "10000500.62" number_to_price => 10.000.500,62
JS FIDDLE:https://jsfiddle.net/Limitlessisa/oxhgd32c/
var price="10.000.500,61 TL";
document.getElementById("demo1").innerhtml = price_to_number(price);
var numberPrice="10000500.62";
document.getElementById("demo2").innerHTML = number_to_price(numberPrice);
function price_to_number(v)
if(!v)return 0;
v=v.split('.').join('');
v=v.split(',').join('.');
return Number(v.replace(/[^0-9.]/g, ""));
function number_to_price(v)
if(v==0)return '0,00';
v=parseFloat(v);
v=v.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
v=v.split('.').join('*').split(',').join('.').split('*').join(',');
return v;
【讨论】:
【参考方案8】:这是我的功能。适用于所有货币..
function toFloat(num)
dotPos = num.indexOf('.');
commaPos = num.indexOf(',');
if (dotPos < 0)
dotPos = 0;
if (commaPos < 0)
commaPos = 0;
if ((dotPos > commaPos) && dotPos)
sep = dotPos;
else
if ((commaPos > dotPos) && commaPos)
sep = commaPos;
else
sep = false;
if (sep == false)
return parseFloat(num.replace(/[^\d]/g, ""));
return parseFloat(
num.substr(0, sep).replace(/[^\d]/g, "") + '.' +
num.substr(sep+1, num.length).replace(/[^0-9]/, "")
);
用法:toFloat("$1,100.00")
或 toFloat("1,100.00$")
【讨论】:
【参考方案9】:你可以试试这个
var str = "$1,112.12";
str = str.replace(",", "");
str = str.replace("$", "");
console.log(parseFloat(str));
【讨论】:
这会失败,例如 "$1,000,000.00" -> 1000 - 需要使用正则表达式替换字符串中的所有匹配项【参考方案10】:我知道您已经找到了问题的解决方案,我只是想建议您看看以下更广泛的国际数字格式 jQuery 插件:
International Number Formatter
【讨论】:
【参考方案11】:对于在 2021 寻找解决方案的任何人,您可以使用 Currency.js。
经过大量研究,这是我发现的最可靠的生产方法,到目前为止我没有任何问题。此外,它在 Github 上非常活跃。
currency(123); // 123.00
currency(1.23); // 1.23
currency("1.23") // 1.23
currency("$12.30") // 12.30
var value = currency("123.45");
currency(value); // 123.45
【讨论】:
【参考方案12】:jQuery.preferCulture("en-IN");
var price = jQuery.format(39.00, "c");
输出为:卢比。 39.00
use jquery.glob.js,
jQuery.glob.all.js
【讨论】:
【参考方案13】:let thousands_seps = '.';
let decimal_sep = ',';
let sanitizeValue = "R$ 2.530,55".replace(thousands_seps,'')
.replace(decimal_sep,'.')
.replace(/[^0-9.-]+/, '');
// Converting to float
// Result 2530.55
let stringToFloat = parseFloat(sanitizeValue);
// Formatting for currency: "R$ 2.530,55"
// BRL in this case
let floatTocurrency = Number(stringToFloat).toLocaleString('pt-BR', style: 'currency', currency: 'BRL');
// Output
console.log(stringToFloat, floatTocurrency);
【讨论】:
穆伊托邦,维克多。【参考方案14】:简单点怎么样
Number(currency.replace(/[^0-9-]+/g,""))/100;
适用于所有货币和地区。替换所有非数字字符(您可以有 €50.000,00 或 $50,000.00)输入必须有 2 位小数
【讨论】:
【参考方案15】:这对我有用,涵盖了大多数边缘情况:)
function toFloat(num)
const cleanStr = String(num).replace(/[^0-9.,]/g, '');
let dotPos = cleanStr.indexOf('.');
let commaPos = cleanStr.indexOf(',');
if (dotPos < 0) dotPos = 0;
if (commaPos < 0) commaPos = 0;
const dotSplit = cleanStr.split('.');
const commaSplit = cleanStr.split(',');
const isDecimalDot = dotPos
&& (
(commaPos && dotPos > commaPos)
|| (!commaPos && dotSplit[dotSplit.length - 1].length === 2)
);
const isDecimalComma = commaPos
&& (
(dotPos && dotPos < commaPos)
|| (!dotPos && commaSplit[commaSplit.length - 1].length === 2)
);
let integerPart = cleanStr;
let decimalPart = '0';
if (isDecimalComma)
integerPart = commaSplit[0];
decimalPart = commaSplit[1];
if (isDecimalDot)
integerPart = dotSplit[0];
decimalPart = dotSplit[1];
return parseFloat(
`$integerPart.replace(/[^0-9]/g, '').$decimalPart.replace(/[^0-9]/g, '')`,
);
toFloat('USD 1,500.00'); // 1500
toFloat('USD 1,500'); // 1500
toFloat('USD 500.00'); // 500
toFloat('USD 500'); // 500
toFloat('EUR 1.500,00'); // 1500
toFloat('EUR 1.500'); // 1500
toFloat('EUR 500,00'); // 500
toFloat('EUR 500'); // 500
【讨论】:
【参考方案16】: $ 150.00
Fr. 150.00
€ 689.00
以上三种货币符号我已经测试过了。你也可以为其他人做。
var price = Fr. 150.00;
var priceFloat = price.replace(/[^\d\.]/g, '');
上面的正则表达式将删除不是数字或句点的所有内容。因此,您可以获得没有货币符号的字符串,但如果您控制台输出为“Fr. 150.00”,那么您将获得价格为
console.log('priceFloat : '+priceFloat);
output will be like priceFloat : .150.00
这是错误的,所以你检查“。”的索引。然后拆分它并得到正确的结果。
if (priceFloat.indexOf('.') == 0)
priceFloat = parseFloat(priceFloat.split('.')[1]);
else
priceFloat = parseFloat(priceFloat);
【讨论】:
【参考方案17】:function NumberConvertToDecimal (number)
if (number == 0)
return '0.00';
number = parseFloat(number);
number = number.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1");
number = number.split('.').join('*').split('*').join('.');
return number;
【讨论】:
【参考方案18】:var parseCurrency = function (e)
if (typeof (e) === 'number') return e;
if (typeof (e) === 'string')
var str = e.trim();
var value = Number(e.replace(/[^0-9.-]+/g, ""));
return str.startsWith('(') && str.endsWith(')') ? -value: value;
return e;
【讨论】:
【参考方案19】:无论区域设置和货币设置如何,此功能都应适用:
function getNumPrice(price, decimalpoint)
var p = price.split(decimalpoint);
for (var i=0;i<p.length;i++) p[i] = p[i].replace(/\D/g,'');
return p.join('.');
这假设你知道小数点字符(在我的例子中,语言环境是从 php 设置的,所以我用<?php echo cms_function_to_get_decimal_point(); ?>
得到它)。
【讨论】:
【参考方案20】:这是一个简单的函数 -
function getNumberFromCurrency(currency)
return Number(currency.replace(/[$,]/g,''))
console.log(getNumberFromCurrency('$1,000,000.99')) // 1000000.99
【讨论】:
【参考方案21】:如此令人头疼,因此对其他文化的考虑也越来越少……
这里是伙计们:
let floatPrice = parseFloat(price.replace(/(,|\.)([0-9]3)/g,'$2').replace(/(,|\.)/,'.'));
就这么简单。
【讨论】:
这适用于比所选答案更多的情况。谢谢以上是关于如何使用 Javascript 将货币字符串转换为双精度?的主要内容,如果未能解决你的问题,请参考以下文章
将 JavaScript 数字转换为货币格式,但没有“$”或任何货币符号 [重复]