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

test if a string is a valid float in JavaScript

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

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

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

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

JavaScript 中没有默认提供的内置操作符合合理的 "is this string a number" 定义(无论如何,在我看来)。您可以使用 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 (!)

到一个相关的问题详细进入你的选项。

因此,您可以使用正则表达式(一定要使用科学记数法!)或预先检查 ""

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

伪代码中的另一个想法

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 应该给出相同的字符串 "correctly"。

你不会得到你对 parseFloat() 的期望,因为它试图解析 100T0 和 returns 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"))

您可以尝试使用正则表达式:

> (/^-?[\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);
}

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

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));