如何转换货币字符串为双与Javascript?

我有一个文本框,其中将有一个货币字符串,然后我需要将该字符串转换为double来对其执行一些操作。

__abc0→__abc1

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

348048 次浏览

我知道你已经找到了解决你的问题的方法,我只是想建议你看看以下更广泛的jQuery国际数字格式插件:

International Number Formatter .

你可以试试这个

var str = "$1,112.12";
str = str.replace(",", "");
str = str.replace("$", "");
console.log(parseFloat(str));

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

var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;

删除所有非点/数字:

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));

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

jQuery Globalize提供了将特定于区域性的格式解析为float的能力。

https://github.com/jquery/globalize

给定字符串"$13,042.00",Globalize设置为en-US:

Globalize.culture("en-US");

你可以像这样解析float值:

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

这将给你:

13042.00

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

我知道这是一个老问题,但CMS的答案似乎有一个小小的缺陷:它只适用于货币格式使用“。”作为小数分隔符。 例如,如果你需要使用俄罗斯卢布,字符串将看起来像这样: “1 000,00搓。”< / p >

我的解决方案远不如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));

假设:

  • 货币值采用十进制记数
  • 字符串中没有不是货币值一部分的数字
  • 货币值在其小数部分*中包含0或2位数字

regexp甚至可以处理“1,999美元和99美分”之类的内容,尽管它不是预期的特性,也不应该依赖它。

希望这能帮助到一些人。

accounting.js是要走的路。我在一个项目中使用过它,并有很好的使用经验。

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

你可以在GitHub找到它

这个例子运行正常

var currency = "$1,123,456.00";
var number = Number(currency.replace(/[^0-9\.]+/g,""));
console.log(number);

jQuery.preferCulture("en-IN");
var price = jQuery.format(39.00, "c");

输出为:39.00卢比

use jquery.glob.js,
jQuery.glob.all.js
    $ 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);
}

这是我的函数。适用于所有货币..

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$")

// "10.000.500,61 TL" price_to_number => 10000500.61

// "10000500.62" number_to_price => 10.000.500,62

Js小提琴:__abc0

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;
}
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;
}
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;
}

这个函数应该适用于任何语言环境和货币设置:

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(); ?>)。

这适用于我,涵盖了大多数边缘情况:)

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

这是一个简单的函数

function getNumberFromCurrency(currency) {
return Number(currency.replace(/[$,]/g,''))
}


console.log(getNumberFromCurrency('$1,000,000.99')) // 1000000.99

对于任何在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

打印稿

import currency from "currency.js";


currency("$12.30").value;    // 12.30

如此令人头痛,如此少地考虑其他文化……

下面是各位:

let floatPrice = parseFloat(price.replace(/(,|\.)([0-9]{3})/g,'$2').replace(/(,|\.)/,'.'));

就这么简单。

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);

简单地说

Number(currency.replace(/[^0-9-]+/g,""))/100;

适用于所有货币和地区。替换所有非数字字符(您可以有€50.000,00或$50,000.00)输入必须有2位小数

对于使用Quethzel Diaz提到的“,”分隔符的货币

货币是巴西。

var currency_br = "R$ 1.343,45";
currency_br = currency_br.replace('.', "").replace(',', '.');
var number_formated = Number(currency_br.replace(/[^0-9.-]+/g,""));
你应该能够使用香草JS处理这个。国际化API是JS核心的一部分:ECMAScript国际化API https://www.w3.org/International/wiki/JavaScriptInternationalization < / p >

这个答案对我有用:如何将数字格式化为货币字符串