如何在 Typescript 中检查字符串是否为 numeric/float?
How to check if a string is numeric/float in Typescript?
以下是我要应用的验证:
- 字符串应包含 0 到 9 之间的任意字符。
- 它不应包含任何字母字符。
- 它最多可以包含一个“-”(减号运算符),表示一个负数,例如“-12”。
- 最多也可以包含一个'.'涵盖浮动数字的情况,例如“12.2”
现在我尝试了各种组合,但仍然无法在 Typescript 中创建这样的条件。
这是我尝试过的:
- 使用正则表达式 /^[0-9.{0,1}-{0,1}]/.test(mystring)
不幸的是,这对我不起作用。
任何人都可以帮助我获得所需的解决方案吗?
试试这样:
/^\-?(([1-9]\d*)|0)(\.\d+)?$/
在 TypeScript 中,使用以下可以接受任何值的函数:
const isFixed = (o: any) => {
const s = String(o)
return !isNaN(+s) && isFinite(+s) && (typeof o === 'number' || !/e/i.test(s))
}
或者如果您只检查字符串:
const isFixedString = (s: string) => !isNaN(+s) && isFinite(+s) && !/e/i.test(s)
请注意,第一个函数中的显式 String()
强制转换是为了避免多次调用值的 toString()
或 valueOf()
或 [Symbol.toPrimitive]()
以及检查值冲突的风险像 { n: 0, valueOf: () => n++ }
.
这样的自动更新类型
在两个定义中使用一元 +
运算符的转换专门用于参数类型与 TypeScript 中 isNaN()
和 isFinite()
的全局定义兼容,它期望一个number
参数出于某种原因,即使 JavaScript 可以处理任何类型。否则,可以删除这些强制转换而不会对结果进行任何更改。
说明
只需使用 !isNaN(mystring)
,您将检查使用 Number()
转换字符串是否会导致 NaN
:
let arr = ['5', '-5', '.5', '5.', '0', '5e0', '5E0', 'Infinity', '-Infinity', '5a', 'n', '--5'];
arr.forEach(str => console.log(str, !isNaN(str)))
需要注意的是,这种方式也接受科学计数法和Infinity
,需要和isFinite(mystring) && !/e/i.test(mystring)
分开处理:
let arr = ['5', '-5', '.5', '5.', '0', '5e0', '5E0', 'Infinity', '-Infinity', '5a', 'n', '--5'];
arr.forEach(str => console.log(str, !isNaN(str) && isFinite(str) && !/e/i.test(str)))
正如上面评论中所解释的,parseFloat 不会满足您的所有要求。而且我不喜欢这种事情的 Reg Ex 方法。
最简单的方法是使用一元 +
将字符串强制转换为数字
const stringTransformedToNumber = +"-12.3";
const isInvalid = isNaN(stringTransformedToNumber);
console.log(isInvalid ? 'Invalid' : 'Valid');
更好的方法是使用 isNaN
:
const isInvalid = isNaN("-12.3");
console.log(isInvalid ? 'Invalid' : 'Valid');
以下是我要应用的验证:
- 字符串应包含 0 到 9 之间的任意字符。
- 它不应包含任何字母字符。
- 它最多可以包含一个“-”(减号运算符),表示一个负数,例如“-12”。
- 最多也可以包含一个'.'涵盖浮动数字的情况,例如“12.2”
现在我尝试了各种组合,但仍然无法在 Typescript 中创建这样的条件。 这是我尝试过的:
- 使用正则表达式 /^[0-9.{0,1}-{0,1}]/.test(mystring)
不幸的是,这对我不起作用。 任何人都可以帮助我获得所需的解决方案吗?
试试这样:
/^\-?(([1-9]\d*)|0)(\.\d+)?$/
在 TypeScript 中,使用以下可以接受任何值的函数:
const isFixed = (o: any) => {
const s = String(o)
return !isNaN(+s) && isFinite(+s) && (typeof o === 'number' || !/e/i.test(s))
}
或者如果您只检查字符串:
const isFixedString = (s: string) => !isNaN(+s) && isFinite(+s) && !/e/i.test(s)
请注意,第一个函数中的显式 String()
强制转换是为了避免多次调用值的 toString()
或 valueOf()
或 [Symbol.toPrimitive]()
以及检查值冲突的风险像 { n: 0, valueOf: () => n++ }
.
在两个定义中使用一元 +
运算符的转换专门用于参数类型与 TypeScript 中 isNaN()
和 isFinite()
的全局定义兼容,它期望一个number
参数出于某种原因,即使 JavaScript 可以处理任何类型。否则,可以删除这些强制转换而不会对结果进行任何更改。
说明
只需使用 !isNaN(mystring)
,您将检查使用 Number()
转换字符串是否会导致 NaN
:
let arr = ['5', '-5', '.5', '5.', '0', '5e0', '5E0', 'Infinity', '-Infinity', '5a', 'n', '--5'];
arr.forEach(str => console.log(str, !isNaN(str)))
需要注意的是,这种方式也接受科学计数法和Infinity
,需要和isFinite(mystring) && !/e/i.test(mystring)
分开处理:
let arr = ['5', '-5', '.5', '5.', '0', '5e0', '5E0', 'Infinity', '-Infinity', '5a', 'n', '--5'];
arr.forEach(str => console.log(str, !isNaN(str) && isFinite(str) && !/e/i.test(str)))
正如上面评论中所解释的,parseFloat 不会满足您的所有要求。而且我不喜欢这种事情的 Reg Ex 方法。
最简单的方法是使用一元 +
const stringTransformedToNumber = +"-12.3";
const isInvalid = isNaN(stringTransformedToNumber);
console.log(isInvalid ? 'Invalid' : 'Valid');
更好的方法是使用 isNaN
:
const isInvalid = isNaN("-12.3");
console.log(isInvalid ? 'Invalid' : 'Valid');