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