【问题标题】:javascript parseFloat '500,000' returns 500 when I need 500000当我需要 500000 时,javascript parseFloat '500,000' 返回 500
【发布时间】:2010-07-08 16:15:05
【问题描述】:

这会是一种很好的处理方式吗?

我已经考虑过删除逗号然后解析为浮动。

你知道更好/更清洁的方法吗?

谢谢

【问题讨论】:

  • Here 是一个可靠的解决方案。

标签: javascript parsefloat


【解决方案1】:
parseFloat( theString.replace(/,/g,'') );

【讨论】:

  • 请不要使用正则表达式。 .replace(',', '')
  • @Adam,假设这个数字是一百万,"1,000,000",如果你不使用带全局标志的正则表达式,只会替换第一个逗号 -> "1000,000"
  • @Adam - J-P 的解决方案更具动态性,因为它涵盖了多个逗号。
  • 是的,当针可能不止一次出现时,你不得不求助于正则表达式来进行简单的字符串替换,这很烦人,但这对你来说是古怪的 JavaScript。当针可能包含正则表达式特殊字符并且您不想担心转义时,另一种习惯用法是s.split(needle).join(replacement)
  • @Adam 这里没有理由使用RegEx
【解决方案2】:

我不知道为什么没有人建议这个表达-

parseFloat( theString.replace(/[^\d\.]/g,'') );

删除除句点之外的所有非数字字符。您也不需要自定义函数/循环,这只是矫枉过正。

【讨论】:

  • 谢谢!这也处理了“$”。不错的答案:-)
【解决方案3】:

不。去掉逗号。

【讨论】:

  • 这不是一个答案,请参阅下面的 999 的答案,它确实有帮助。 stackoverflow.com/a/3205751/111757
  • @Vicer:严格来说,999's 的答案并不能很好地回答 this 特定问题:OP 已经知道如何从字符串,并询问是否存在另一种技术。答案是“不”。但是,对于以后知道如何删除逗号的人来说,999 的答案肯定更有帮助,即使它实际上并没有回答原始问题。但是,嘿。由于唯一会访问此页面的人是谷歌搜索如何处理带逗号的数字,因此对于所有未来的观众来说,他绝对是更好的答案。
  • @Matchu 不一定,我来寻找一个非常简洁的答案(我想,从技术上讲,我和 OP 有同样的问题)。在我的情况下,您的答案是准确性和简洁性的练习(OP似乎同意)。无论如何,只是对我们中的一些“未来观众”说,这个答案仍然比 999 的好(因此我赞成)。我希望如果有人不知道如何替换逗号,他们会用谷歌搜索,而且很可能永远不会看到这个页面。就我而言,虽然我用谷歌搜索并发现这个页面的标题与我的搜索文本非常匹配。谢谢!
  • 您将如何在 de-DE 语言环境中处理此问题? en-US 中的 12,500.50 是 12,500.50,但在 de-DE 中是 12.500,50,剩下 12.50075。有人碰巧有一个处理这种“魔法”的图书馆吗?
【解决方案4】:

您可以使用字符串替换方法,但不能像正则表达式允许的那样在单行中使用。

while(str.indexOf(',')!=-1)str= str.replace(',','');
parseFloat(str);

或者做一个没有正则表达式的表达式=

return parseFloat(str.split(',').join(''));

我会使用正则表达式。

【讨论】:

    【解决方案5】:

    我没有足够的声誉来添加评论,但是对于任何想知道正则表达式与拆分/加入的性能的人,这里有一个快速的小提琴:https://jsfiddle.net/uh3mmgru/

    var test = "1,123,214.19";
    
    var t0 = performance.now();
    for (var i = 0; i < 1000000; i++)
    {
        var a = parseFloat(test.replace(/,/g,''));
    }
    var t1 = performance.now();
    document.write('Regex took: ' + (t1 - t0) + ' ms');
    document.write('<br>')
    
    var t0 = performance.now();
    for (var i = 0; i < 1000000; i++)
    {
        var b = parseFloat(test.split(',').join(''));
    }
    var t1 = performance.now();
    document.write('Split/join took: ' + (t1 - t0) + ' ms');
    

    我得到的结果是(每个循环 100 万次):

    正则表达式:263.335 毫秒
    拆分/加入:1035.875 毫秒

    所以我认为在这种情况下可以肯定地说正则表达式是要走的路

    【讨论】:

      【解决方案6】:

      基于@kennebec 的想法,如果您想确保逗号正确,并且不想替换逗号,您可以尝试这样的操作:

      function myParse(num) {
        var n2 = num.split(",")
        out = 0
        for(var i = 0; i < n2.length; i++) {
          out *= 1000;
          out += parseFloat(n2[i])
        }
        return out
      }
      alert(myParse("1,432,85"));
      // Returns 1432085, as the comma is misplaced.
      

      它可能没有那么快,但你想要替代品:)

      【讨论】:

        【解决方案7】:

        解决大多数常见问题的简单函数怎么样?

        function getValue(obj) {
          Value = parseFloat( $(obj).val().replace(/,/g,'') ).toFixed(2);
          return +Value;
        }
        

        上述函数从字段中获取值(使用 jQuery)假设输入的值是数字(我宁愿在用户输入数据时验证字段,所以我确定字段内容是数字)。

        如果是浮点值,如果字段格式正确,函数将正确返回浮点值。

        此功能远未完成,但它可以快速解决输入为 1,234.56 或 1,234,567 的值的“,”(逗号)问题。只要内容是数字,它将返回有效数字。

        returnValue前面的+加号)符号/strong> 命令是 JavaScript 中用于确保返回的变量内容为数字的“肮脏技巧”。

        很容易将函数修改为其他用途,例如(例如)将字符串转换为数值,注意“,”(逗号)问题:

        function parseValue(str) {
          Value = parseFloat( str.replace(/,/g,'') ).toFixed(2);
          return +Value;
        }
        

        这两种操作甚至可以组合成一个功能。即:

        function parseNumber(item,isField=false) {
          Value = (isField) ? parseFloat( $(item).val().replace(/,/g,'') ).toFixed(2) : parseFloat( item.replace(/,/g,'') ).toFixed(2)
          return +Value;
        }
        

        在这种情况下,如果调用函数 result = parseNumber('12,092.98'); 它将解析值,因为它是一个字符串。但如果调用为 result = parseNumber('#MyField', true); 它将尝试从 '#MyField' 获取值。

        正如我之前所说,这些功能还远未完成,可以通过多种方式进行扩展。一个想法是检查给定参数(字符串)的第一个字符,并根据字符串格式决定从哪里获取要解析的值(如果第一个字符是 = '#' 那么它是来自 DOM 对象的 ID,否则,如果它以数字开头,则必须是 string 才能被解析)。

        试试吧...快乐的编码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-17
          • 2017-08-05
          • 2019-06-14
          • 2011-05-06
          • 1970-01-01
          • 2019-02-20
          • 2017-10-16
          相关资源
          最近更新 更多