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

时间:2009-02-17 22:57:56

标签: javascript jquery

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

"$1,100.00"1100.00

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

20 个答案:

答案 0 :(得分:426)

删除所有非点/数字:

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

答案 1 :(得分:23)

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

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

您可以在GitHub

找到它

答案 2 :(得分:17)

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

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

答案 3 :(得分:15)

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

jQuery Globalize提供了将特定于文化的格式解析为float的功能。

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

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

答案 4 :(得分:7)

此示例运行正常

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

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

答案 5 :(得分:6)

我知道这是一个老问题,但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+(\d{2}))?\D*$/;
var parts = cur_re.exec(currency);
var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00'));

假设:

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

regexp甚至可以处理类似“1,999美元和99美分”的内容,但它不是预期的功能,不应该依赖它。

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

答案 6 :(得分:4)

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

答案 7 :(得分:3)

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

International Number Formatter

答案 8 :(得分:2)

你可以试试这个

<script type="text/javascript">

var str="$1,112.12";
str = str.replace(",","");
str = str.replace("$","");
document.write(parseFloat(str));

</script>

答案 9 :(得分:2)

这是我的功能。适用于所有货币..

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 :(得分:2)

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

输出为:卢比。 39.00

use jquery.glob.js,
    jQuery.glob.all.js

答案 11 :(得分:1)

这对我有用,并且涵盖了大多数情况:)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

此功能应在任何区域设置和货币设置下均有效:

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(); ?>来获得它。)

答案 15 :(得分:0)

这是一个简单的功能-

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

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

答案 16 :(得分:0)

对于在 2020 中寻求解决方案的任何人,您都可以使用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

答案 17 :(得分:0)

如此令人头疼,对其他文化的无所顾忌……

这里是乡亲:

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

就这么简单。

答案 18 :(得分:0)

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

答案 19 :(得分:-1)

    $ 150.00
    Fr. 150.00
    € 689.00

我已经测试了以上三种货币符号。你也可以为其他人做这件事。

    var price = Fr. 150.00;
    var priceFloat = price.replace(/[^\d\.]/g, '');

上面的正则表达式将删除所有不是数字或句号的东西。所以你可以得到没有货币符号的字符串但是在&#34;神父。 150.00&#34;如果您控制输出,那么您将获得价格

    console.log('priceFloat : '+priceFloat);

    output will be like  priceFloat : .150.00

这是错误的,所以你检查&#34;的索引。&#34;然后拆分并得到正确的结果。

    if (priceFloat.indexOf('.') == 0) {
            priceFloat = parseFloat(priceFloat.split('.')[1]);
    }else{
            priceFloat = parseFloat(priceFloat);
    }