Javascript NaN dönüştürmek


238

Bir if ifadesi olmadan NaN değerlerini 0'a dönüştürmenin bir yolu var mı:

if (isNaN(a)) a = 0;

Değişkenlerimi her seferinde kontrol etmek çok can sıkıcı.


4
Sadece bir işleve çeviremez misin?
the_drow

Bu sadece 20 karakter gibi, sorun nedir?
Rusty Fausak

1
function noNaN( n ) { return isNaN( n ) ? 0 : n; }ve sonra sadecenoNaN( a )
Šime Vidas

1
@rfausak Genellikle kendinizi tekrarlamak istemezsiniz (bakınız KURU ). Belirli bir işleve birden çok kez ihtiyaç duyulursa, özel bir işlev tercih edilir.
Šime Vidas

Yanıtlar:


575

Bunu yapabilirsiniz:

a = a || 0

... herhangi bir "falsey" değerinden bir 0.

"Falsey" değerleri:

  • false
  • null
  • undefined
  • 0
  • "" (boş dize)
  • NaN (Sayı Değil)

Ya da isterseniz:

a = a ? a : 0;

... yukarıdaki ile aynı etkiye sahip olacak.


Niyet sadece daha fazlasını test etmekseNaN , aynısını yapabilirsiniz, ancak önce bir toNumber dönüşümü yapabilirsiniz .

a = +a || 0

Bu, abir sayıya dönüştürmeyi denemek için unary + operatörünü kullanır . Bu, sayısal dizeler gibi şeyleri '123'bir sayıya dönüştürme avantajına sahiptir .

Beklenmeyen tek şey, birisinin bir sayıya başarıyla dönüştürülebilen bir Array'ı geçmesi olabilir:

+['123']  // 123

Burada, sayısal bir dize olan tek bir üyesi olan bir Dizi var. Başarıyla bir sayıya dönüştürülecek.


Doğrulamayı bir işleve dönüştürme fikri iyidir, ancak bu daha zariftir.
Tamás Pap

1
@Bakudan: Güzel nokta. OP'nin sadece belirli bir NaNdeğerle ilgilendiğini düşünüyordum . Bu, tüm sayı olmayan değerler için bir test olarak çalışmaz. Her ne kadar önce bir toNumber dönüşümü deneyebilseydik. Güncelleyeceğim.
user113716

... ah, "NaN'yi 0'a çevir" başlığı yüzünden . Her neyse, şimdi her iki yolu da kapsıyor.
user113716

2
Teşekkürler dostum, kendim için biraz seçtim ve değiştirdim a = a * 1 || 0
Biri

Muhteşem. Teşekkürler
Apit John Ismail

32

Bir çift tilde kullanmak (çift bitsel DEĞİL) - ~~- JavaScript'te bazı ilginç şeyler yapar. Örneğin, yerine Math.floorveya hatta alternatif olarak kullanabilirsiniz parseInt("123", 10)! Web üzerinde çok tartışıldı, bu yüzden neden burada işe gitmeyeceğim, ancak ilgileniyorsanız: JavaScript "çift dalga" (~~) operatörü nedir?

NaNBir sayıya dönüştürmek için çift ​​tilde bu özelliğinden yararlanabiliriz ve mutlulukla bu sayı sıfırdır!

console.log(~~NaN); // 0


1
Teşekkürler, ben bu konuda bilmiyordum ~~ben sadece ile yanındaki kullandı, hiç parseFloat()şöyle: ~~parseFloat($variable);. Çok temiz :) +1
Rens Tillmann


4

Her şey için daha basit ve etkili bir şey:

function getNum(val) {
   val = +val || 0
   return val;
}

... herhangi bir "falsey" değerinden bir 0.

"Falsey" değerleri:

  • false
  • null
  • undefined
  • 0
  • "" (boş dize)
  • NaN (Sayı Değil)

1
İlginç! Val'nin negatif bir değer olabileceği zaman nasıl tepki verdiğini merak etmek. Test ettiğim kadarıyla bu konuda yanlış bir şey yok, ama her ihtimale karşı ...
Luciano

2

Devam edebilmeniz için bunu yapmak yerine, neden yedeklenip neden bir NaN ile karşılaştığınızı merak etmiyorsunuz?

Bir işlemin sayısal girişlerinden herhangi biri NaN ise, çıkış da NaN olacaktır. Mevcut IEEE Kayan Nokta standardı bu şekilde çalışır (sadece Javascript değildir). Bu davranış iyi bir nedendir : temel amaç, sahte olduğunu fark etmeden sahte bir sonuç kullanmamanızı sağlamaktır.

NaN'ın çalışma şekli, bazı alt alt operasyonlarda bir şeyler ters giderse (bu daha düşük seviyede bir NaN üretiyorsa), nihai sonuç da NaN olacaktır ; hata işleme mantığı (fırlatma / yakalama belki?) henüz tamamlanmadı.

Bir aritmetik hesaplamanın sonucu olarak NaN, her zaman aritmetiğin ayrıntılarında bir şeyin ters gittiğini gösterir. Bilgisayar için "burada hata ayıklama gerekli" demenin bir yolu. Neredeyse hiç doğru olmayan bir sayı ile devam etmek için bir yol bulmak yerine (0 gerçekten istediğiniz nedir?), Neden sorunu bulamıyor ve düzeltmiyorsunuz.

JavaScript yaygın bir sorun hem olmasıdır parseInt(...)ve parseFloat(...)bir saçma argüman (verilirse NaN dönecektir null, ''vs.). Sorunu daha yüksek bir düzeyden ziyade mümkün olan en düşük düzeyde düzeltin. Daha sonra, genel hesaplamanın sonucunun anlamlı olması için iyi bir şansı vardır ve tüm hesaplamanın sonucu olarak bazı sihirli sayıları (0 veya 1 veya her neyse) değiştirmezsiniz. ((ParseInt (foo.value) || 0) öğesinin hilesi yalnızca toplamlar için geçerlidir, ürünler için değil - varsayılan değerin 0 yerine 1 olmasını istediğiniz, ancak belirtilen değer gerçekten 0 ise değil.)

Belki de kodlama kolaylığı için bir işlevin kullanıcıdan bir değer almasını, temizlemesini ve gerekirse varsayılan bir değer vermesini istersiniz:

function getFoobarFromUser(elementid) {
        var foobar = parseFloat(document.getElementById(elementid).innerHTML)
        if (isNaN(foobar)) foobar = 3.21;       // default value
        return(foobar.toFixed(2));
}

2

Normal ifadeye ne dersiniz ?

function getNum(str) {
  return /[-+]?[0-9]*\.?[0-9]+/.test(str)?parseFloat(str):0;
}

Aşağıdaki kod, düzgün girilmiş sayıların hesaplanmasına izin vermek için NaN'yi yok sayar.


2

ParseInt kullanmaya çalışıyorsanız isNaN kullanılan yöntemler çalışmaz, örneğin:

parseInt("abc"); // NaN
parseInt(""); // NaN
parseInt("14px"); // 14

Ancak ikinci durumda isNaN yanlış üretir (yani boş dize bir sayıdır)

n="abc"; isNaN(n) ? 0 : parseInt(n); // 0
n=""; isNaN(n) ? 0: parseInt(n); // NaN
n="14px"; isNaN(n) ? 0 : parseInt(n); // 14

Özet olarak, boş dize isseNt tarafından geçerli bir sayı olarak kabul edilir, ancak parseInt tarafından değil. OSX Mojave'de Safari, Firefox ve Chrome ile doğrulandı.


1
Açık bir çözüm biraz hantal, parseInt'den sonra NaN olup olmadığını kontrol edin, daha önce değil: isNaN (parseInt (n))? parseInt (n): 0; // ayrıştırmayı iki kez çağırır :(
David Crowe

1
bu yorum cevabınızın (başlangıcı) olmalı!
frandroid

Daha verimli bir çözüm, null dizenin tek anomali olduğunu varsayar: n == "" || isNaN (n)? 0: ayrıştırma (n); (ama başka dizeler varsa?)
David Crowe

1
var i = [NaN, 1,2,3];

var j = i.map(i =>{ return isNaN(i) ? 0 : i});

console.log(j)

[0,1,2,3]


0

kullanıcı 113716 çözüm kullanarak, bu arada tüm bu önlemek için harika-başka ben bu şekilde uyguladım alt toplam metin kutusu metin kutusu birimi ve metin kutusu miktarından hesaplamak için.

Birim ve miktar metin kutularında sayı olmayan işlemlerin yazılmasında, değerleri sıfır ile değiştirilir, bu nedenle kullanıcı verilerinin son gönderilmesinde sayı yoktur.

     <script src="/common/tools/jquery-1.10.2.js"></script>
     <script src="/common/tools/jquery-ui.js"></script>

     <!----------------- link above 2 lines to your jquery files ------>





    <script type="text/javascript" >
    function calculate_subtotal(){

    $('#quantity').val((+$('#quantity').val() || 0));
    $('#unit').val((+$('#unit').val() || 0));

    var  calculated = $('#quantity').val() * $('#unit').val() ;
    $('#subtotal').val(calculated);


    }
    </script>


      <input type = "text" onChange ="calculate_subtotal();" id = "quantity"/>
      <input type = "text" onChange ="calculate_subtotal();" id = "unit"/>
      <input type = "text" id = "subtotal"/>

0

Lütfen bu basit işlevi deneyin

var NanValue = function (entry) {
    if(entry=="NaN") {
        return 0.00;
    } else {
        return entry;
    }
}
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.