Baştaki sıfırlarla birlikte Javascript parseInt ()


121

Javascript'in parseInt işlevi tamamen çalışmıyor gibi görünüyor.

parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0

Bunu açıklayamazsın. Bir şans ver. (jsFiddle)

Düzenle Bu soru sorulup yanıtlandığından beri, sekizlik tabana varsayılan ayar "özelliği" kullanımdan kaldırıldı. [ 1 ] [ 2 ]


30
şaka yapıyor olmalısın
georg

6
You can't explain that. Evet yapabilirsiniz => developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Rocket Hazmat

3
Yaşlardan beri, 0 ile başlayan herhangi bir sayı OCTAL'ı ve 0x Hexa-Decimal'ı temsil eder. Bunun tüm diller için evrensel olduğuna inanıyorum, ancak yine yanılıyor olabilirim.
Selvakumar Arumugam

3
Bilginize: jsFiddle , daha iyi çevrimiçi JavaScript test cihazıdır w3schools.com/jsref/tryit.asp .
Rocket Hazmat

2
@JohnHartsock Evet, ikimiz de bu yazıda olduğumuz için stackoverflow.com/questions/8761997/…
savinger

Yanıtlar:


183

Bunun nedeni, bir sayı '0' ile başlıyorsa, 8 tabanı (sekizlik) olarak kabul edilir.

Tabanı 2. parametre olarak geçerek tabanı zorlayabilirsiniz.

parseInt("09", 10) // 9

Dokümanlara göre 2. parametre isteğe bağlıdır, ancak örneğinizden de görebileceğiniz gibi her zaman 10 olduğu varsayılmamaktadır.


1
evet, ancak sekizlik olduğu varsayılırsa, 0 yerine 11'e 11
döndürülmelidir.

2
@PeeyushKushwaha: Diğer yol. 118 9tabanındaki taban 10'dur. 09geçerli bir taban 8 sayısı değildir.
Rocket Hazmat

Ama ayrıştırdıktan sonra 09 istiyorum, bunun bir yolu var mı
Pardeep Jain

39

Çağrılar parseInther zaman ikinci bağımsız değişkende bir temel belirtmelidir:

parseInt("08", 10);

JavaScript'in önceki sürümleri, 0sekizlik olarak başlayan dizeleri (taban belirtilmediğinde) ele alır ve ne geçerli sekizlik sayılar ne 08de değildir 09.

Mozilla belgelerinden :

Radix tanımsız veya 0 ise, JavaScript aşağıdakileri varsayar:

  • Girdi dizesi "0x" veya "0X" ile başlıyorsa, taban 16'dır (onaltılık).
  • Giriş dizesi "0" ile başlıyorsa, radix sekizdir (sekizlik). Bu özellik standart değildir ve bazı uygulamalar bunu kasıtlı olarak desteklemez (bunun yerine taban 10'u kullanır). Bu nedenle , parseInt kullanırken her zaman bir radix belirtin .
  • Girdi dizesi başka herhangi bir değerle başlıyorsa, radix 10'dur (ondalık).

İlk karakter sayıya dönüştürülemezse, parseInt NaN değerini döndürür.

Ve ECMAScript 3 standardından:

Radix 0 veya tanımsız olduğunda ve dizenin numarası bir 0 rakamıyla başladığında, ardından bir x veya X gelmediğinde , uygulama, kendi takdirine bağlı olarak, sayıyı sekizlik veya ondalık olarak yorumlayabilir. Uygulamalar, bu durumda sayıları ondalık sayı olarak yorumlamaya teşvik edilir.

JavaScript'in en son sürümü ( ECMAScript 5 ) bu davranışı terk eder , ancak eski tarayıcıları tatmin etmek için yine de tabanı belirtmelisiniz .


Bu artık kullanılmadığına göre, gelecekte baştaki sıfırları kullanmakta sorun olmayacak değil mi?
Pacerier

15

Bir Radix parametresi var

parseInt(value, base)

Tabanın temel olduğu yer.

Bu durumda base10 (ondalık) sayıları değerlendiriyorsunuz, bu nedenle kullanın

parseInt(value, 10);

4

Bu, yeni tarayıcılarda tamamen geçerli görünmüyor. Internet Explorer 9 ve 10, 'parseInt ("08")' i çalıştırırsanız 8 döndürür, oysa Internet Explorer 8 ve önceki sürümler 0 döndürür (tuhaf modda IE10 da 0 döndürür).

Chrome'un en son sürümü de 8 döndürüyor, bu nedenle yakın zamanda yorumu değiştirmiş olmalılar.


Evet, davranış değişti. Cevabımı güncelleyeceğim. developer.mozilla.org/en-US/docs/JavaScript/Reference/…
Wayne

1
Evet, Firefox ve Chrome'un son sürümünün şu anda bir sorunu yok.
mithicalcoder

3

Bu sorun artık kullanımdan kaldırılmıştır. Ancak parseInt, diğer bazların sayısını taban-10'a dönüştürmek için yine de radix'i kullanabilirsiniz . Örneğin,

var baseTwoNumber = parseInt('0010001', 2);

döner 17(ki bu, 10 tabanında 0010001).


0

İpucu: Artık bildiğiniz gibi, sekizlik biçime varsayılan değer ne zaman kullanımdan kaldırıldı. Eski tarayıcılarda bunu nasıl düzelteceğiniz aşağıda açıklanmıştır

// ES-5 15.1.2.2
if (parseInt('08') !== 8 || parseInt('0x16') !== 22) {
    parseInt = (function (origParseInt) {
        var hexRegex = /^0[xX]/;
        return function parseIntES5(str, radix) {
            str = String(str).trim();
            if (!Number(radix)) {
                radix = hexRegex.test(str) ? 16 : 10;
            }
            return origParseInt(str, radix);
        };
    }(parseInt));
}

Not: Başında sıfır olan (dizge yerine) yalnızca sabit bir sayı kullanırsanız, mevcut tüm tarayıcılarda yine de taban 8 olarak kabul edilir.
Agamemnus

0

Sorun artık çoğu tarayıcıda değişmiş gibi görünüyor.

Firefox 51.0.1 (64 bit)

parseInt("09")   // 9

Chrome 55.0.2883.95 (64 bit)

parseInt("09")   // 9

Safari 10.0 (12602.1.50.0.10)

parseInt("09")   // 9

=====

Önerilen Uygulama

Bunu söyledikten sonra, sadece daha güvenli tarafta olmak ve sorunları önlemek için, kabul edilen cevapta önerildiği gibi temel / radix parametresini kullanın .

parseInt("09", 10)    // 9

Ekstra test

Argüman bir dizge değilse, bunu da test etmek istedim. Chrome ve Safari kesin sonuç verir. Firefox da uygun sonucu döndürür, ancak bir uyarı verir.

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)

Değer 0 ile başlıyorsa ve bir sayı ise, parseInt hala 8 tabanını kullanacaktır.
ParseInt

Evet. Önerilen cevaba bile işaret ettim. Ve kaçınılması gereken en iyi uygulamaları ve kötü özellikleri biliyorum. Bu yüzden cevabımda Önerilen uygulamayı da verdim.
mitolojik
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.