Daktiloda, Dizenin Sayısal olup olmadığı nasıl kontrol edilir


184

Typescript'te bu, isNaN'nin yalnızca sayısal değerleri kabul ettiğini söyleyen bir hata gösterir

isNaN('9BX46B6A')

ve bu nedenle döner false parseFloat('9BX46B6A')için değerlendirir9

isNaN(parseFloat('9BX46B6A'))

Yine de Visual Studio'da gösterilen hatayla çalışabilirim, ancak doğru şekilde yapmak istiyorum.

Şu anda, bu değiştirilmiş işlevi yazdım -

static isNaNModified = (inputStr: string) => {
    var numericRepr = parseFloat(inputStr);
    return isNaN(numericRepr) || numericRepr.toString().length != inputStr.length;
}

Yanıtlar:


338

Bir dizeyi sayıya dönüştürmenin yolu Number, değildir parseFloat.

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

Stenografi isterseniz tekli artı operatörünü de kullanabilirsiniz:

+'1234' // 1234
+'9BX9' // NaN

NaN'ye (operatör ===ve !==beklendiği gibi çalışmaz NaN) karşı kontrol ederken dikkatli olun . kullanın:

 isNaN(maybeNumber) // returns true if NaN, otherwise false

18
Bu şu anlama gelir mi: if (isNaN (+ possibleNumberString)) geçerli bir kontrol yöntemi mi?
Mathijs Segers

5
Neden kullanırsınız Numberyukarıda parseIntveya parseFloat? beklediğime daha uygun olan Number('')verir iken 0 parseInt('')verir NaN.
Didii

6
Orijinal soruda belirtildiği gibi , parseInt('9BX9')(ve parseFloat('9BX9')) dönmeyecek 9, dönmeyecek NaN. Boş bir dizenin 0'a dönüştürülmesini istemiyorsanız, önce boş dizeyi açıkça kontrol edin.
C Snover

1
Bunu kontrol etmek istiyorsanız, isNaN(Number(what_ever))yerine kullanın Number(what_ever) === Nan.
k0pernikus

3
@sauntimo Numberbir TypeScript işi değildir, bir değeri kabul eden ve bir yapıcıdan ziyade bir işlev olarak çağrıldığında ilkel bir sayı döndüren yerleşik bir EcmaScript yapıcı işlevidir .
C Snover

46

Güncelleme 2

Bu yöntem artık rxjs v6'da mevcut değildir

Ben rxjs kütüphanesinden ( rxjs / util / isNumeric ithal isNumeric operatörü kullanarak çözdüm

Güncelleme

import { isNumeric } from 'rxjs/util/isNumeric';

. . .

var val = "5700";
if (isNumeric(val)){
   alert("it is number !");
}

5
Bu yöntem artık rxjs v6'da mevcut değildir.
Logic01

35
function isNumber(value: string | number): boolean
{
   return ((value != null) &&
           (value !== '') &&
           !isNaN(Number(value.toString())));
}


3

Mevcut ve zaten test edilmiş bir çözümü seçerdim. Örneğin, rsjs'den daktilodaki bu:

function isNumeric(val: any): val is number | string {
  // parseFloat NaNs numeric-cast false positives (null|true|false|"")
  // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
  // subtraction forces infinities to NaN
  // adding 1 corrects loss of precision from parseFloat (#15100)
  return !isArray(val) && (val - parseFloat(val) + 1) >= 0;
}

rxjs / isNumeric.ts

Rxjs isArray () işlevi olmadan ve basitleştirilmiş yazımlarla:

function isNumeric(val: any): boolean {
  return !(val instanceof Array) && (val - parseFloat(val) + 1) >= 0;
}

Bu tür fonksiyonları her zaman kullanım durumlarınızla test etmelisiniz. Özel değer türleriniz varsa, bu işlev sizin çözümünüz olmayabilir. İşlevi burada test edebilirsiniz.

Sonuçlar:

enum         : CardTypes.Debit   : true
decimal      : 10                : true
hexaDecimal  : 0xf10b            : true
binary       : 0b110100          : true
octal        : 0o410             : true
stringNumber : '10'              : true

string       : 'Hello'           : false
undefined    : undefined         : false
null         : null              : false
function     : () => {}          : false
array        : [80, 85, 75]      : false
turple       : ['Kunal', 2018]   : false
object       : {}                : false

Gördüğünüz gibi, bu işlevi numaralandırmalarla kullanırsanız dikkatli olmalısınız.


1

Çoğu zaman kontrol etmek istediğimiz değer dize veya sayıdır, bu yüzden burada kullandığım işlev:

const isNumber = (n: string | number): boolean => 
    !isNaN(parseFloat(String(n))) && isFinite(Number(n));

Kodlar ve kutu testleri .

const willBeTrue = [0.1, '1', '-1', 1, -1, 0, -0, '0', "-0", 2e2, 1e23, 1.1, -0.1, '0.1', '2e2', '1e23', '-0.1', ' 898', '080']

const willBeFalse = ['9BX46B6A', "+''", '', '-0,1', [], '123a', 'a', 'NaN', 1e10000, undefined, null, NaN, Infinity, () => {}]

1

Number.isFinite()İşlevi kullanabilirsiniz :

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false
Number.isFinite('0');       // false
Number.isFinite(null);      // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true

Not: Global işlev isFinite()ve ikincisi arasında önemli bir fark vardır Number.isFinite(). Eski durumunda, dize zorlama yapılır - bu yüzden isFinite('0') === trueiken Number.isFinite('0') === false.

Ayrıca, bunun IE'de mevcut olmadığını unutmayın!


Ancak ... TS2345: '"1" türündeki bağımsız değişken,' sayı 'türündeki parametreye atanamaz. Number.isFinite (Number ('0'));
Mcgri

0

Angular'daki tam sayılar (float olmayanlar) için şunları kullanabilirsiniz:

if (Number.isInteger(yourVariable)) { ... }


1
Number.isIntegersadece yourVariablezaten bir numbertür olan bir tam sayı olup olmadığını söyler . Dizelerle çalışmaz. Yani, Number.isInteger(Number(yourVariable))hile yapabilir.
tarrball

-2

Bir dizenin sayı olarak ayrıştırılıp ayrıştırılamayacağı bir çalışma zamanı sorunudur. Daktilo, derleme zamanı (çalışma zamanı değil) güvenliğine odaklandığından bu kullanım durumunu desteklemez.


11
Bir hata olarak işaretlemek, sanki doğru olmadığını önermek gibi bir endişe yeterlidir.
Jane Panda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.