Ana içeriğe atla

JavaScript: parseInt() problemi ve çözümü

Bristol Festivali'nden bir graffitiBir ara JavaScript'lee uğraşırken bu fonksiyon yüzünden çıldıracaktım. İngilizce kaynakları okuduktan sonra Türkçesiyle de karşılaşınca olayın iç yüzünü paylaşayım istedim. Aynen alıntılıyorum:

JavaScript parseInt() fonksiyonunu nasıl bilirdiniz? Parametre olarak aldığı değerden bir tam sayı ortaya çıkartmaya çalışan güzide bir JavaScript fonksiyonu olan parseInt() geçen gün beni hayretler içerisinde bıraktı. Buyrun başıma geleni kendiniz görün. (Firebug kullananlar direkt console'da kodları çalıştırabilirler.)

parseInt('06'); // 6
parseInt('07'); // 7
parseInt('08'); // 0
parseInt('09'); // 0

Durumu bilenler hınzırca gülümsemiş olabilirler amma velakin bilmeyenler eminim benim gibi ufak bir şaşkınlık geçirmişlerdir. İlk aklıma gelen soru "Acaba fonksiyonda bir bug mı var?" sorusu oldu. Ufak bir araştırma konu hakkındaki cehaletimi ortaya koydu. Kısaca:

It's not a bug, it's a feature! (Bu bir hata değil bir özelliktir.)

Efendim bu parseInt() fonksiyonu iki parametre ile çalışabilen bir fonksiyonmuş. İkinci parametre seçime bağlı olarak kullanılabiliyormuş ve fakat kullanılmadığında varsayılan bir değer atanmıyormuş. Şöyle ki;


  • Eğer işlenecek parametre "0x" ile başlıyorsa, fonksiyon parametrenin 16'lık düzende bir sayı olduğunu varsayıp ona göre davranıyor.

  • Eğer işlenecek parametre "0" ile başlıyorsa bu durumda da fonksiyon parametrenin 8'lik düzende bir sayı olduğunu varsayarak ona göre davranıyor.

  • İlk iki durum geçerli değilse bu durumda fonksiyon parametreyi 10'luk düzende ele alıp sonuç üretmeye çalışıyor.

Bizim problemimiz ikinci varsayımdan kaynaklanıyor. 10'luk düzende bir sonuç beklentisiyle fonksiyona "08" ya da "09" değerlerini parametre olarak verdiğimizde, fonksiyon ikinci varsayıma göre hareket ediyor. Fakat 8'lik düzende 08 ya da 09'un karşılığı olmadığından doğru bir sonuç döndürmüyor. Peki bu durumdan nasıl kaçınabiliriz? İkinci parametreyi kullanarak.

parseInt fonksiyonu ikinci parametre olarak işlem yapacağı sayı düzenini alabiliyor. Yani fonksiyonu şu şekilde çalıştırırsak istediğimiz sonuca ulaşabiliriz.

parseInt('06',10); // 6
parseInt('07',10); // 7
parseInt('08',10); // 8
parseInt('09',10); // 9

Çalışma anında bu tip problemlerin ortaya çıkmasının önüne geçmek için her zaman parseInt fonksiyonuna sayı düzenini ikinci parametre olarak geçmenizi tavsiye ederim.

Alıntı: http://www.karalamalar.net/javascript-parseint-basinizi-agritmasin/

Yorumlar

Bu blogdaki popüler yayınlar

Geliyorum Josephine, yıkanma!

Toplumların temizlik anlayışı tarih boyunca değişmiş. Şimdi yaşanan ise küresel ölçekli bir değişim. Modern yaşamı etkisi altına alan hijyen ideolojisi, getirdiği standartlarla doğal ve insani olanı dışlıyor. Katherine Ashenburg Dirt on Clean adlı kitabında temizlik pratiklerini anlatıyor. Her kültürün kendine, pislik ile aşırı titizlik arasında en mükemmel nokta olarak seçtiği bir temizlik anlayışı var. Modern, orta sınıf Kuzey Amerikalılar için "temiz" kelimesi her gün aksatmadan duş almak ve ardından da parfüm sıkmak anlamına geliyor. Oysa 17. yüzyıl aristokrat Fransız erkeği için temizlik, her gün iç çamaşırını değiştirmek, ellerine su serpmek ve vücudunun geri kalanına su ya da sabun değdirmemek anlamına geliyordu. Birinci yüzyılda Romalılar için iki saat ya da daha uzun süreler vücudu farklı sıcaklıklarda suyla ıslatmak, metal bir aletle vücudun terini ve yağını kazımak demekti. Son olarak da tüm vücut yağlanarak temizlenme işi tamamlanıyordu. Her gün, herkes bir a...

Knorr salata sosu, fesleğenli ve kekikli - Tarifini açıklıyorum :)

Bir yıl öncesine kadar bu sosu çok tüketiyordum. Salataya çok güzel bir tat katıyor. 4 kaşık su ve 4 kaşık yağ ile sosu karıştırıp salataya döküyorsunuz. Nasıl bir sos ise, insanın salatayı yedikçe yiyesi geliyor. Hatta arkadaşımla abartıp mayonez de sıkarak yiyorduk salatayı. Ne günlerdi... Sonra neden kendim yapmıyorum bu sosu dedim ve ambalajın arkasındaki tarifi aldım. Sanırım hevesim kaçtığı için bir gün bile yapmayı denemedim evde. İlk okuduğumda zerdeçalın ne olduğunu bilmiyordum. Kesin asıl tadı veren baharat budur diye düşünüyordum. Henüz denemedim ama zerdeçalla tanıştım. Fikrim değişmedi; bence hâlâ işin püf noktası zerdeçal ( 2011 notu: Lezzetin potastum glutamattan geldiğini anladım. İnternette biraz araştırırsanız, çin tuzu diye de geçen bu kimyasalın, alınan tatları daha yoğun hissettirdiği belirtiliyor. Fakat aksini söyleyen pek çok kurum olmasına rağmen ben sağlıklı oluşu/güvenilirliği konusunda -hele ki mevzu ticari ürünler olunca- şüpheliyim). İşte tarif: Kurutulm...

Heaven Knows, Mr. Allison - Beyaz Rahibe (1957)

Yönetmen: John Huston Oyuncular: Robert Mitchum, Deborah Kerr Süresi: 198 dk. Issız adalar gerek benzersiz egzotik havaları gerekse manzaraları açısından kişinin yalnızlığını en iyi biçimde yansıtmaya uygun görüldüğü için sinemacıların vazgeçilmez mekanlarıdır. Kaç yıldır ‘Lost’u izliyoruz ekranda bir düşünsenize. İstanbul Modern’de gerçekleştirilen ‘Robert Mitchum ve Cool’un Doğuşu’ isimli programın ayrıntılarını okurken aklıma Mitchum’un, böyle cennet gibi bir adada geçen ‘Beyaz Rahibe’ isimli filmi geldi. Beyazperdede ‘Cool’luğun kitabını yazmış olan aktör, bu filmde de Deborah Kerr ile yine aynı pozisyonda takılıyor. John Huston’ın ‘African Queen’ inden esintiler taşıyan film, baştan sona tabiatın içinde geçer. Ve aynı sevimli-likte olmasına karşın pek tanınmayan ama izlenmeye değer bir filmdir. 2. Dünya Savaşı’nda gemisi batırılan Allison, tesadüfen Japonlara ait bir adaya sürüklenir. Eskiden üs olarak kullanılan ada terk edilmiştir. Kendi imkanlarıyla yaşam mücadelesi vermeye ...