您可以分几个步骤来完成,查找无效字符,然后去除空格,然后检查有效整数,然后解析它并检查值。
但是,如果您想尝试一个正则表达式,您可以尝试这样的事情:
var pattern = /^[0-9]*(.[0-9]*)?([eE][-+][0-9]*)?$/
如果要忽略空格,则需要先处理空格(trim
输入字符串)。如果不允许,您还需要过滤掉 0。
下面的函数做了其中的一部分,并返回一个带有解析数字的对象(按照epochparseFloat
的建议使用)以及它是否有效的指示。您应该能够将其放入您的代码中并对其进行调整以执行您想要的操作:
function processInput(s) {
var pattern = /^[0-9]*(.[0-9]*)?([eE][-+][0-9]*)?$/
var answer = { result: 0, isValid: false };
// remove whitespace from start and end
s = s.trim();
if (s.length > 0) {
answer.isValid = pattern.test(s);
if (answer.isValid) {
answer.result = parseFloat(s);
}
// Might need a special test for 0 here
}
return answer;
}
我可能错过了一个或两个特定案例,但我测试了一堆可能的东西,输出:
'3' -> { result: 3, isValid: true }
'.289213123' -> { result: 0.289213123, isValid: true }
'0.2' -> { result: 0.2, isValid: true }
'3.14' -> { result: 3.14, isValid: true }
'3.14.14' -> { result: 0, isValid: false }
'-3.14' -> { result: 0, isValid: false }
'314e-2' -> { result: 3.14, isValid: true }
'0.0314E+2' -> { result: 3.14, isValid: true }
'3.14more non-digit characters' -> { result: 0, isValid: false }
'3.' -> { result: 3, isValid: true }
'' -> { result: 0, isValid: false }
请注意,有效的负数返回 false,因为您说输入中不允许使用负数。所以这不是一般的“isNumeric”,它更适合这种情况。如果需要,您还可以删除这些内容以匹配指数语法。