Як перетворити рядок у число в TypeScript?


874

З огляду на рядкове представлення числа, як я можу перетворити його на numberтип у TypeScript?

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


2
@o_nix Це обманює компілятор, він не змінює тип типу: console.log(typeof <number><any>"1", typeof Number("1"))буде друкувати string number.
k0pernikus

Відповіді:


1378

Так само, як і в JavaScript , ви можете використовувати parseIntабо parseFloatфункції або просто скористатися одинарним +оператором:

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

Усі згадані методи матимуть правильне введення тексту та будуть правильно розбирати прості цілі рядки з десятковими цілими числами "123", але вони будуть вести себе по-різному для різних інших, можливо, очікуваних, випадків (наприклад "123.45") та кутових випадків (подібних null).

Таблиця переходів Таблиця, взята з цієї відповіді


236
невеликий натяк: parseInt (null) повертає NaN, але + null повертає 0
Robin J

17
Не настільки виразний, як відповідь Філіпа на більш високу оцінку, що робить це так, як TypeScript.
Патрік

10
Немає способу TypeScript, оскільки TypeScript - це лише JavaScript.
thedayturns

47
@thedayturns немає ніякого способу програмування, оскільки програмування - це лише електрика
jiroch

1
@Patrick не впевнений, чому ти називаєш так, що "TypeScript", оскільки це також просто Javascript ...
Сенді Гіффорд,

1090

Способом набору тексту для цього було б:

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

як тут відповіли: https://stackoverflow.com/a/23440948/2083492


4
Примітка. Ви можете перевірити наявність NaN за допомогою isNaNфункції.
Генріх Ульбріхт

2
Зауважте, що це не працює: нехай значення: number = valueAsString;
yonexbat

1
Я думаю, що нове число ("1234"). ValueOf () - це те, що ми всі шукаємо,
chrismarx

23
@Devid - ви могли б спростити let a = Number('x') || 0;- Number('x')повернувся б NaN, що є "фальсиєю". Таким чином, aбуло б призначено 0.набагато чистіше та, можливо, трохи швидше, ніж використання потрійного твердження та розбору двох разів.
Джефф Джеймс

4
@ Paul0515 Ви можете оновити це правильною відповіддю
Кріс Ланг

94

Для наших колег Angular користувачів:

Всередині шаблону , Number(x)і parseInt(x)видає повідомлення про помилку, і +xне має ніякого ефекту. Дійсний кастинг буде x*1або x/1.


це чудово! як ви сказали в HTML + x взагалі не перетворюється на номер
sa_

3
Це тому Number, що не входить до сфери оцінки. Ви можете написати, class MyComponent { Number = Number; }щоб використовувати його.
Алуан Хаддад

58

Як показують інші відповіді тут, існує кілька способів перетворення:

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

parseIntХоча згадати ще одну річ .

Під час використання parseIntмає сенс завжди передавати параметр radix . Для десяткового перетворення, тобто 10. Це значення за замовчуванням для параметра, тому його можна опустити. Для двійкових - це 2і 16для шістнадцяткової. Власне, будь-який радіус між 2 і 36 роботами.

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

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

parseIntФункція, добре, розбирає рядки , щоб перетворити їх в числа. У деяких реалізаціях JS parseIntаналізує провідні нулі як восьмеричні:

Хоча відмовляє ECMAScript 3 і забороняється ECMAScript 5, багато реалізацій інтерпретують числовий рядок, що починається з провідного 0, як вісімковий. Наступне може мати восьмеричний результат, або може мати десятковий результат. Завжди вказуйте радіус, щоб уникнути цієї ненадійної поведінки.

- МДН

Той факт, що код стає зрозумілішим, є приємним побічним ефектом вказування параметра радіації.

Оскільки parseFloatаналізує лише числові вирази в радіусі 10, тут немає необхідності в параметрі radix.

Більше про це:


і ще один: ~~ '123' (використовуючи внутрішній ToInt32)
aMarCruz

@aMarCruz правда, але я б обговорював, чи це семантично корисно
Фабіан Лауер

52

Роз'яснюючи те, що сказав Райан, 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 .


22

Ви можете слідувати будь-яким із наступних способів.

var str = '54';

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

13

Перетворення рядка в число:

У Typescript ми перетворюємо рядок у число наступними способами:

  • ParseInt(): Ця функція бере 2 аргументи, перший - це рядок для розбору. Другий - це радікс (основа в математичних системах числення, наприклад, 10 для десяткових і 2 для двійкових). Потім він повертає ціле число, якщо перший символ не може бути перетворений у число, NaNвін буде повернутий.
  • ParseFloat(): Приймає за аргумент значення, яке ми хочемо розібрати, і повертає число з плаваючою комою. Якщо значення неможливо перетворити на число, 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);

Який використовувати?

  1. Використовуйте, ParseInt()коли потрібно, щоб рядок, перетворений на ціле число . Однак тип даних все ще є плаваючою, оскільки всі значення числа є значеннями з плаваючою точкою в TS . Також використовуйте цей метод, коли вам потрібно вказати радіус числа, яке ви хочете проаналізувати.
  2. Використовуйте, ParseFloat()коли вам потрібно розібрати рядок на число з плаваючою точкою .
  3. Ви можете використовувати +оператор перед рядком, щоб примусити його до числа з плаваючою точкою . Перевага цього в тому, що синтаксис дуже короткий.

7

Найпростіший спосіб - використовувати + 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


2

Викличте функцію за допомогою => convertstring ('10 .00 ')

parseFloat (string) => Він може бути використаний для перетворення в float, toFixed (4) => в скільки десяткових знаків

parseInt (str) => Його можна використовувати для перетворення в ціле число

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

2

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

Інструмент перетворення номера в Інтернеті

Перетворювач чисел


1

Існує три способи

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

0

У вас багато з якими виникають проблеми з перетворенням типів даних, які важко вирішити в ситуаціях іонного програмування, оскільки ця мова є новою, тут я докладно розповім інструкції для користувача, щоб знати, як перетворити дані іонних типів у рядкові дані введіть ціле число.

У мовах програмування, таких як java, php, c, c ++, ... всі можуть легко переміщувати дані, тоді в іонних також можна створити для нас перетворення даних - це також простий спосіб не в останню чергу в інших мовах програмування.

this.mPosition = parseInt("");

0

якщо ви говорите лише про типи, як казали інші, parseInt () тощо поверне правильний тип. Крім того, якщо з будь-якої причини значення може бути як числом, так і рядком, і ви не хочете викликати parseInt (), вирази typeof також будуть приведені до правильного типу:

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

0

Ось модифікована версія функції StrToNumber. Як і раніше,

  1. Це дозволяє необов'язковий знак з'являтися перед чи поза числовим значенням.
  2. Він виконує перевірку, щоб перевірити, чи є лише одна ознака на голові або в хвості струни.
  3. Якщо трапляється помилка, повертається "пройдене" значення за замовчуванням.

Ця відповідь - це можливе рішення, яке краще підходить до початкового питання, ніж моє попереднє повідомлення.

   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);    
   }


0

машинопис повинен знати, що наш 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);
}

-1

Ви завжди можете скористатися опцією лиття. По-перше, ви повинні перетворити ваш об'єкт у "невідомий" тип, а потім передати його в очікуваний тип об'єкта.

let subID:number = 0;

subID = <number><unknown> await obj_s1aSite.submissionTableFirstID.getText();

TypeScript має лише підказки типів, а не кастинг типу. Це обманює компілятора думати, що це число, під час виконання він все ще буде рядком, якщо ви не розберете його.
k0pernikus

console.log(typeof <number><unknown>"1", typeof Number("1"))надрукує string number.
k0pernikus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.