测试字符串是否是JavaScript中的有效浮点数

rvi*_*lta 6 javascript string numbers nan parsefloat

我想测试一个字符串是否可以转换为float.我一直在尝试使用parseFloat来实现这一目标.

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

事实证明,parseFloat只要碰到一个不是数字的字符就会停止读取字符串,然后返回它到目前为止所传递的任何字符.所以parseFloat("100T0")实际上是返回100而不是NaN.

什么是更好的js测试,看看一个字符串是否可以被转换为浮点数?

T.J*_*der 8

JavaScript默认情况下没有一个内置操作可以匹配合理的"这个字符串是一个数字"的定义(无论如何).你可以亲近Number,一元+,或隐式转换(刚好路过串入isNaN直接),需要提醒的是,他们都做同样的事情,这包括考虑""0:

// 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 (!)
Run Code Online (Sandbox Code Playgroud)

对相关问题的回答会详细介绍您的选择.

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

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
Run Code Online (Sandbox Code Playgroud)


cнŝ*_*ŝdk 8

你不会得到你期望的parseFloat(),因为它试图解析100T0并返回100,所以它是一个有效的Number.

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

这是您需要的正则表达式/^\-?[0-9]+(e[0-9]+)?(\.[0-9]+)?$/,这就是您的代码应该如何:

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

演示:

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