JavaScript dizesi ve sayı dönüşümü


90

Aşağıdakileri JavaScript'te nasıl yapabilirim?

  1. "1", "2", "3" ü "123" olarak birleştir

  2. "123" ü 123'e dönüştür

  3. 123 + 100 = 223 ekle

  4. 223'ü "223" olarak gizleyin


42
Okuduğum neredeyse tüm JavaScript kitapları bu sorunları ele alıyor. Ama sorun değil. StackOverflow'un konusu soruları yanıtlamaktır. @Shadi Almosri - SO'nun "kaba olma" kuralı vardır. Burada soru soran insanları küçümsemenin anlamını görmüyorum, çünkü buranın amacı bu.
Nosredna

4
@Nosredna: Soru sormayı tamamen anlıyorum, cevap vermekten başka hiçbir şeyi sevmiyorum, ama bence denediğin gerçeğini göstermenin görgü kuralları daha iyi, sadece bir cevap beklemekten daha iyidir ve ayrıca kişisel bir öğrenme deneyimi için daha iyi. Benim fikrim, kaba olmaya çalışmıyorum! :)
Shadi Almosri

1
@Shadi, peki soru nasıl sorulmalıydı? Cevabı şimdiden aradığınızı belirten bir beyanla mı?
Nosredna

1
İlk gördüğümde bana bir tür ev ödevi gibi geldi, ama tekrar okuduğumda, JavaScript'i deneyen ve beklenmedik sonuçlar alan ve onu ortadan kaldırmak isteyen biri gibi göründü. Bununla birlikte, stackoverflow.com/faq'ın öğrenciler için bir onur kodu gibi bir şey içerip içermediğini merak ediyorum . Biz burada küresel bir üniversiteyiz ve bu yer için bir dizi etiğin ne olabileceğini anlamaya çalışmanın çılgınca olduğunu düşünmüyorum. Ya da belki delidir. :-)
artlung

6
@Shadi, olumlu tarafta, soru ve cevap StackOverflow'da ve umarım diğer insanlara yardımcı olur. İnsanların her zaman bu tür şeylere takılıp kaldıklarını görüyorum, özellikle Java gibi dillerden geldiklerinde. İnsanların bunu tekrar tekrar sormasının bir nedeni var - JavaScript'teki ifadelerin nasıl çalıştığını bildiklerini DÜŞÜNÜYORLAR, ama bilmiyorlar. JS dışındaki deneyime dayalı varsayımlar yaparlar. Bu nedenle, dizeler ve sayılar ekleyerek ve tekli artı ve eksi deneyerek birkaç basit testi denemek çok yararlıdır.
Nosredna

Yanıtlar:


120

parseInt()Ve ile aşina olmak istiyorsunuz toString().

Araç çantanızda yararlı olan, ne tür olduğunu bulmak için bir değişkene bakmak olacaktır— typeof:

<script type="text/javascript">
    /**
     * print out the value and the type of the variable passed in
     */

    function printWithType(val) {
        document.write('<pre>');
        document.write(val);
        document.write(' ');
        document.writeln(typeof val);
        document.write('</pre>');
    }

    var a = "1", b = "2", c = "3", result;

    // Step (1) Concatenate "1", "2", "3" into "123"
    // - concatenation operator is just "+", as long
    //   as all the items are strings, this works
    result = a + b + c;
    printWithType(result); //123 string

    // - If they were not strings you could do
    result = a.toString() + b.toString() + c.toString();
    printWithType(result); // 123 string

    // Step (2) Convert "123" into 123
    result = parseInt(result,10);
    printWithType(result); // 123 number

    // Step (3) Add 123 + 100 = 223
    result = result + 100;
    printWithType(result); // 223 number

    // Step (4) Convert 223 into "223"
    result = result.toString(); //
    printWithType(result); // 223 string

    // If you concatenate a number with a 
    // blank string, you get a string    
    result = result + "";
    printWithType(result); //223 string
</script>

Bunu komut dosyası etiketlerine koymanızın belirli bir nedeni var mı?
Julix

@Julix 2009'da acemiler için, temel bir kavramı öğrenmek için bir html dosyasına girmek. Bugün buna yeni cevap verseydim, farklı bir şekilde yapabilirdim, ama belki değil.
artlung

53

Adım (1) "1", "2", "3" ü "123" olarak birleştirin

 "1" + "2" + "3"

veya

 ["1", "2", "3"].join("")

Katılmak öğeler arasında belirtilen sınırlayıcı koyarak, bir dizeye yöntem birleştirir bir dizinin öğeleri. Bu durumda, "sınırlayıcı" boş bir dizedir ( "").


Adım (2) "123" ü 123'e dönüştürün

 parseInt("123")

ECMAScript 5'ten önce , 10 tabanı için tabanı geçmek gerekiyordu:parseInt("123", 10)


Adım (3) 123 + 100 = 223 ekleyin

 123 + 100


Adım (4) 223'ü "223" e çevirin

 (223).toString() 


Hepsini Togther Koy

 (parseInt("1" + "2" + "3") + 100).toString()

veya

 (parseInt(["1", "2", "3"].join("")) + 100).toString()

4
Güzel, açık örnek. Ayrıca, iyi biçim için tebrikler - her zaman işlevin tabanını belirtmelisinizparseInt .
hotshot309

Radix dahil olmak beni şaşırttı ve açıklandığı başka bir cevaba geçtim. Karışıklık noktasında doğru olması için hızlı bir açıklama ile düzenlendi.
ArtOfWarfare

@ArtOfWarfare Teşekkürler, iyi düzenleme. Bu cevabın verildiği sırada taban gerekliydi. Bu günlerde, onu dışarıda bırakmak için bir tartışma yapabilirim. Tüm "modern" tarayıcıların ve Node.js'nin desteklediği ES5'ten itibaren, parseInt (<a string sadece 0-9>) her zaman 10 tabanını kullanır.
Patrick McElhaney

eğlenceli gerçek .. Netscape'in orijinal JavaScript'inde (yaklaşık 1995), parseInt için varsayılan sayı 8 idi (dizge ve 8 veya 9 olmadıkça)
Justin Ohms

27
r = ("1"+"2"+"3")           // step1 | build string ==> "123"
r = +r                      // step2 | to number    ==> 123
r = r+100                   // step3 | +100         ==> 223
r = ""+r                    // step4 | to string    ==> "223"

//in one line
r = ""+(+("1"+"2"+"3")+100);

Hızlı dize -> sayı dönüştürme için teşekkürler
mcont

Bir sayı olup olmadığını kontrol ederseniz parseInt () kullanın. Örneğin, parseInt ("") NaN'dir, ancak + "" 0'dır!
greene

15

JavaScript'in yazma sistemi nedeniyle bu sorular her zaman ortaya çıkar. İnsanlar bir sayı dizisini aldıklarında bir sayı aldıklarını düşünürler.

İşte JavaScript'in dizeler ve sayılarla ilgilenme şeklinden yararlanan bazı şeyler. Şahsen, JavaScript'in dize birleştirme için + dışında bir sembol kullanmasını diliyorum .

Adım (1) "1", "2", "3" ü "123" olarak birleştirin

result = "1" + "2" + "3";

Adım (2) "123" ü 123'e dönüştürün

result = +"123";

Adım (3) 123 + 100 = 223 ekleyin

result = 123 + 100;

Adım (4) 223'ü "223" e dönüştürün

result = "" + 223;

Bunların NEDEN işe yaradığını biliyorsanız, JavaScript ifadeleriyle sorun yaşama olasılığınız daha düşüktür.


3
Aslında bunun son derece kötü bir uygulama olduğunu düşünüyorum çünkü neler olup bittiğine dair oldukça opak. Belirli işlemlerin örtük bir oyuncu kadrosunu etkilediğini bilmek bir hile ve bilmek için iyi bir şey, ancak okunaklı değil. İletişim her şeydir.
annakata

1
Bence bunları KESİNLİKLE bilmenin önemli olduğunu düşünüyorum, böylece kodu okurken neler olduğunu bilirsiniz. Çoğu JavaScript özlüdür çünkü kaynak olarak iletilir ve küçük kod, sunucu maliyetinin düşürülmesi anlamına gelebilir.
Nosredna

6
Yine de bunu sıkıştırma araçlarıyla elde etmelisiniz, bu formda optimizasyon çok gerçek bir bakım maliyetiyle yapılır.
annakata

6
Yine de, bunları bilmek, JavaScript'in dizeler ve sayılarla nasıl başa çıktığı konusunda bilgi eksikliği olan ilk etapta sorunun önlenmesine yardımcı olacaktır. Bu bir entelektüel merak meselesi. Bir dizeye sayı eklediğimde ne olur? Unary plus nasıl çalışır? Cevapları bilmiyorsanız, JavaScript'i gerçekten bilmiyorsunuzdur ve bu tür sorular ortaya çıkacaktır.
Nosredna

11

Bunu şu şekilde yapabilirsiniz:

// step 1 
var one = "1" + "2" + "3"; // string value "123"

// step 2
var two = parseInt(one); // integer value 123

// step 3
var three = 123 + 100; // integer value 223

// step 4
var four = three.toString(); // string value "223"

16
En iyi uygulama radix parametresini parseInt () işlevine eklemektir. bu nedenle, parseInt (bir, 10) attığınız her şeyin yanlış dönüştürülmeyeceğini garanti eder.
artlung

3
Kabul. Aksi takdirde, ile başlayan değerler sekizlik (8 tabanlı) sayılar 0olarak görünecektir .
hotshot309

1
Daha da beklenmedik bir şekilde, ile başlayan 0ve sonra içeren 8veya 9başarısız olan değerler , 0 dönüşüne yol açar . Örneğin parseInt('034') = 28, ve parseInt('09') = 0.
Robert Martin

9

Bir dizeyi sayıya dönüştürmek için 0 çıkarın. Bir sayıyı dizeye dönüştürmek için "" (boş dize) ekleyin.

5 + 1 size 6 verecek

(5 + "") + 1 size "51" verir

("5" - 0) + 1 size 6 verir


1
Bunun gibi dil tuhaflıklarına dayanan hilelere güvenmek gerçek bir belirsizliğe yol açabilir. örneğin, "5" -0 gerçekten 5 sayısı ile sonuçlanır, ancak "5" +0 "50" dizesi ile sonuçlanır. (Evet, yıllar sonra olduğunu biliyorum ve muhtemelen bunu okumakta bile biraz üzücü.)
Nick Rice

6

parseInt, scanf gibi yanlıştır:

parseInt ("12 maymun", 10), '12' değerine sahip bir sayıdır
+ "12 maymun", 'NaN' değerine sahip bir sayıdır
Sayı ("12 maymun"), 'NaN' değerine sahip bir sayıdır


1

Aşağıda JavaScript'in başınızı nasıl belaya sokabileceğine dair çok rahatsız edici bir örnek var:

Yalnızca parseInt()sayıya dönüştürmek için kullanmayı denerseniz ve sonuca başka bir sayı eklerseniz, iki dizeyi birleştirir.

Ancak, aşağıdaki örnekte gösterildiği gibi , toplam ifadesini parantez içine yerleştirerek sorunu çözebilirsiniz .

Sonuç: Yaş toplamları: 98; Yaş toplamları: 5048 DEĞİLDİR

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
function Person(first, last, age, eye) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eye;
}

var myFather = new Person("John", "Doe", "50", "blue");
var myMother = new Person("Sally", "Rally", 48, "green");

document.getElementById("demo").innerHTML = "Their age sum is: "+
 (parseInt(myFather.age)+myMother.age)+"; Their age sum is NOT: " +
 parseInt(myFather.age)+myMother.age; 
</script>

</body>
</html>


0

En basit olanı, bir tamsayıyı bir dizge yapmak istediğinizde

var a,b, c;
a = 1;
b = a.toString(); // This will give you string

Şimdi, string türünde olan b değişkeninden tamsayı alabiliriz

c = b *1; //This will give you integer value of number :-)

Yukarıda kontrol etmek isterseniz bir sayıdır. B'nin tamsayı içerip içermediğinden emin değilseniz şunu kullanabilirsiniz:

if(isNaN(c*1)) {
  //NOt a number
}
else //number

0

Bunu, önce sayılara dönüştürmek ve basitçe eklemek için unary plus operatörünü kullanarak yapabiliriz . aşağıya bakınız:-

var a = "4";
var b = "7";
var sum = +a + +b; 
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.