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.