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

The*_*der 1 javascript regex string-comparison string-matching typescript

以下是我要申请的验证:

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

现在我尝试了各种组合,但仍然没有成功在 Typescript 中创建这样的条件。这是我尝试过的:

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

不幸的是,这对我不起作用。任何人都可以帮助我获得所需的解决方案吗?

Pat*_*rts 7

在 TypeScript 中,使用以下可以接受任何值的函数:

const isFixed = (o: any) => {
  const s = String(o)
  return !isNaN(+s) && isFinite(+s) && (typeof o === 'number' || !/e/i.test(s))
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您只检查字符串:

const isFixedString = (s: string) => !isNaN(+s) && isFinite(+s) && !/e/i.test(s)
Run Code Online (Sandbox Code Playgroud)

请注意,String()第一个函数中的显式转换是为了避免调用值的toString()orvalueOf()[Symbol.toPrimitive]()多次,并冒险检查自动更新类型(如{ n: 0, valueOf: () => n++ }.

+在两个定义中使用一元运算符的强制转换专门用于参数类型与 TypeScript for isNaN()and 中的全局定义兼容,尽管 JavaScript 可以处理任何类型,但出于某种原因isFinite()需要number参数。否则,可以在不更改结果的情况下删除这些强制转换。

解释

仅使用!isNaN(mystring),您将检查是否将字符串转换为Number()会导致NaN

const isFixed = (o: any) => {
  const s = String(o)
  return !isNaN(+s) && isFinite(+s) && (typeof o === 'number' || !/e/i.test(s))
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是,这种方法也接受科学记数法和Infinity,需要分别处理isFinite(mystring) && !/e/i.test(mystring)

const isFixedString = (s: string) => !isNaN(+s) && isFinite(+s) && !/e/i.test(s)
Run Code Online (Sandbox Code Playgroud)

  • @AdityaParab `/e/i` 只是一个 RegExp 文字,它匹配包含 `e` 或 `E` 的字符串。 (2认同)