Boş bir dize için parseInt'ten NaN'yi 0'a nasıl dönüştürebilirim?


298

NaNJavaScript'te değerleri ayrıştırmak yerine bir şekilde 0 döndürmek mümkün mü ?

Boş dize durumunda parseIntdöner NaN.

Kontrol etmek için JavaScript'te böyle bir şey yapmak mümkün mü NaN?

var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)

Ya da benzer bir şey yapabilen başka bir işlev veya jQuery eklentisi var mı?


72
Bilginize NaN != NaN. İhtiyacınız olacak isNaN(value).
pimvdb

28
Evet, iki dadı aynı değildir;)
James P.

3
Fonksiyonu parseInt()iki kez aramak (başarılı / normal NaNdurumda) asla iyi bir fikir değildir. Verimsizliğin yanı sıra, ne olursa olsun, geçilen tbbşey, yan etkileri olan bir işlev çağrısıdır, korkunçtur. Burada parseInt()iki kez gördüğüm herhangi bir çözüm kullanmazdım .
JonBrave

Yanıtlar:


756
var s = '';

var num = parseInt(s) || 0;

Boole değerleriyle kullanılmadığında, mantıksal OR ( ||) operatörü parseInt(s)true olarak değerlendirilebiliyorsa ilk ifadeyi ( ) döndürür, aksi takdirde ikinci ifadeyi (0) döndürür. Dönüş değeri parseInt('')NaN'dir. NaN yanlış olarak değerlendirilir, bu nedenle sonuç num0 olarak ayarlanır.


6
S = "4s" ise bu işe yaramaz; (4 döndürür ... bu yanlıştır ...)
markzzz


26
@markzzz Soruyu tekrar okuyun. OP soruyor: " Bir şekilde NaN yerine 0 döndürmek mümkün mü ". OP belirli bir dizenin int için ayrıştırılabilir olup olmadığını kontrol etmek istemez. OP 0yerine almak istiyor NaN. Bu Matt'in kodu ile mükemmel bir şekilde çözüldü.
trejder

2
@markzzzvar nextIphone = parseInt("4S") + 1; // wow it works!
Sıfır Oyalama

2
@Matthew lütfen "falsy" veya "truthy" terimlerini kullanın . çünkü NaN === false yanlıştır! ancak Boolean (NaN) === Boolean (yanlış) doğrudur. "doğru" olarak değerlendirilebiliyorsa, mantıksal VEYA ilk ifadeyi döndürür
Pablo Recalde

52

Ayrıca bu isNaN()işlevi kullanabilirsiniz :

var s = ''
var num = isNaN(parseInt(s)) ? 0 : parseInt(s)

12
Neden parseInt(s)iki kez aramalısınız ? Ayrıca olmalıparseInt(s, 10)
Dexygen

2
@GeorgeJempty "10" değerinde bir yarıçap varsayılan değerdir; bu parametre isteğe bağlıdır. parseInt()İki kez olsa arama iyi bir nokta .
Sonbahar Leonard

8
@AutumnLeonard bu sadece doğru. Dizeniz 0 ile başlıyorsa, sayının sekizlik biçiminde olduğu varsayılırsa, parseInt ('077') size 63 verir. Bu, hataları bulmak için çok kötü olabilir, bu nedenle her zaman ikinci parametreyi belirtmelisiniz. örneğin bkz. stackoverflow.com/questions/8763396/…
chuck258

22

Kimsenin kullanarak bahsetmiyorum görmek şaşırdı Number(). Verilmişse ondalık sayıları ayrıştıracağı kabul edilir, bu nedenle farklı bir şekilde hareket eder parseInt(), ancak zaten taban 10'u varsayar ve "" veya hatta "" değerini 0'a çevirir.


1
Evet, localStorage'dan okumak için çok kullanışlı: Number (localStorage.getItem ('appBanner.count')) + 1
Philip Murphy

Bu soru için sorulduğu gibi çalışırken, sayı olmayan boşluk olmayan karakterler için hala NaN döndürür
Kyle Delaney

9

Kısıtlı olmayan kişiler için parseInt, bitwise OR işlecini (örtük ToInt32olarak işlenenlerini çağırır ) kullanabilirsiniz.

var value = s | 0;

// NaN | 0     ==>> 0
// ''  | 0     ==>> 0
// '5' | 0     ==>> 5
// '33Ab' | 0  ==>> 0
// '0x23' | 0  ==>> 35
// 113 | 0     ==>> 113
// -12 | 0     ==>> -12
// 3.9 | 0     ==>> 3

Not: ToInt32farklıdır parseInt. (yani parseInt('33Ab') === 33)


Ama: '10000000000' | 0 === 1410065408.
trincot

@trincot evet, herhangi bir değer> = Math.pow(2, 31)taşacak.
Ahmad Ibrahim

8

Sorun

Diğer cevaplar 0yanlış olanı dikkate almaz ve bu nedenle 0 yerine 20 olacaktır:

const myNumber = parseInt('0') || 20; // 20

Çözüm

Sorunların çoğunu çözen bir yardımcı işlev öneriyorum:

function getNumber({ value, defaultValue }) {
  const num = parseInt(value, 10);
  return isNaN(num) ? defaultValue : num;
}

Yardımcı işlevi aşağıdaki sonuçları verecektir:

getNumber({ value: "0", defaultValue: 20 }); // 0
getNumber({ value: "2", defaultValue: 20 }); // 2
getNumber({ value: "2.2", defaultValue: 20 }); // 2
getNumber({ value: "any string", defaultValue: 20 }); // 20
getNumber({ value: undefined, defaultValue: 20 }); // 20
getNumber({ value: null, defaultValue: 20 }); // 20
getNumber({ value: NaN, defaultValue: 20 }); // 20
getNumber({ value: false, defaultValue: 20 }); // 20
getNumber({ value: true, defaultValue: 20 }); // 20

2
ParseInt için tabanını gönderin: parseInt(string, radix): bu dikkate parseInt("0x10") === 16Ayrıca parseInt("010")getirebilimektedir 8bazı tarayıcılarda
andlrc

2
Zaten başka şeyler için lodash'a bağlıysanız defaultTo, sadece bunu yapan kullanışlı bir işlev vardır: _.defaultTo(NaN, -1)döner -1, ancak _.defaultTo(0, -1);döner 0.
waldyrious

Bu mükemmel bir nokta! Sadece || sonunda tercih ettiğiniz varsayılan SIFIR olduğunda doğru varsayılanı sağlamak için (verilmiş, OP'nin istediği budur). Daha önce de belirttiğiniz gibi, '0' girişinin sahte yapısı nedeniyle, bu durumda geçersiz giriş olarak kabul edilir ve ifade varsayılan değeri döndürür (beklendiği gibi olmayabilir!)
JonathanDavidArndt

Elbette parseIntiki kez aramak yerine bir const kullanmalısınız
Kyle Delaney

4

Bence iş ayrıştırmaktan çok daha temiz mi, + işlecini kullan

var s = '';
console.log(+s);

var s = '1024'
+s
1024

s = 0
+s
0

s = -1
+s
-1

s = 2.456
+s
2.456

s = ''
+s
0

s = 'wtf'
+s
NaN

1
Çok kompakt. Daha fazla puan alamadığınız için ne yazık. Sana oy verdim. Lütfen sessiz bir trolle bugün elde edilen -2'mi yakalamaya çalışmak için karşılık verin ... (bu sayfanın sonundaki cevabımı görün). Teşekkür ederim.
Fabien Haddadi


1

Boş bir dize için ayrı bir denetim yapın (özel bir durum olduğu için) ve bu durumda sıfıra ayarlayın.

Başlangıca "0" yazabilir, ancak ardından ondalık sayı olduğunu ve sekizlik sayı olmadığını belirtmek için bir önek eklemeniz gerekir


yani boşsa 0 eklemenin daha iyi olduğunu mu düşünüyorsunuz?
Joper

1
Hayır - bu benim kullandığım bir yaklaşım. Bu durumda, ayrı bir kontrol woudl daha iyi olacaktır. Ancak Matts çözümü çalışıyorsa, bu daha da temizdir.
Schroedingers Cat

1

Neden işlevi geçersiz kılmıyorsunuz? Bu durumda her zaman döndürür emin olabiliriz 0durumunda NaN:

(function(original) {
    parseInt = function() {
        return original.apply(window, arguments) || 0;
    };
})(parseInt);

Şimdi, kodunuzun herhangi bir yerinde:

parseInt('') === 0

15
Bu işlevi geçersiz kılmak, bunu bir hata olarak görebilecek uzman JavaScript programcılarını karıştırabilir. Geçersiz kılınan işlevinizin, görülmesi muhtemel olmayan bir yere gömülmesi muhtemeldir. Bu yaratıcı, ama || 0Matt'in cevabında olduğu gibi sadece eklemenin ne kadar kolay olduğunu göz önünde bulundurarak kişisel olarak tavsiye edeceğimden emin değilim . Son çare olarak sahip olmadığınız veya geçersiz kılınan nesnelerin zaman ve karmaşıklık açısından önemli ölçüde daha pahalıya mal olacağını görüyorum.
jmort253

2
@ Jmort253 ile hemfikirim ... Tehlikeli çünkü fonksiyon çok akıllı. Tam olarak aynı işlevi yapmak daha iyidir, ancak getSafeNumberValue gibi bir ad veya bunun gibi bir adla.
Samuel

1

Ben gibi basit dizeleri ile benzer bir sorun (firefox v34) vardı:

var myInt = parseInt("b4");

Bu yüzden hızlı bir kesmek geldi:

var intVal = ("" + val).replace(/[^0-9]/gi, "");

Ve sonra basit olmayan şeyler için şamandıralar + ints ile başa çıkmak için tüm aptalca karmaşıklaştı:

var myval = "12.34";

function slowParseNumber(val, asInt){
    var ret = Number( ("" + val).replace(/[^0-9\.]/gi, "") );
    return asInt ? Math.floor(ret) : ret;
}
var floatVal = slowParseNumber(myval);

var intVal = slowParseNumber(myval, true);
console.log(floatVal, intVal);

Gibi şeyler için 0 döndürecektir:

var intVal = slowParseNumber("b"); // yeilds 0

1
//////////////////////////////////////////////////////
function ToInt(x){x=parseInt(x);return isNaN(x)?0:x;}
//////////////////////////////////////////////////////
var x = ToInt('');   //->  x=0
    x = ToInt('abc') //->  x=0
    x = ToInt('0.1') //->  x=0
    x = ToInt('5.9') //->  x=5
    x = ToInt(5.9)   //->  x=5
    x = ToInt(5)     //->  x=5

Bu çözümü açıklayabilir misiniz?
RamenChef

Eğer herhangi bir sayıyı ('123 'veya 123 gibi) tamsayıya dönüştürmek istiyorsanız, parseInt (' abc ') kullanacaksanız,
AbdulRahman AlShamiri

Eğer parseInt ('abc') kullanacaksanız, NaN alırsınız, ancak bu işlev
NaN'yi

Bingo, ||yaklaşıma açık bir alternatif olarak . Bu eski bir soru ve cevap olduğunu biliyorum, ama bu cevap parseInt'i iki kez çağırmayı önler ve isNaN'ı doğru kullanır. parseInt(x, 10)Kapsamlı olması için sadece sayı tabanı gerekir. (Benim tercihim yeniden kullanmak yerine ayrı bir iç değişken x.)
goodeye

1

Bunu benim için, bir sayı için ve diğeri bir String için işlemek için 2 prototip oluşturdum.

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

// returns the int value or -1 by default if it fails
Number.method('tryParseInt', function (defaultValue) {
    return parseInt(this) == this ? parseInt(this) : (defaultValue === undefined ? -1 : defaultValue);
});

// returns the int value or -1 by default if it fails
String.method('tryParseInt', function (defaultValue) {
    return parseInt(this) == this ? parseInt(this) : (defaultValue === undefined ? -1 : defaultValue);
});

Güvenlik kontrolünü kullanmak istemiyorsanız,

String.prototype.tryParseInt = function(){
    /*Method body here*/
};
Number.prototype.tryParseInt = function(){
     /*Method body here*/
};

Örnek kullanım:

var test = 1;
console.log(test.tryParseInt()); // returns 1

var test2 = '1';
console.log(test2.tryParseInt()); // returns 1

var test3 = '1a';
console.log(test3.tryParseInt()); // returns -1 as that is the default

var test4 = '1a';
console.log(test4.tryParseInt(0));// returns 0, the specified default value

1
// implicit cast
var value = parseInt(tbb*1); // see original question

Açıklama, önemsiz bulamayanlar için:

Birbiriyle çarpıldığında, "örtük döküm" adı verilen bir yöntem, bilinmeyen tür işlenenini ilkel tür olan 'sayı'ya dönüştürmeye çalışır. Özellikle, boş bir dize 0 rakamı olur ve parseInt () için uygun bir tür olur ...

Yukarıda + işaretinin başına geçmesini öneren ve JavaScript'i Number örtülü dökümünü kullanmaya zorlayan PirateApp tarafından çok iyi bir örnek verildi.


Asıl soruya doğrudan cevabım Sevgili.
Fabien Haddadi

Bu işe yaramayacakparseInt('str'*1)
Rodion Baskakov

Neden parseIntzaten sayı olan bir şeyi çağırmıyorsunuz? Bu, tekrar sayıya dönüştürmek için dizeye geri başka bir dönüşüme neden olacaktır.
trincot

0

Ayrıca bu şekilde, neden bir işlev yazmıyorsunuz ve gerektiğinde onu çağırmıyorsunuz. Hesaplamaları gerçekleştirmek için form alanlarına giriş olduğunu varsayıyorum.

var Nanprocessor = function (entry) {
    if(entry=="NaN") {
        return 0;
    } else {
        return entry;
    }
}

 outputfield.value = Nanprocessor(x); 

// where x is a value that is collected from a from field
// i.e say x =parseInt(formfield1.value); 

bunu yapmanın nesi yanlış?


Merhaba, wat bizi yukarıdaki yöntemi takip etmekten alıkoyuyor. Öğrenmek bilmek istiyorum.
Naresh

3
Test etmek için isNaN kullanmalısınız NaN.
Matthew

2
Teşekkürler Matt :) Javascripti isNaN () adlı bir işlev olduğunu bilmiyorum! Bilmeme izin verdiğin için teşekkürler...!
Naresh

0

İşte kullanıyorum bir tryParseInt yöntemi, bu varsayılan değer ikinci parametre olarak alır, böylece ihtiyacınız olan her şey olabilir.

function tryParseInt(str, defaultValue) {
    return parseInt(str) == str ? parseInt(str) : defaultValue;
}

tryParseInt("", 0);//0 
tryParseInt("string", 0);//0 
tryParseInt("558", 0);//558

0

hala sayı tabanı kullanımına izin veren bir yardımcı işlev

function parseIntWithFallback(s, fallback, radix) {
    var parsed = parseInt(s, radix);
    return isNaN(parsed) ? fallback : parsed;
}

0

Çok temiz bir kod olabilir, ben benzer sorunları vardı ve ben kullanarak çözüldü:

var a="bcd";
~~parseInt(a);

0

Bu çözümü arayan diğer insanlar için, sadece kullanın: ~~ parseInt olmadan, en temiz moddur.

var a = 'hello';
var b = ~~a;

NaN ise, bunun yerine 0 döndürür.

OBS. Bu çözüm yalnızca tamsayılar için geçerlidir

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.