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