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


237

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

"$1,100.00"1100.00

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

Answers:


480

删除所有非点/数字:

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

4
看来这仅在有.00尾随的地方有效。否则为有效的货币表示形式,例如“ $ 1100”和“ $ 1100”。将减少两个数量级。
Brian M. Hunt,

19
请记住,这是与语言环境相关的,因为其他语言环境对小数点使用“,”(例如1.100,00€)。其他一些语言环境甚至每组使用不同的标准数字位数(例如3个小数)。
smola

8
要处理字符串中的负数,我在要接受的字符列表中添加了一个“-”,即.replace(/ [^
0-9-

4
还请记住,某些会计应用程序将数字用括号括起来以表示负值。例如:($ 5.00)=-$ 5.00
Dave L

1
我知道我在这里回复可能要晚了几年,但是如果“ currency = 0”,您还需要小心。您将收到一个JavaScript错误,指出currency.replace不是函数。我只是添加了一个简单的检查,如果currency = 0以避免这种情况。
艾伦


20

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

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

7
值得注意的是,您在添加货币时不应将float用于任何非“玩具”应用程序。您最终将获得准确的总数。
Ally

6
当parseFloat(“ 151.20” * 100)给您15119.999999999998但parseFloat(“ 151.40” * 100)给您15140时,您会感到惊讶和不高兴。永远不要使用parseFloat来赚钱。使用特定的库来处理金钱,例如accounting.js或此处建议的任何其他库。
bambery

15

我知道这是一个老问题,但想提供其他选择。

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

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

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


10

我知道这是一个古老的问题,但是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));

假设:

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

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

希望这会帮助某人。


谢谢。最佳答案。简单而强大。我可以将其与(\ D *)(\ d。*?\ d)(?:\ D +(\ d {2} |-))?(\ D *)$一起使用,以获取货币和-分。因此,您也可以解析字符串1.000,-€。货币将以份数[1]或份数[4]的形式出现,而份数[3]将以美分或数字形式包含-。比起您可以随意对字符串进行标准化。
Cyber​​Aleks

这非常危险,非常危险,它将小于10的数字乘以100。在测试所有数字之前,我愚蠢地使用了它:(
sheavens

@sheavens感谢您的举报。道歉,以便修复到现在为止,但是新版本实际上也可以解决这些问题。
Vindicar 18/09/23


6

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


3

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

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


3

你可以试试这个

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



0
    $ 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);
    }

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

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

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


0

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.