如何使用 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 设置的,所以我用&lt;?php echo cms_function_to_get_decimal_point(); ?&gt; 得到它)。

【讨论】:

【参考方案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 数字转换为货币格式,但没有“$”或任何货币符号 [重复]

Javascript 货币格式 - 将代码转换为 Google Apps 脚本

Java - 如何使用货币格式将字符串转换为大十进制

JavaScript 将货币转换为数字

JavaScript 将数字转换为货币