TypeScript:字符串转换为数字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TypeScript:字符串转换为数字相关的知识,希望对你有一定的参考价值。

参考技术A 在TypeScript,String转换为Number有以下方式:

Number构造函数(推荐)
let n = Number('1234') // 1234
let nan = Number('abcd') // NaN
+号操作符
let n = +'1234' // 1234
let nan = +'abcd' // NaN
判断字符串能否转换为数组
当字符串不能转换为数字,得到的结果为NaN。我们可以基于这个特点来判断字符串能否转换为数字。

isNaN(Number('abcd'))
isNaN(+'abcd')

如何在 Typescript 中检查字符串是不是为数字/浮点数? [复制]

【中文标题】如何在 Typescript 中检查字符串是不是为数字/浮点数? [复制]【英文标题】:How to check if a string is numeric/float in Typescript? [duplicate]如何在 Typescript 中检查字符串是否为数字/浮点数? [复制] 【发布时间】:2018-12-19 14:37:15 【问题描述】:

这是我要应用的验证:

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

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

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

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

【问题讨论】:

Typescript 不是运行时语言。 我是说 Typescript 本身并不是一种编程语言。相反,它(有效地)是对 Javascript 的增强,提供了 Javascript 数据的编译时类型。所以我看不出 Typescript 本身与这个问题有什么关系。你有一个 Javascript 问题,你应该可以使用 console 进行调试。 TypeScript 不是编程语言?现在我很难过。 @jcalz 我担心我会因为那句话而受到抨击。我不知道怎么说我的意思:) 有没有检查Number(val) 丢失了? @AdityaParab parseFloat 将接受 12.3xyz.. 【参考方案1】:

在 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 @AdityaParab /e/i 只是一个匹配包含eE 的字符串的正则表达式。 明白..谢谢。【参考方案2】:

正如上面 cmets 中所解释的,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');

【讨论】:

你甚至不需要投射它,看我的回答。 是的...您的答案已发布在我的帖子中。 :) 不错。【参考方案3】:

试试这样:

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

【讨论】:

5..5 应该是有效数字,并且它们都将无法通过此检查。 const isNumber = n => !isNaN(n) 更容易 Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems. - Jamie Zawinski

以上是关于TypeScript:字符串转换为数字的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TypeScript 中将字符串转换为数字?

将 Typescript 枚举从字符串转换为数字(角度)[重复]

如何在Typescript中把字母数字值转换为数值范围?

TypeScript:将布尔值转换为字符串值

typescript 将字符串转换为日期

在Angular 6模板语句中将字符串转换为Typescript枚举