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

Posted

技术标签:

【中文标题】如何在 TypeScript 中将字符串转换为数字?【英文标题】:How to convert a string to number in TypeScript? 【发布时间】:2013-01-18 00:42:24 【问题描述】:

给定一个数字的字符串表示,如何在 TypeScript 中将其转换为 number 类型?

var numberString: string = "1234";
var numberValue: number = /* what should I do with `numberString`? */;

【问题讨论】:

In Typescript, How to check if a string is Numeric的可能重复 @o_nix 它欺骗编译器,它不会改变类型类型:console.log(typeof <number><any>"1", typeof Number("1")) 将打印string number 【参考方案1】:

Exactly likein javascript,你可以使用parseIntparseFloat函数,或者干脆使用一元+操作符:

var x = "32";
var y: number = +x;

所有提到的技术都将具有正确的键入并正确解析简单的十进制整数字符串,如"123",但对于各种其他可能预期的情况(如"123.45")和极端情况(如@987654334)表现不同@)。

表格取自this answer

【讨论】:

小提示:parseInt(null) 返回 NaN 但 +null 返回 0 不像 Philip 在此处以 TypeScript 方式执行此操作的评分较高的答案那样富有表现力。 没有 TypeScript 方式,因为 TypeScript 只是 JavaScript。 @thedayturns 没有编程方式,因为编程就是电力 @Patrick 不确定您为什么称其为“TypeScript”方式,因为它也只是普通的 Javascript...【参考方案2】:

解释 Ryan 所说的,TypeScript 总体上包含 JavaScript 习语。

var n = +"1"; // the unary + converts to number
var b = !!"2"; // the !! converts truthy to true, and falsy to false
var s = ""+3; // the ""+ converts to string via toString()

JavaScript Type Conversion 的所有有趣的深入细节。

【讨论】:

【参考方案3】:

执行此操作的 Typescript 方法是:

Number('1234') // 1234
Number('9BX9') // NaN

在这里回答:https://***.com/a/23440948/2083492

【讨论】:

注意:您可以使用 isNaN 函数检查 NaN。 请注意,这不起作用:let value : number = valueAsString; 我认为 new Number("1234").valueOf() 确实是我们都在寻找的- @Devid - 您可以简化为 let a = Number('x') || 0; - Number('x') 将返回 NaN,这是“错误的”。因此,a 将分配给 0. 比使用三元语句和两次解析要干净得多,而且可以说(稍微)快得多。 小提示:不要使用new Number(),因为它会产生Number而不是number。使用Number()【参考方案4】:

对于我们的 Angular 用户:

模板中,Number(x)parseInt(x) 会引发错误,+x 无效。有效的转换为 x*1x/1

【讨论】:

太棒了!正如您在 html +x 中所说,根本不会转换为数字 那是因为Number 不在评估范围内。你可以写class MyComponent Number = Number; 来使用它。【参考方案5】:

Typescript 中有 parseInt()parseFloat()Number() 等内置函数,你可以使用它们。

【讨论】:

【参考方案6】:

正如这里的其他答案所示,有多种方法可以进行转换:

Number('123');
+'123';
parseInt('123');
parseFloat('123.45')

不过,我想在parseInt 上再提一件事。

使用parseInt 时,总是传递基数参数 是有意义的。对于十进制转换,即10。这是参数的默认值,这就是它可以被省略的原因。对于二进制,它是 216 对于十六进制。实际上,任何介于 2 和 36 之间的基数都可以。

parseInt('123')         // 123 (don't do this)
parseInt('123', 10)     // 123 (much better)

parseInt('1101', 2)     // 13
parseInt('0xfae3', 16)  // 64227

在一些 JS 实现中,parseInt 将前导零解析为八进制

尽管 ECMAScript 3 不鼓励并且 ECMAScript 5 禁止,但许多实现将以 0 开头的数字字符串解释为八进制。以下可能有八进制结果,也可能有十进制结果。 始终指定基数以避免这种不可靠的行为。

——MDN

代码变得更清晰的事实是指定基数参数的一个很好的副作用。

由于parseFloat 只解析基数为 10 的数字表达式,因此这里不需要基数参数。

更多信息:

Why do we need to use radix? (SO Question) SO Answer to "What is the difference between parseInt() and Number()?"

【讨论】:

还有一个:~~'123'(使用内部 ToInt32)【参考方案7】:

您可以采用以下任一方式。

var str = '54';

var num = +str; //easy way by using + operator
var num = parseInt(str); //by using the parseInt operation 

【讨论】:

【参考方案8】:

字符串到数字的转换:

在 Typescript 中,我们通过以下方式将字符串转换为数字:

parseInt():这个函数有 2 个参数,第一个是要解析的字符串。第二个是基数(数学数字系统中的基数,例如十进制为 10,二进制为 2)。然后返回整数,如果第一个字符不能转换成数字,则返回NaNparseFloat():将我们要解析的值作为参数,并返回一个浮点数。如果该值不能转换为数字,则返回NaN+ 运算符:适当使用的运算符可以将字符串值强制转换为数字。

示例:

/*    parseInt   */

// note that a whole number is returned, so it will round the number
console.log(parseInt('51.023124'));

// parseInt will 'cut off' any part of the string which is not a number
console.log(parseInt('5adfe1234'));

// When the string starts with non number NaN is returned
console.log(parseInt('z123'));

console.log('--------');

/*    parseFloat   */

// parses the string into a number and keeping the precision of the number
console.log(typeof parseFloat('1.12321423'));

// parseFloat will 'cut off' any part of the string which is not a number
console.log(parseFloat('5.5abc'));

console.log('--------');

/*   + operator   */

let myString = '12345'

console.log(typeof +myString);

let myOtherString = '10ab'

// + operator will not cut off any 'non number' string part and will return NaN
console.log(+myOtherString);

使用哪个?

    如果您希望将字符串转换为 整数,请使用 parseInt()。但是,数据类型仍然是浮点数,因为 TS 中的所有数值都是浮点值。当您需要指定要解析的数字的基数时,也可以使用此方法。 当您需要将字符串解析为浮点数时,请使用parseFloat()。 您可以在字符串前使用+ 运算符将其强制转换为浮点数。这样做的好处是语法很短。

【讨论】:

很好的解释。帮了我很多,先生!【参考方案9】:

使用 => convertstring('10.00') 调用函数

parseFloat(string) => 可以用来转换成float, toFixed(4) => 小数位数

parseInt(str) => 可以用来转换成整数

convertstring(string)
    let number_parsed: any = parseFloat(string).toFixed(4)
    return number_parsed

【讨论】:

【参考方案10】:

有很多人在离子编程情况下遇到数据类型转换很难解决的问题,因为这种语言是新的,这里我将详细说明如何让用户知道如何转换数据离子类型为字符串数据类型整数。

在java、php、c、c++等编程语言中...都可以轻松移动数据,那么在ionic中也可以为我们创建数据转换也是一种简单的方式,尤其是在其他编程语言中。

this.mPosition = parseInt("");

【讨论】:

【参考方案11】:

三种方式

 let a = + '12'; 
 let b = parseInt('12' , 10); // 10 means decimal number
 let c = Number('12');

【讨论】:

【参考方案12】:

如果您只讨论类型,正如其他人所说,parseInt() 等将返回正确的类型。此外,如果出于某种原因该值可能是数字或字符串并且您不想调用 parseInt(),则 typeof 表达式也将转换为正确的类型:

function f(value:number|string)
  if(typeof value==='number')
   // value : number
  else 
   // value : string
  

【讨论】:

【参考方案13】:

这是 StrToNumber 函数的修改版本。和以前一样,

    它允许可选符号出现在数值的前面或后面。 它执行检查以验证字符串的头部或尾部只有一个符号。 如果发生错误,则返回“通过”默认值。

这个回复是一个可能的解决方案,比我之前的帖子更适合最初的问题。

   static StrToNumber(val: string, defaultVal:number = 0): number
           
      let result:number = defaultVal;      
      if(val == null) 
         return result;            
      if(val.length == 0) 
         return result;      
      val = val.trim();
      if(val.length == 0) 
         return(result);
      let sign:number = 1;     
      //
      // . obtain sign from string, and place result in "sign" local variable. The Sign naturally defaults to positive
      //     1 for positive, -1 for negative.
      // . remove sign character from val. 
      //      Note, before the function returns, the result is multiplied by the sign local variable to reflect the sign.
      // . error check for multiple sign characters
      // . error check to make sure sign character is at the head or tail of the string
      //              
        
         let positiveSignIndex = val.indexOf('+');
         let negativeSignIndex = val.indexOf('-');
         let nTailIndex = val.length-1;
         //
         // make sure both negative and positive signs are not in the string
         //
         if( (positiveSignIndex != -1) && (negativeSignIndex != -1) ) 
             return result;
         //
         // handle postive sign
         //
         if (positiveSignIndex != -1)
         
            //
            // make sure there is only one sign character
            //
            if( (positiveSignIndex != val.lastIndexOf('+')) )
             return result;     
             //
             // make sure the sign is at the head or tail
             //
             if( (positiveSignIndex > 0) && (positiveSignIndex < nTailIndex )  )
                 return result;
             //
             // remove sign from string
             //
             val = val.replace("+","").trim();                 
             
         //
         // handle negative sign
         //
         if (negativeSignIndex != -1)
         
            //
            // make sure there is only one sign character
            //
            if( (negativeSignIndex != val.lastIndexOf('-')) )
             return result;     
             //
             // make sure the sign is at the head or tail
             //
             if( (negativeSignIndex > 0) && (negativeSignIndex < nTailIndex )  )
                 return result;
             //
             // remove sign from string
             //
             val = val.replace("-","").trim();  
             sign = -1;                 
                        
         //
         // make sure text length is greater than 0
         //       
         if(val.length == 0) 
            return result;                             
         
      //
      // convert string to a number
      //
      var r = +(<any>val);
      if( (r != null) && (!isNaN(r)) )
                
         result = r*sign;         
      
      return(result);    
   

【讨论】:

【参考方案14】:

var myNumber: number = 1200;
//convert to hexadecimal value
console.log(myNumber.toString(16)); //will return  4b0
//Other way of converting to hexadecimal
console.log(Math.abs(myNumber).toString(16)); //will return  4b0
//convert to decimal value
console.log(parseFloat(myNumber.toString()).toFixed(2)); //will return  1200.00

Online Number Conversion Tool

Number Converter

【讨论】:

【参考方案15】:

最简单的方法是使用 +strVal 或 Number(strVal)

例子:

let strVal1 = "123.5"
let strVal2 = "One"
let val1a = +strVal1
let val1b = Number(strVal1)
let val1c = parseFloat(strVal1)
let val1d = parseInt(strVal1)
let val1e = +strVal1 - parseInt(strVal1)
let val2a = +strVal2

console.log("val1a->", val1a) // 123.5
console.log("val1b->", val1b) // 123.5
console.log("val1c->", val1c) // 123.5
console.log("val1d->", val1d) // 123
console.log("val1e->", val1e) // 0.5
console.log("val2a->", val2a) // NaN

【讨论】:

【参考方案16】:

typescript 需要知道我们的var a 将会是Number || String

export type StringOrNumber = number | string;

export function toString (v: StringOrNumber) 
 return `$v`;



export function toNumber (v: StringOrNumber) 
 return Number(v);


export function toggle (v: StringOrNumber) 
 return typeof v === "number" ? `$v` : Number(v);


【讨论】:

【参考方案17】:

最新版本可以使用as,示例如下:

var numberString: string = "1234";
const numberValue = numberString as number;

【讨论】:

这不会转换值,这会告诉计算机-> 闭嘴,我知道发生了什么,这是一个数字,相信我。但这绝对没有真正的转换。它在某些情况下可能会起作用,因为有很多地方可以放置字符串而不是数字,并且字符串将隐式转换为数字。但它并不总是有效。

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

如何在 typescript/javascript 中将 123456789 转换为 123***789?

如何在 C++ 中将数字转换为字符串,反之亦然

如何在 TypeScript 中将 Set 转换为数组

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

如何在freemarker模板中将字符串转换为数字

如何在存储过程中将数字转换为字符串[关闭]