【问题标题】:test if a string is a valid float in JavaScript测试字符串是否是 JavaScript 中的有效浮点数
【发布时间】:2019-03-15 09:27:50
【问题描述】:

我想测试一个字符串是否可以转换为浮点数。我一直在尝试使用 parseFloat 来实现这一点。

console.log(!isNaN(parseFloat("10000"))); // should return true
console.log(!isNaN(parseFloat("100T0"))); // should return false (but doesn't)

Turns out parseFloat 只是在遇到不是数字的字符时立即停止读取字符串,然后返回到目前为止它传递的任何内容。所以parseFloat("100T0") 实际上返回100 而不是NaN

有什么更好的 js 测试来查看字符串是否可以转换为浮点数?

【问题讨论】:

    标签: javascript string numbers nan parsefloat


    【解决方案1】:

    在 JavaScript 中没有默认提供的内置操作与合理的“此字符串是否为数字”定义相匹配(无论如何,在我看来)。您可以使用Number、一元+ 或隐式转换(只需将字符串直接传递到isNaN)接近,但需要注意的是它们都做同样的事情,其中​​包括将"" 视为@987654326 @:

    // Number
    console.log(!isNaN(Number("10000"))); // true
    console.log(!isNaN(Number("100T0"))); // false
    console.log(!isNaN(Number("")));      // true (!)
    
    // Same as implicit (here triggered with a unary +)
    console.log(!isNaN(+"10000")); // true
    console.log(!isNaN(+"100T0")); // false
    console.log(!isNaN(+""));      // true (!)
    
    
    // Same as implicit
    console.log(!isNaN("10000")); // true
    console.log(!isNaN("100T0")); // false
    console.log(!isNaN(""));      // true (!)

    My answer 对相关问题的详细介绍进入您的选项。

    因此,您可以执行正则表达式(确保允许使用科学记数法!)或预先检查""

    function toNumber(str) {
      str = String(str).trim();
      return !str ? NaN : Number(str);
    }
    console.log(!isNaN(toNumber("10000"))); // true
    console.log(!isNaN(toNumber("100T0"))); // false
    console.log(!isNaN(toNumber("")));      // false

    【讨论】:

      【解决方案2】:

      使用 parseFloat() 不会得到预期的结果,因为它会尝试解析 100T0 并返回 100,因此它是有效的 Number

      您可以使用正则表达式代替 isNaN(),来检查给定的 string 是否仅由数字组成。

      这是您需要的the regex /^\-?[0-9]+(e[0-9]+)?(\.[0-9]+)?$/,这就是您的代码:

      function isItNumber(str) {
        return /^\-?[0-9]+(e[0-9]+)?(\.[0-9]+)?$/.test(str);
      }
      

      演示:

      function isItNumber(str) {
        return /^\-?[0-9]+(e[0-9]+)?(\.[0-9]+)?$/.test(str);
      }
      
      console.log(isItNumber("10000")) // should return true
      console.log(isItNumber("100T0"))
      console.log(isItNumber("10e5"))
      console.log(isItNumber("100.50"))

      【讨论】:

      • 虽然我没有在问题中注明,但它需要处理小数点
      • @rvictordelta 我用更新的正则表达式编辑了答案。
      【解决方案3】:

      伪代码中的另一个想法

      1) Loop through string substrings (imitating parseFloat)
      2) Get the substring that parseFloat stops at
      3) Compare this substring to the original
      

      旧的伪代码 - 不能完全工作 - 可能需要修改

      你能做的就是这个(伪代码)

      if (parseFloat (value)).toString() <> value then
         you know that the parse float only converted part of the value
      

      基本上你是说如果对话“正确”工作,string > float > (back to) string 应该给出相同的字符串。

      【讨论】:

      • 同意。使用新方法进行编辑。
      【解决方案4】:

      您可以尝试使用正则表达式来仅匹配浮点格式字符串。希望这会有所帮助。

      const reg = /^-?([0-9]+\.[0-9]+)$/g;
      
      console.log("Should match");
      console.log("123.2".match(reg));
      console.log("12.000".match(reg));
      console.log("-12.000".match(reg));
      
      console.log("Should not match");
      console.log("123".match(reg));
      console.log("123a123".match(reg));
      console.log("1e2".match(reg));

      【讨论】:

        【解决方案5】:

        你可以试试正则表达式:

        > (/^-?[\d]*(\.[\d]+)?$/g).test('0');
        true
        > (/^-?[\d]*(\.[\d]+)?$/g).test('1000');
        true
        > (/^-?[\d]*(\.[\d]+)?$/g).test('10E0');
        false
        > (/^-?[\d]*(\.[\d]+)?$/g).test('1000.E');
        false
        > (/^-?[\d]*(\.[\d]+)?$/g).test('1000.1');
        true
        > (/^-?[\d]*(\.[\d]+)?$/g).test('1.1000');
        true
        > (/^-?[\d]*(\.[\d]+)?$/g).test('.1000');
        true
        > (/^-?[\d]*(\.[\d]+)?$/g).test('1000.');
        false
        > (/^-?[\d]*(\.[\d]+)?$/g).test('-.1');
        true
        > (/^-?[\d]*(\.[\d]+)?$/g).test('-1000.1');
        true
        > (/^-?[\d]*(\.[\d]+)?$/g).test('-1000');
        true
        

        有一个功能:

        function isValidFloat(str) {
            return (/^-?[\d]*(\.[\d]+)?$/g).test(str);
        }
        

        【讨论】:

          猜你喜欢
          • 2011-01-13
          • 1970-01-01
          • 1970-01-01
          • 2014-06-16
          • 2011-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多