【问题标题】:Why does my textarea (HTML) value show 12,000,000.11 but after parseFloat the value is only 12?为什么我的 textarea (HTML) 值显示为 12,000,000.11 但在 parseFloat 之后该值仅为 12?
【发布时间】:2014-08-21 21:52:57
【问题描述】:

我正在尝试开发一个采用数值的转换网站:

 1,200.12
 or
 1.200,12
 or
 1200.12
 or
 1200,12
 and have them all interpreted as 1200.12 by parseFloat.

 I would also like decimals to be able to be interpreted.
 0.123
 or
 0,123     
 as 0.123

通过一个textarea然后parseFloat这个数字以便执行计算。 这些是我得到的结果:

textarea input = 12,000.12
value after parseFloat = 12

parseFloat 不能识别数字的格式吗? 我得到了相同的结果:

textarea input: 12.000,12
value after parseFloat = 12

我该如何解决这个问题?看来我需要去掉逗号,因为 parseFloat 不会读取超出它们的内容,并且使用欧洲表示法去掉小数点并将逗号更改为小数点,以便 parseFloat 正确读取输入。关于如何解决这个问题的任何想法?我的猜测是我需要将字符串输入识别为欧洲或美国十进制表示法,然后执行所需的操作来为 parseFloat 准备字符串。我将如何实现这一目标?感谢所有贡献。使用 HTML5 和 Javascript。这是我的第一个网站,所以请放轻松。

最好, 反相

致所有贡献者...谢谢!到目前为止,所有的输入都是甜蜜的。我不认为我们将能够使用单个替换语句来正确剥离欧洲和美国符号,所以我认为我应该以某种方式使用 REGEX 来确定符号,然后拆分为 if else 语句来执行单独的替换功能在每个单独的符号上。

var input, trim;
input = "1.234,56"   //string from textarea on page
if(/REGEX that determines American Notation/.test(input){ 
   trim =  input.replace(/\,/,"");//removes commas and leaves decimal point);
}
else(/REGEX that determine European Notation/.test(input)/){ //would qualify input here
   rep = input.replace(/\./,"");//removes all decimal points);
   trim = rep.replace(/\,/,"."//changes the remaining comma to a decimal);
}
//now either notation should be in the appropriate form to parse
number = parseFloat(trim);

这可以使用正则表达式吗?请看我的另一个问题。 Regex - creating an input/textarea that correctly interprets numbers

【问题讨论】:

  • “1,234”是 4 位整数还是小数?
  • 知道它总是2位小数吗?如果是这样,您可以分割字符串的末尾,剥离其余部分并从那里解析它
  • @recursive 或者。我希望能够以任何格式 1,234 1234 1.234(EUnotation) 输入数字并为 parseFloat 做好准备。
  • @Svedin 我希望他们能够输入最多 5 位小数。这是用于将度量长度从公制转换为英制标准
  • @RyanPaceSloan:但是如何你希望号码准备好?如果用户输入“1,234”,程序的正确输出是什么?您认为整数正确还是小数正确?还是允许程序选择它喜欢的那个?

标签: javascript html decimal comma parsefloat


【解决方案1】:

一种方法是去掉逗号,例如:

.replace(",", "")

从那里你应该能够解析浮点数

用小提琴更新:http://jsfiddle.net/aLv74xpu/2/

【讨论】:

  • 这样的输入仍然存在问题,例如 1.234.567 如果您替换除一个以外的所有句点,它将起作用。
  • 这适用于美国符号 1,234.00,因为小数点会被 parseFloat 解释。但是,如果使用欧洲符号 1.234,00,它将替换小数点并保留第一个句点。 parseFloat 会根据 gillesc 所说的将 1234 解释为 1.00。
  • 我明白了,我可能误读了这个问题,或者在我回答它时它还没有完全更新。如果你确定有一个十进制值@recursive 用正则表达式发布了一个很好的答案
【解决方案2】:

这是一个解决方案,它使用正则表达式来消除所有逗号和所有句点,除了最后一个。

var number = "1,234.567.890";
var replaced = number.replace(/,|\.(?=.*\.)/g, "");
var result = parseFloat(replaced);
// result === 1234567.89

或者,您可以使用它,它以相同的方式处理逗号和句点,并忽略它们,除了最后一个。

var number = "12.345,67";
var replaced = number.replace(/[.,](?=.*[.,])/g, "").replace(",", ".");
var result = parseFloat(replaced);
// result === 12345.67

【讨论】:

  • 如果最后一个句点是逗号怎么办?即 1.234,56 会变成小数吗?
  • 这太棒了!它在美国表示法上完美运行。但是对于欧洲,它将 12.345,67 解释为 12.34567 而不是 12345.67。有任何想法吗?感谢对事业的贡献!
  • @RyanPaceSloan:我想我更了解你想要什么。我发布了一个可行的替代解决方案。
  • 太棒了!太感谢了。它就像一个魅力。我给了它 12,000,000,000.1234567 它返回了 12000000000.1234567 也 12.000.000.000,1234567 和美国相同的结果。我真的不能感谢你!你太棒了!
  • 如果有人输入没有小数点的 12,000 怎么办?然后它将读取为 12.00。该死!我以为我们舔过这个!还有什么魔法吗?
【解决方案3】:

parseFloat 解析它的参数,一个字符串,并返回一个浮点数 数字。如果遇到符号(+ 或 -)以外的字符, 数字 (0-9)、小数点或指数,它返回值 到那时并忽略那个角色和所有成功的人 人物。允许前导和尾随空格。

来自优秀的 MDN 网络:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat

所以这是parseFloat的预期行为

【讨论】:

    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    相关资源
    最近更新 更多