Jak przekonwertować ciąg na liczbę w TypeScript?


874

Biorąc pod uwagę ciąg znaków reprezentujący liczbę, w jaki sposób mogę przekonwertować go na numberczcionkę TypeScript?

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


2
@ o_nix Oszukuje kompilator, nie zmienia typu typu: console.log(typeof <number><any>"1", typeof Number("1"))wydrukuje string number.
k0pernikus

Odpowiedzi:


1378

Dokładnie jak w JavaScript , możesz użyć parseIntalbo parseFloatfunkcje, lub po prostu użyć jednoargumentowy +operator:

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

Wszystkie wymienione techniki będą miały poprawne pisanie i poprawnie parsują proste ciągi dziesiętne, takie jak "123", ale będą zachowywać się inaczej dla różnych innych, prawdopodobnie oczekiwanych, przypadków (jak "123.45") i narożników (jak null).

Tabela konwersji Tabela pochodzi z tej odpowiedzi


236
mała wskazówka: parseInt (null) zwraca NaN, ale + null zwraca 0
Robin J

17
Nie tak wyraziste, jak wyżej oceniana odpowiedź Philipa, która robi to w sposób TypeScript.
Patrick

10
Nie ma sposobu na TypeScript, ponieważ TypeScript to po prostu JavaScript.
thedayturns

47
@thedayturns nie ma możliwości programowania, ponieważ programowanie to tylko prąd
jiroch

1
@ Patrick nie jest pewien, dlaczego nazywasz to tak „TypeScript”, ponieważ jest to również zwykły Javascript ...
Sandy Gifford

1090

Typowym sposobem na zrobienie tego byłoby:

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

zgodnie z odpowiedzią tutaj: https://stackoverflow.com/a/23440948/2083492


4
Uwaga: możesz sprawdzić dostępność NaN za pomocą isNaNfunkcji.
Heinrich Ulbricht

2
Zauważ, że to nie zadziała: let value: number = valueAsString;
yonexbat

1
Myślę, że nowy numer („1234”). ValueOf () jest naprawdę tym, czego wszyscy
szukamy-

23
@Devid - można uprościć let a = Number('x') || 0;- Number('x')powróci NaN, co oznacza „falsey”. Dlatego azostałby przypisany 0.Znacznie czystszy i prawdopodobnie (nieco) szybszy niż dwukrotne użycie instrukcji trójskładnikowej.
Geoff James

4
@ Paul0515 czy możesz to zaktualizować, aby była poprawną odpowiedzią
Chris Lang

94

Dla naszych innych użytkowników Angular:

Wewnątrz szablonu , Number(x)i parseInt(x)zgłasza błąd, i +xnie ma żadnego wpływu. Prawidłowy casting to x*1lub x/1.


wspaniale! jak powiedziałeś w HTML + x wcale nie konwertuje na liczbę
sa_

3
To dlatego, że Numbernie wchodzi w zakres oceny. Możesz napisać, class MyComponent { Number = Number; }aby z niego skorzystać.
Aluan Haddad

58

Jak pokazują inne odpowiedzi tutaj, istnieje wiele sposobów konwersji:

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

Chciałbym jednak wspomnieć o jeszcze jednej sprawie parseInt.

Podczas używania parseIntsensowne jest zawsze przekazywanie parametru radix . To znaczy do konwersji dziesiętnej 10. Jest to domyślna wartość parametru, dlatego można ją pominąć. W przypadku plików binarnych jest to a, 2a 16w systemie szesnastkowym. Właściwie każda podstawa między 2 a 36 włącznie.

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

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

Ta parseIntfunkcja analizuje ciągi, aby przekonwertować je na liczby. W niektórych implementacjach JS parseIntanalizuje zera wiodące jako ósemkowe:

Mimo że ECMAScript 3 go zniechęca, a ECMAScript 5 zabrania, wiele implementacji interpretuje ciąg liczbowy rozpoczynający się od 0 na początku jako ósemkowy. Poniższe wyniki mogą być ósemkowe lub dziesiętne. Zawsze określaj podstawę, aby uniknąć tego niewiarygodnego zachowania.

- MDN

Fakt, że kod staje się wyraźniejszy, jest miłym efektem ubocznym określenia parametru radix.

Ponieważ parseFloatanalizuje tylko wyrażenia liczbowe w Radix 10, nie ma potrzeby tutaj parametru Radix.

Więcej na ten temat:


i jeszcze jedno: ~~ '123' (przy użyciu wewnętrznego ToInt32)
aMarCruz

@ aMarCruz to prawda, ale zastanowiłbym się, czy jest to semantycznie przydatne
Fabian Lauer

52

Wyjaśniając to, co powiedział Ryan, TypeScript obejmuje ogólnie idiomy 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()

Wszystkie interesujące szczegółowe informacje na temat konwersji typów JavaScript .


22

Możesz wykonać jeden z następujących sposobów.

var str = '54';

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

13

Konwersja ciągu na liczbę:

W Typescript konwertujemy ciąg na liczbę w następujący sposób:

  • ParseInt(): Ta funkcja przyjmuje 2 argumenty, pierwszy to ciąg do analizy. Drugi to podstawa (podstawa w matematycznych systemach liczbowych, np. 10 dla dziesiętnych i 2 dla binarnych). Następnie zwraca liczbę całkowitą, jeśli pierwszy znak nie może zostać przekształcony w liczbę, NaNzostanie zwrócony.
  • ParseFloat(): Bierze jako argument wartość, którą chcemy przeanalizować, i zwraca liczbę zmiennoprzecinkową. Jeśli wartości nie można przekonwertować na liczbę, NaNzwracana jest.
  • + operator: Operator, gdy jest odpowiednio używany, może zmusić wartość ciągu do liczby.

Przykłady:

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

Którego użyć?

  1. Użyj, ParseInt()gdy chcesz przekonwertować ciąg na liczbę całkowitą . Jednak typ danych jest wciąż zmiennoprzecinkowy, ponieważ wszystkie wartości liczbowe są wartościami zmiennoprzecinkowymi w TS . Skorzystaj również z tej metody, jeśli chcesz określić podstawę liczby, którą chcesz przeanalizować.
  2. Użyj, ParseFloat()gdy potrzebujesz parsować ciąg znaków na liczbę zmiennoprzecinkową .
  3. Możesz użyć +operatora przed ciągiem, aby przekonwertować go na liczbę zmiennoprzecinkową . Zaletą tego jest to, że składnia jest bardzo krótka.

7

Najłatwiejszym sposobem jest użycie + strVal lub Number (strVal)

Przykłady:

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

Wywołaj funkcję za pomocą => convertstring ('10 .00 ')

parseFloat (string) => Można go użyć do konwersji na zmiennoprzecinkowe, toFixed (4) => do liczby miejsc po przecinku

parseInt (str) => Można go użyć do konwersji na liczbę całkowitą

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


1

Istnieją trzy sposoby

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

0

Wielu z was ma problem z konwersją typów danych, które są trudne do rozwiązania w programowaniu jonowym, ponieważ ten sam język jest nowy, tutaj szczegółowo opiszę instrukcje dla użytkownika, aby wiedzieć, jak przekonwertować typy danych jonowych na dane łańcuchowe wpisz liczbę całkowitą.

W językach programowania, takich jak java, php, c, c ++, ... wszystko może łatwo przenosić dane, a następnie w jońskim może również tworzyć dla nas konwersję danych, jest to również łatwy sposób, również w innych językach programowania.

this.mPosition = parseInt("");

0

jeśli mówimy tylko o typach, jak powiedzieli inni, parseInt () itp. zwróci poprawny typ. Ponadto, jeśli z jakiegokolwiek powodu wartością może być zarówno liczba, jak i ciąg znaków, a użytkownik nie chce wywoływać funkcji parseInt (), wyrażenia typeof również będą rzutowane na poprawny typ:

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

0

Oto zmodyfikowana wersja funkcji StrToNumber. Jak wcześniej,

  1. Umożliwia wyświetlanie opcjonalnego znaku przed lub za wartością liczbową.
  2. Dokonuje sprawdzenia, aby sprawdzić, czy na głowie lub ogonie sznurka znajduje się tylko jeden znak.
  3. Jeśli wystąpi błąd, zwracana jest „domyślna” wartość domyślna.

Ta odpowiedź jest możliwym rozwiązaniem, które lepiej pasuje do pytania początkowego niż mój poprzedni post.

   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

maszynopis musi wiedzieć, że nasz var abędzie eteremNumber || 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

Zawsze możesz użyć opcji rzutowania. Najpierw musisz przekonwertować obiekt na typ „nieznany”, a następnie rzutować go na oczekiwany typ obiektu.

let subID:number = 0;

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

TypeScript ma tylko podpowiedzi, bez rzutowania. Powoduje, że kompilator myśli, że jest liczbą, w czasie wykonywania nadal będzie ciągiem znaków, chyba że go przeanalizujesz.
k0pernikus

console.log(typeof <number><unknown>"1", typeof Number("1"))wydrukuje string number.
k0pernikus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.