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

7 浏览
0 Comments

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

以下是我想要应用的验证条件:

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

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

以下是我尝试过的方法:

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

不幸的是,这对我没有起作用。

请问是否有人可以帮我得到所需的解决方案?

0
0 Comments

在Typescript中,有时候我们需要检查一个字符串是否为数字或浮点数。下面是一种常见的解决方法:

const isNumber = (n: string): boolean => !isNaN(parseFloat(n));

上述代码中,我们首先使用parseFloat()函数将字符串转换为浮点数,然后使用isNaN()函数检查转换后的结果是否为NaN。如果结果不是NaN,则说明该字符串是一个数字或浮点数。

然而,还有一种更简单的方法可以实现相同的功能。我们可以使用正则表达式来检查字符串是否符合数字或浮点数的格式:

const isNumber = (n: string): boolean => /^\-?(([1-9]\d*)|0)(\.\d+)?$/.test(n);

上述正则表达式的含义如下:

- `^\-?` 表示字符串可以以一个可选的负号开始。

- `(([1-9]\d*)|0)` 表示字符串可以以一个非零数字开始,后面可以跟随任意数量的数字,或者以零开始。

- `(\.\d+)?` 表示字符串可以以一个小数点开始,后面可以跟随任意数量的数字。这部分内容是可选的。

- `$` 表示字符串的结束。

如果一个字符串符合这个正则表达式的规则,则说明它是一个数字或浮点数。

需要注意的是,上述正则表达式对于以小数点开头或结尾的数字并不适用。例如,对于字符串`5.`和`.5`,它们将会被判断为非数字或浮点数。如果我们希望这样的字符串也被认为是有效的数字,可以使用上述更简单的方法。

总结起来,我们可以使用正则表达式或简单的isNaN()函数来检查一个字符串是否为数字或浮点数。根据具体需求选择适合的方法即可。

0
0 Comments

问题的出现是因为需要判断一个字符串是否是数值或浮点数类型。评论中提到,使用parseFloat不能满足所有要求,而且不喜欢使用正则表达式的方法。最简单的方法是使用一元加号运算符将字符串转换为数字,然后使用isNaN函数判断是否为无效数字。甚至更好的方法是直接使用isNaN函数,不需要进行类型转换。

解决方法如下:

const stringTransformedToNumber = +"-12.3";
const isInvalid = isNaN(stringTransformedToNumber);
console.log(isInvalid ? 'Invalid' : 'Valid');

更好的方法:

const isInvalid = isNaN("-12.3");
console.log(isInvalid ? 'Invalid' : 'Valid');

不需要进行类型转换,可以参考我的回答。

是的,你的回答在我发布回答的同时也发布了。:) 很好的回答。

0
0 Comments

怎样在TypeScript中检查一个字符串是否为数字/浮点数?

在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)))

哦!酷!我不知道这个`/e/`的东西...科学计数法...加1。

`/e/i`只是一个匹配包含`e`或`E`的正则表达式字面量。

明白了...谢谢。

0