测试字符串在JavaScript中是否为有效的float

时间:2018-10-10 12:51:03

标签: javascript string numbers nan parsefloat

我想测试字符串是否可以转换为浮点数。我一直在尝试使用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测试来查看字符串是否可以转换为浮点数?

5 个答案:

答案 0 :(得分:7)

默认情况下,JavaScript中没有提供与合理的“此字符串是否为数字”定义相匹配的内置操作(无论如何,我认为)。您可以通过Number,一元+或隐式转换(只需将字符串直接传递到isNaN中)来接近,但要注意,它们都做相同的事情,其中​​包括考虑{ {1}}成为""

0

My answer到一个相关的问题,将详细介绍您的选择。

因此,您可以做一个正则表达式(一定要允许科学计数!),也可以预先检查// 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 (!)

""

答案 1 :(得分:2)

parseFloat() 不会达到您的期望,因为它会尝试解析100T0并返回100,因此它是有效的{{1 }}。

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

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

string

演示:

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

答案 2 :(得分:0)

伪代码中的另一个想法

Comment

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

您能做的是这个(伪代码)

Comment

基本上,您说的是,如果对话“正确”进行,则string> float>(返回)string应该给出相同的字符串。

答案 3 :(得分:0)

您可以尝试使用常规表达式:

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

答案 4 :(得分:0)

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

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