TypeScript'te bir string'i sayıya çevirmek için Number(text) çağırın. Sonuç number tipindedir ve metin geçerli bir sayı değilse NaN olur. Sonunda karakterler bulunan metinler için, örneğin "42px", parseInt(text, 10) veya parseFloat(text) kullanın.
Dört dönüşümün hepsi number tipini döndürür. TypeScript metnin geçerli olup olmadığını bilmez; geçersiz bir string yine bir number verir ve değeri NaN olur.
Neden Dönüştürmeniz Gerekir
Form alanları, URL parametreleri, ortam değişkenleri ve dosya içerikleri string olarak gelir. TypeScript bunlardan birini sayı beklenen bir yerde kullanmanıza izin vermez:
index.ts(3,23): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
Bir string üzerinde -, * ve / ile aritmetik bir hatadır. + işlemine izin verilir ama birleştirme yapar, yani "3" + 10 sonucu "310" string'idir; dönüşümün önce gelmesi gerekmesinin nedeni budur: Number(quantity) * 10.
Bir type assertion da işe yaramaz. quantity as number reddedilir (TS2352) ve onu as unknown as number ile zorlamak yalnızca derleyiciyi susturur: değer çalışma zamanında string olarak kalır.
Number, parseInt, parseFloat ve Tekli Artı
Dört fonksiyon temiz girdide aynı sonucu verir, geri kalan her şeyde ayrışır. Bu tablo her birinin Node üzerindeki gerçek çıktısıdır:
| Girdi | Number(s) | +s | parseInt(s, 10) | parseFloat(s) |
|---|---|---|---|---|
"42" | 42 | 42 | 42 | 42 |
"3.99" | 3.99 | 3.99 | 3 | 3.99 |
"42px" | NaN | NaN | 42 | 42 |
"" | 0 | 0 | NaN | NaN |
" 3 " | 3 | 3 | 3 | 3 |
"1e3" | 1000 | 1000 | 1 | 1000 |
"0x1F" | 31 | 31 | 0 | 0 |
"1,000" | NaN | NaN | 1 | 1 |
"12_000" | NaN | NaN | 12 | 12 |
"abc" | NaN | NaN | NaN | NaN |
Tablonun arkasındaki kurallar:
Numberve tekli+aynıdır. Boşlukları kırptıktan sonra string'in tamamını dönüştürür,1e3ve0xhex yazımını anlar ve geriye bir şey kalırsaNaNdöndürür. Boş ya da yalnızca boşluk içeren bir string0olur.parseIntveparseFloatbaştan okur ve kullanamadıkları ilk karakterde durur, bu yüzden"42px"ve"1,000"kısmi sayılar verir. Boş bir stringNaNolur.parseIntkesirli kısmı atar ve üsleri anlamaz:"1e3"girdisindeekarakterinde durur.- Sayısal ayırıcılar (
12_000) kaynak kodda geçerlidir, string'lerde değil.
Girdiyi doğrulamak için daha katı seçenek Number fonksiyonudur. parseInt ve parseFloat, CSS boyutları gibi gerçekten bir birim veya ek taşıyan metinlere uygundur.
Geçersiz Girdiyi Ele Almak: NaN
NaN değerinin tipi number olduğu için derleyici onun hakkında asla uyarmaz. Sonucu kendiniz Number.isNaN veya Number.isFinite ile kontrol edin:
number | undefined döndürmek, başarısızlığı tipin bir parçası yapar; böylece her çağıran aritmetik yapmadan önce onu ele almak zorundadır. Number.isFinite, Number("Infinity") fonksiyonunun seve seve döndürdüğü Infinity değerini de reddeder.
Global isNaN(x) fonksiyonundan kaçının: argümanını önce dönüştürür, bu yüzden JavaScript'te isNaN("abc") sonucu true olur. TypeScript'in bildirimi yalnızca bir number kabul eder, bu yüzden bir string vermek TS2345 hatasıdır; bu da zaten dönüştürülmüş bir değer üzerinde Number.isNaN kullanmanız gerektiğine dair bir ipucudur.
String'i Tam Sayıya Çevirmek
parseInt fonksiyonuna her zaman ikinci argümanını, tabanı (radix) verin: ondalık metin için 10. İsteğe bağlıdır ama niyeti belgeler ve başka tabanlar için önemlidir. Ondalıklı bir string'den tam sayı almak için önce dönüştürün, sonra açıkça yuvarlayın.
parseInt bir string bekler: parseInt(12.7) bir derleme hatasıdır (TS2345). Bu işe yarar, çünkü JavaScript'te bir sayı üzerinde çağrılan parseInt onu önce metne çevirir ve 0.0000005 gibi değerlerde yanlış sonuç verir (5 döndürür). Sayılar için Math.trunc kullanın. Number.MAX_SAFE_INTEGER ötesindeki tam sayılar için BigInt(text) tam değeri ayrıştırır (geçersiz metinde NaN döndürmek yerine bir SyntaxError fırlatır).
Sayıyı String'e Çevirmek
String(n), n.toString() ve `${n}` ifadelerinin her biri bir sayıyı en kısa string biçimine çevirir. Biçimlendirme metotları daha fazla kontrol sağlar:
toFixed sizin yazdığınız ondalık sayıyı değil, ikili (binary) değeri yuvarlar; bu yüzden (1.005).toFixed(2) sonucu "1.00" olur: 1.005 aslında 1.005'ten biraz küçük olarak saklanır. Para için tutarları tam sayı kuruş olarak tutun ya da Intl.NumberFormat ile biçimlendirin.
String(n) ayrıca null ve undefined üzerinde de çalışır ("null" ve "undefined" verir); n.toString() ise değer eksik olabileceği için strict altında bir derleme hatası olurdu.
Hızlı Başvuru
| Görev | Kod | Sonuç tipi |
|---|---|---|
| String'den sayıya, katı | Number(s) veya +s | number (belki NaN) |
| Metnin başındaki tam sayı | parseInt(s, 10) | number (belki NaN) |
| Metnin başındaki ondalık sayı | parseFloat(s) | number (belki NaN) |
| Sonucu kontrol etmek | Number.isFinite(n), Number.isNaN(n) | boolean |
| Büyük tam sayı | BigInt(s) | bigint |
| Sayıdan string'e | String(n), n.toString(), `${n}` | string |
| Sabit ondalık | n.toFixed(2) | string |
| Başka taban | n.toString(16) | string |
| Binlik ayırıcılar | n.toLocaleString("en-US") | string |
Sıkça Sorulan Sorular
TypeScript'te bir string nasıl sayıya çevrilir?
Number(text) kullanın. Bir number döndürür: geçerli sayısal metin için değerin kendisini, diğer her şey için NaN ve boş ya da yalnızca boşluk içeren bir string için 0. Metnin sonunda "42px" gibi karakterler olabiliyorsa parseInt(text, 10) veya parseFloat(text) kullanın.
Bir string'i as number ile sayıya cast edebilir miyim?
as number ile sayıya cast edebilir miyim?Hayır. "42" as number bir derleme hatasıdır (TS2352) ve unknown üzerinden zorlansa bile bir assertion yalnızca derleyicinin gördüğü tipi değiştirir: çalışma zamanında değer hâlâ "42" string'idir. Değeri Number(), parseInt() veya parseFloat() ile dönüştürün.
TypeScript'te Number() ile parseInt() arasındaki fark nedir?
Number string'in tamamını dönüştürür ve herhangi bir kısmı sayısal değilse NaN döndürür, yani Number("42px") sonucu NaN olur. parseInt baştan rakamları okur ve rakam olmayan ilk karakterde durur, yani parseInt("42px", 10) sonucu 42 olur; ondalık kısmı da atar. Number("") sonucu 0, parseInt("") sonucu ise NaN olur.
Bir string'in geçerli bir sayı olup olmadığını nasıl kontrol ederim?
Dönüştürün ve sonucu test edin: const n = Number(text); if (text.trim() !== "" && Number.isFinite(n)) { ... }. Boş string kontrolü önemlidir, çünkü Number("") sonucu 0 olur. Global isNaN yerine Number.isNaN kullanın; TypeScript global olanı zaten yalnızca number argümanıyla kabul eder.
TypeScript'te bir sayı nasıl string'e çevrilir?
String(n), n.toString() veya bir template literal `${n}` aynı sonucu verir. Sabit sayıda ondalık için n.toFixed(2), başka bir taban için n.toString(16), binlik ayırıcılar için n.toLocaleString("en-US") kullanın.