如何检查Typescript中的字符串是否为数字/浮点数?

时间:2018-07-11 13:58:04

标签: javascript regex typescript string-comparison string-matching

这是我要应用的验证:

  1. 字符串应包含0到9之间的任何字符。
  2. 它不应包含任何字母字符。
  3. 它最多可以包含一个“-”(减号),表示负数,例如“ -12”。
  4. 它最多也可以包含一个“。”。涵盖浮点数字(例如“ 12.2”)的情况

现在,我尝试了各种组合,但仍无法在Typescript中创建这样的条件。 这是我尝试过的:

  • 使用正则表达式 / ^ [0-9。{0,1}-{0,1}] /。test(mystring)

不幸的是,这对我不起作用。 谁能帮我获得所需的解决方案?

3 个答案:

答案 0 :(得分:3)

在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]()并避免检查auto的冲突值-更新诸如{ n: 0, valueOf: () => n++ }之类的类型。

在两个定义中均使用一元+运算符进行的强制转换专门用于使参数类型与isNaN()isFinite()的TypeScript中的全局定义兼容,它们期望使用{{ 1}}参数由于某种原因即使JavaScript可以处理任何类型。否则,可以删除这些强制类型转换而不会改变结果。

说明

仅使用number,您将检查使用!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)

答案 1 :(得分:2)

如上面评论中所述,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');

答案 2 :(得分:-2)

尝试这样:

/^\-?(([1-9]\d*)|0)(\.\d+)?$/