【问题标题】:Javascript: Convert a string representation of money to NumberJavascript:将货币的字符串表示形式转换为数字
【发布时间】:2013-05-22 00:43:11
【问题描述】:

假设我有一个这样的字符串格式的金额:

amount = '12,000.00'

我想将其转换为数字 (Javascript) 或浮点数。

parseFloat(amount) // this gives me 12 as a result
Number(amount) // this gives me NaN as a result

我认为的其他解决方案是这样的:

parseFloat(amount.replace(/[,]/g, ''))

这很好用。但这里的问题是语言环境。

当金额为 12000,00 欧元时,这将失败。 这里的“,”有完全不同的含义。

我四处寻找一个好的解决方案,但找不到。我正在寻找一个通用的解决方案。

【问题讨论】:

    标签: javascript number-formatting money-format


    【解决方案1】:

    这并不容易,因为您无法确切知道千位的分隔符是什么,小数部分的分隔符是什么

    考虑“12.000.000”是12000.000 === 12000 还是12000000

    但是,如果您设置最后一个分隔符始终是十进制分隔符的要求 - 意思是如果给出了至少一个分隔符,则最后一个一个必须是十进制分隔符,*如果后面的数字不超过定义的长度。

    那你可以试试下面的

    编辑

    (如果您对旧功能感兴趣,请参阅revs

    我可以在最后一个分隔符“,”或“。”之后定义最大数字长度。直到它被视为浮点数,之后它作为整数返回

    var amounts = ["12000","12.000,00", "12,000.00", "12,000,01", "12.000.02", "12,000,001"];
    
    
    formatMoney.maxDecLength = 3; //Set to Infinity o.s. to disable it
    
    function formatMoney(a) {
        var nums = a.split(/[,\.]/);
        var ret = [nums.slice(0, nums.length - 1).join("")];
        if (nums.length < 2) return +nums[0];
        ret.push(nums[nums.length - 1]);
        return +(ret.join(nums[nums.length - 1].length < formatMoney.maxDecLength ? "." : ""));
    }
    
    for ( var i=0,j;j=amounts[i];i++)
        console.log (j + " -> " +formatMoney(j));
    

    给出输出:

    "12000 -> 12000"
    "12.000,00 -> 12000"
    "12,000.00 -> 12000"
    "12,000,01 -> 12000.01"
    "12.000.02 -> 12000.02"
    "12,000,001 -> 12000001" //as you can see after the last "," there are 3 digits and its treated as integer
    

    另一个JSBin

    【讨论】:

      【解决方案2】:

      事实是,您永远不会知道格式。 12,345。那是12345,还是12.345 的另一个语言环境版本?

      但是,如果您有一致的小数,那么您可以在逗号上使用lastIndexOf 函数,句点将显示小数位置和字符。

      var price = '12,345.67';
      var lastPeriod = price.lastIndexOf('.');
      var lastComma = price.lastIndexOf(',');
      if (lastComma != -1 && lastComma > lastPeriod) {
          decimalCharacter = ',';
      } else {
          decimalCharacter = '.';
      }
      console.log(decimalCharacter); //. or , based on how the price string looks - see below
      

      如果price12,345.67,则decimalCharacter 将是.。如果是12.345,67,则返回为,

      【讨论】:

        【解决方案3】:

        您可以通过这种方式获取本地十进制分隔符:

        1.1.toLocaleString().substr(1,1)
        

        在解析浮点数之前,您可以确保字符串只包含数字、可能是减号和本地小数分隔符。

        【讨论】:

        猜你喜欢
        • 2015-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-30
        • 1970-01-01
        • 1970-01-01
        • 2017-01-16
        相关资源
        最近更新 更多