Как преобразовать строку в число в TypeScript?

876

Учитывая строковое представление числа, как я могу преобразовать его numberв TypeScript?

var numberString: string = "1234";
var numberValue: number = /* what should I do with `numberString`? */;
Paul0515
источник
2
@o_nix Это обманывает компилятор, он не меняет тип: console.log(typeof <number><any>"1", typeof Number("1"))будет печатать string number.
k0pernikus

Ответы:

1384

Точно так же как в JavaScript , вы можете использовать parseIntили parseFloatфункцию, или просто используйте унарный +оператор:

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

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

Таблица перевода Таблица взята из этого ответа

Райан Кавано
источник
237
маленький совет: parseInt (null) возвращает NaN, но + null возвращает 0
Robin J
17
Не такой выразительный, как более высокий ответ Филиппа, который делает это способом TypeScript.
Патрик
10
Там нет никакого способа TypeScript, потому что TypeScript это просто JavaScript.
thedayturns
47
@thedayturns нет никакого способа программирования, так как программирование - просто электричество
jiroch
1
@ Патрик не уверен, почему вы так называете «TypeScript», поскольку это также просто Javascript ...
Сэнди Гиффорд
1093

Способ Typescript сделать это будет:

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

как ответили здесь: https://stackoverflow.com/a/23440948/2083492

Филипп
источник
4
Примечание: вы можете проверить NaN, используя isNaNфункцию.
Генрих Ульбрихт
2
Обратите внимание, что это не сработает: let value: 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.

phil294
источник
это прекрасно! как вы сказали , в HTML + х не преобразуется числа вообще
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 запрещает, многие реализации интерпретируют числовую строку, начинающуюся с нуля, как восьмеричное. У следующего может быть восьмеричный результат, или у этого может быть десятичный результат. Всегда указывайте основание, чтобы избежать этого ненадежного поведения.

- MDN

Тот факт, что код становится понятнее, является хорошим побочным эффектом от указания параметра radix.

Поскольку parseFloatв radix 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 .

user2040786
источник
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возвращается.
  • + operator: оператор при правильном использовании может привести строковое значение к числу.

Примеры:

/*    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

Есть встроенные функции, такие как parseInt(), parseFloat()и Number()в Typescript вы можете использовать их.

Могучий Бог Локи
источник
2

Вызовите функцию с помощью>> converttstring ('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

Онлайн инструмент для преобразования номеров

Конвертер чисел

user2569050
источник
1

Есть три способа

 let a = + '12'; 
 let b = parseInt('12' , 10); // 10 means decimal number
 let c = Number('12');
Навид Улла
источник
0

У многих из вас возникают проблемы с преобразованием типов данных, которые трудно решить в ситуациях ионного программирования, поскольку этот язык является новым, здесь я подробно опишу инструкции для пользователя, чтобы узнать, как преобразовать данные ионного типа в строковые данные введите целое число

В таких языках программирования, как java, php, c, c ++, ... все могут легко перемещать данные, тогда как в ionic можно также создавать для нас преобразование данных, что также является простым способом, не в последнюю очередь в других языках программирования.

this.mPosition = parseInt("");
Tienanhvn
источник
0

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

function f(value:number|string){
  if(typeof value==='number'){
   // value : number
  }else {
   // value : string
  }
}
cancerbero
источник
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