如何使用jQuery或Javascript将货币字符串转换为double?

Bob*_*ich 229 javascript jquery

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

"$1,100.00"1100.00

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

CMS*_*CMS 452

删除所有非点/数字:

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

  • 请记住,这是与语言环境相关的,因为其他语言环境使用','表示小数(例如1.100,00€).其他一些语言环境甚至每组使用不同的标准数字位数(如3位小数). (17认同)
  • 为了处理字符串中的负数,我在要接受的字符列表中添加了一个" - ",即.replace(/ [^ 0-9 - \.] +/g,"") (8认同)
  • 看起来这只适用于有.00`尾随的地方.否则有效的货币表示形式,如"$ 1100"和"$ 1100".将减少两个数量级. (4认同)
  • 还要记住,一些会计应用程序将数字括在括号中以表示负值.例如:($ 5.00)= - $ 5.00 (2认同)
  • 如果您的货币是巴西货币,则这不起作用,因为它们使用“,”分隔符。 (2认同)

Tho*_*mel 24

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

accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
accounting.unformat("€ 1.000.000,00", ","); // 1000000
Run Code Online (Sandbox Code Playgroud)

你可以在GitHub找到它

  • 更新:该库有71个未解决的问题,并且在5个月内没有进行过编辑,因此我不信任它。https://github.com/openexchangerates/accounting.js/issues (3认同)

小智 18

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

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

  • 值得注意的是,当您添加货币时,不应该将浮动用于任何非"玩具"应用程序.你最终将得到**而不是**确切的总数. (7认同)
  • 当parseFloat("151.20"*100)给你15119.999999999998但parseFloat("151.40"*100)给你15140时,你会感到惊讶和不快.不要再使用parseFloat.使用特定的库来处理货币,例如accounting.js或此处建议的任何其他库. (6认同)
  • `+.05` 是什么意思? (2认同)

Phi*_*ill 15

我知道这是一个古老的问题但是想给出一个额外的选择.

jQuery Globalize提供了将文化特定格式解析为浮点数的功能.

https://github.com/jquery/globalize

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

Globalize.culture("en-US");
Run Code Online (Sandbox Code Playgroud)

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

var result = Globalize.parseFloat(Globalize.format("$13,042.00", "c"));
Run Code Online (Sandbox Code Playgroud)

这会给你:

13042.00
Run Code Online (Sandbox Code Playgroud)

并允许您与其他文化合作.


Pos*_*hin 12

对于任何在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
Run Code Online (Sandbox Code Playgroud)

打字稿

import currency from "currency.js";

currency("$12.30").value;    // 12.30
Run Code Online (Sandbox Code Playgroud)


PaV*_*yen 8

这个例子运行正常

var currency = "$123,456.00";
var number = Number(currency.replace(/[^0-9\.]+/g,""));
alert(number);
Run Code Online (Sandbox Code Playgroud)

http://jsbin.com/ecAviVOV/2/edit


Vin*_*car 7

我知道这是一个老问题,但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'));
Run Code Online (Sandbox Code Playgroud)

假设:

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

regexp甚至可以处理类似"1,999美元和99美分"的内容,尽管它不是预期的功能,不应该依赖它.

希望这会对某人有所帮助.


小智 7

这是我的职责。适用于所有货币..

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]/, "")
    );

}
Run Code Online (Sandbox Code Playgroud)

用法:toFloat("$1,100.00")toFloat("1,100.00$")


Lim*_*isa 6

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

// "10000500.62" number_to_price => 10.000.500,62

JS 小提琴: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;
}
Run Code Online (Sandbox Code Playgroud)


Óla*_*age 5

你可以试试这个

var str = "$1,112.12";
str = str.replace(",", "");
str = str.replace("$", "");
console.log(parseFloat(str));
Run Code Online (Sandbox Code Playgroud)

  • 此操作会失败,并显示“$1,000,000.00”-&gt; 1000 - 需要使用正则表达式来替换字符串中的所有匹配项 (3认同)

小智 5

对于 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,""));
Run Code Online (Sandbox Code Playgroud)