JavaScript'te bir dizeyi tam sayıya nasıl dönüştürebilirim?


Yanıtlar:


2153

En basit yol yerel Numberişlevi kullanmak olacaktır :

var x = Number("1000")

Bu sizin için işe yaramazsa, parseInt , unary plus , zeminli parseFloat ve Math.round yöntemleri vardır.

parseInt:

var x = parseInt("1000", 10); // you want to use radix 10
    // so you get a decimal number even with a leading 0 and an old browser ([IE8, Firefox 20, Chrome 22 and older][1])

dizeniz zaten bir tamsayı biçimindeyse unary plus:

var x = +"1000";

dizeniz bir kayan nokta ise veya bir tam sayı ise ve bir tam sayı istiyorsanız:

var x = Math.floor("1000.01"); //floor automatically converts string to number

veya Math.floor'u birkaç kez kullanacaksanız:

var floor = Math.floor;
var x = floor("1000.01");

ParseInt öğesini çağırdığınızda yarıçapı koymayı unutan türseniz, parseFloat'ı kullanabilir ve istediğiniz gibi yuvarlayabilirsiniz. Burada zemini kullanıyorum.

var floor = Math.floor;
var x = floor(parseFloat("1000.01"));

İlginç bir şekilde, Math.round (Math.floor gibi) bir sayıdan sayıya dönüşüm gerçekleştirecektir, bu nedenle sayının yuvarlatılmasını istiyorsanız (veya dizede bir tamsayı varsa), bu harika bir yoldur, belki de en sevdiğim:

var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)

1
jsperf.com/performance-of-parseint/29 , hy @jedierikb i düzenleme jsperf link oldu. Ekleme '4'>>0ve '4'>>>0.
emaniacs

6
2015 güncellemesi: ECMAScript 5 itibarıyla, başında sıfır olan "0" olan dizeler de 8 yerine varsayılan sayı tabanı 10'u alır. Açık sayıdaki sayı tabanı 10 yalnızca eski tarayıcılar için gereklidir. kangax.github.io/compat-table/es5/…
Grilse

20
Çoğu kişi boş dizeyi geçerli bir sayıyı temsil etmeyi düşünmese de, Number ('') işlevinin başarılı olduğunu (0 döndürerek) unutmayın. Çoğu insan '3q' değerini geçerli bir sayı olarak görmese de parseInt ('3q') başarılı olur (3 döndürür).
Dave Pacheco

3
Dikkat et. Her ikisi de parseIntve parseFloatmutlu bir şekilde mektupları kabul eder. Sadece tutarlı bir şekilde Numbergeri döner NaN.
Karl Pokus

2
Kanımca, bir tamsayıyı ayrıştırma, tamsayı NaNolmayan her değer için / istisnası ile sonuçlanmalıdır . Olarak bu işin nedenle hiçbiri Number('2.2')zorladı için 2ve Number('')zorlamak için 0'a
Michal Knapik

225

ParseInt işlevini deneyin:

var number = parseInt("10");

Ama bir problem var. ParseInt işlevini kullanarak "010" biçimini dönüştürmeye çalışırsanız, sekizlik sayı olarak algılar ve 8 sayısını döndürür. Bu nedenle, bir yarıçap belirtmeniz gerekir (2'den 36'ya). Bu durumda taban 10.

parseInt(string, radix)

Misal:

var result = parseInt("010", 10) == 10; // Returns true

var result = parseInt("010") == 10; // Returns false

Not parseIntgeçerli bir şey ayrıştırma sonra hatalı veri yok sayar.
Bu rehber 51 olarak ayrıştırılacaktır:

var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true

4
Radix 2016'da artık gerekli değil.

7
Daha yeni tarayıcılar için olmayabilir, ancak geriye dönük uyumluluk için hala sayı tabanı gereklidir.
programlama profesörü

'' ya da '02 "ya da" 02 + 1 "ya da" 03,12 "ya da" 03.12 "ne olacak?
stackdave

3
Bunun sayıdan sonra hatalı verileri yok saydığını unutmayın. Örneğin, parseInt('0asdf', 10)üretir 0.
Sam

121

Bir dizeyi javascript içindeki bir sayıya dönüştürmenin iki ana yolu vardır. Bir yolu ayrıştırmak, diğer yolu da türünü bir Sayı olarak değiştirmek. Diğer cevaplardaki tüm hileler (örneğin, tekli artı), dizenin türünü bir sayıya dolaylı olarak zorlamayı içerir. Aynı işlemi Rakam işleviyle de açıkça yapabilirsiniz.

ayrıştırma

var parsed = parseInt("97", 10);

parseInt ve parseFloat, dizeleri sayılara ayrıştırmak için kullanılan iki işlevdir. Ayrıştırma, tanımadığı bir karaktere çarptığında sessizce durur, bu da "92px" gibi dizeleri ayrıştırmak için yararlı olabilir, ancak kötü girişte size herhangi bir hata vermeyeceği için de biraz tehlikelidir. Dize bir sayı ile başlamadığı sürece NaN geri dönecektir. Dizenin başındaki boşluk boşluk dikkate alınmaz. İşte bunun, istediğinizden farklı bir şey yapmasına ve herhangi bir şeyin yanlış gittiğine dair hiçbir belirti vermemeye bir örnek:

var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97

Yarıçayı her zaman ikinci argüman olarak belirtmek iyi bir uygulamadır. Daha eski tarayıcılarda, dize 0 ile başlamışsa, çok sayıda insanı şaşkınlığa sürükleyen sayı tabanı belirtilmemişse sekizlik olarak yorumlanır. Onaltılık davranışı, herhangi bir sayı tabanı belirtilmemişse dizenin 0x ile başlamasıyla tetiklenir, örn 0xff. Standart, ecmascript 5 ile değişti, bu nedenle modern tarayıcılar, herhangi bir sayı tabanı belirtilmemişse önde 0 olduğunda sekizli tetiklemiyor. parseInt, 36 tabanına kadar olan yarıçapları anlar, bu durumda hem büyük hem de küçük harfler eşit kabul edilir.

Dize Türünü Bir Sayıya Değiştirme

Yukarıda parseInt kullanmayan diğer tüm hileler, dizeyi bir sayıya dolaylı olarak zorlamayı içerir. Bunu açıkça yapmayı tercih ediyorum,

var cast = Number("97");

Bu ayrıştırma yöntemlerinden farklı davranışlara sahiptir (yine de boşlukları yoksayar). Daha katıdır: dizenin tamamını döndürdüğünden daha iyi anlamıyorsa, NaNdizeler için kullanamazsınız 97px. Number wrapper nesnesi yerine ilkel bir sayı istediğiniz için,new için Sayı işlevinin önüne .

Açıkçası, bir Sayıya dönüştürmek size bir tamsayı yerine bir kayan nokta olabilen bir değer verir, bu nedenle bir tamsayı istiyorsanız, onu değiştirmeniz gerekir. Bunu yapmanın birkaç yolu vardır:

var rounded = Math.floor(Number("97.654"));  // other options are Math.ceil, Math.round
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
var bitwised = Number("97.654")|0;  // do not use for large numbers

Herhangi bir bitsel operatör (burada bitsel yaptım ya da daha önceki bir cevapta veya bit kaydırmada olduğu gibi çift olumsuzlama da yapabilirsiniz) değeri 32bit tam sayıya dönüştürür ve bunların çoğu işaretli bir tam sayıya dönüşür. Not Bu o Büyük tamsayılar için istediğiniz istiyoruz olmayacaktır . Tam sayı 32 bit olarak gösterilemiyorsa, sarılır.

~~"3000000000.654" === -1294967296
// This is the same as
Number("3000000000.654")|0
"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit
"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers

Daha büyük sayılarla doğru çalışmak için yuvarlama yöntemlerini kullanmalısınız

Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))

Bu yöntemlerin hepsi üstel gösterim anlamaya akılda Ayı, böylece 2e2olan 200NaN ziyade. Ayrıştırma yöntemleri bilmese de, Number "Sonsuzluk" u anlar.

görenek

Bu yöntemlerden herhangi birinin tam olarak istediğinizi yapması pek olası değildir. Örneğin, ayrıştırma başarısız olursa genellikle atılan bir hata isterim ve Infinity, üstel veya önde gelen boşluk için desteğe ihtiyacım yok. Kullanıcı tabanınıza bağlı olarak, bazen özel bir dönüştürme işlevi yazmak mantıklıdır.

Her zaman Sayı çıktısının veya ayrıştırma yöntemlerinden birinin beklediğiniz sayı olduğunu kontrol edin. Neredeyse kesinlikle isNaNnumaranın NaN olmadığından emin olmak için kullanmak isteyeceksiniz (genellikle ayrışmanın başarısız olduğunu öğrenmenin tek yolu).


6
Kodunuzun da kabul etmesini 97,8,00ve benzer olmasını isteyip istemediğinize bağlıdır . Basit bir hile, .replace(/[^0-9]/g, "")dizenizdeki tüm rakamları kaldıracak ve daha sonra dönüşümü yapacak bir işlem yapmaktır. Bu tabii ki sadece ayrıştırmak yerine muhtemelen hata gerekir çılgın dizeleri her türlü görmezden gelecektir ...
kybernetikos

6
@kybernetikos muhtemelen olmalı .replace(/[^0-9.]/g, ""), aksi takdirde "1.05" "105" olur.
J.Steve

Oldukça doğru, her ne kadar önemli kod için böyle bir şey kullanmasam da - senin içinden bir şey gerçekten izin vermek istemiyorum birçok yolu vardır.
kybernetikos

2
Number'ı kodda çok daha okunabilir buldum, bu yüzden bir çözüm olarak işaret ettiğiniz için teşekkür ederim.
carlin.scott

1
@ kybernetikos olarak var fixed = Number("97.654").toFixed(0); // rounded rather than truncated, (tamsayı) yerine (yöntem stringnedeniyle) elde ediyoruz . Eğer yuvarlanmış tamsayıyı kullanmak istiyorsak muhtemelen kullanmak daha iyidir.toFixednumberMath.round("97.654");
Edu Zamora

50

ParseInt () ve + farklı

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

36

Eski bir soru olsa da, belki bu birisi için yararlı olabilir.

Ben int numarasına dize dönüştürme bu şekilde kullanın

var str = "25";       // string
var number = str*1;   // number

Bu nedenle, 1 ile çarpıldığında değer değişmez, ancak js otomatik olarak bir sayı döndürür.

Ancak aşağıda gösterildiği gibi, bunun str bir sayı olduğundan (veya bir sayı olarak temsil edilebileceğinden) , aksi takdirde bir sayı değil NaN döndürür.

kullanmak için basit bir işlev oluşturabilirsiniz, örn.

function toNumber(str) {
   return str*1;
}

resim açıklamasını buraya girin


36

En hızlı

var x = "1000"*1;

Ölçek

İşte hızın küçük bir karşılaştırması (sadece Mac Os) ... :)

Krom 'artı' ve 'mul' en hızlı (> 700.000,00 op / sn) için 'Math.floor' en yavaştır. Firefox için 'artı' en yavaş (!) 'Mul' en hızlıdır (> 900.000.000 op / sn). Safari'de 'parseInt' hızlıdır, 'sayı' en yavaştır (ancak sonuçlar oldukça benzerdir,> 13.000.000 <31.000.000). Bu nedenle, dize int için Safari, diğer tarayıcılardan 10 kat daha yavaştır. Yani kazanan ' mul ' :)

Bu bağlantı ile tarayıcınızda çalıştırabilirsiniz https://jsperf.com/js-cast-str-to-number/1

resim açıklamasını buraya girin

Güncelleme

Ben de test ediyorum var x = ~~"1000";- Chrome ve Safari'de var x = "1000"*1(<% 1) biraz daha yavaş , Firefox'ta ise biraz daha hızlı (<% 1). Yukarıdaki resim ve testi güncelliyorum


A, B, E ve F testlerinin sonuçları arasında önemli bir fark yok - hepsi esasen aynı,
Alf Eaton

33

Ayrıştırmayı deneyin.

var number = parseInt("10", 10); //number will have value of 10.

4
Büyük olasılıkla bununla da yarıçap eklemek istersiniz : var number = parseInt ("10", 10);
Joel Coehoorn

27

Burada yanlış cevabı gönderdim, üzgünüm. sabit.

Bu eski bir soru, ama bu hileyi seviyorum:

~~"2.123"; //2
~~"5"; //5

Çift bitsel negatif, ondalık noktadan sonra herhangi bir şeyi bırakır VE bir sayı biçimine dönüştürür. Bana fonksiyonları çağırmaktan biraz daha hızlı olduğu söylendi, ama tamamen ikna olmadım.

DÜZENLEME: Az önce gördüğüm bir başka yöntem burada (sıfır dolgu doğru kaymasıdır javascript >>> operatörü hakkında soru) gösterir bu operatör ile 0'a tarafından bir numara değişen bir sayıyı dönüştürmesi UInt32 eğer güzel ayrıca imzasız istiyorum . Yine, işaretsiz bir sayı kullanırsanız , garip davranışlara yol açabilecek işaretsiz bir tam sayıya dönüşür .

"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5

19

Bilimsel gösterimde bir şamandırayı dönüştürmek için parseInt kullanıyorsanız dikkatli olun! Örneğin:

parseInt("5.6e-14") 

sonuçlanacak

5 

onun yerine

0

14
parseIntŞamandıra için kullanmak doğru olmaz. parseFloatbu durumda düzgün çalışır.
benekastah

16

Bir String'i Tamsayıya dönüştürmek için parseFloat ve NOT parseInt kullanmanızı öneririz . İşte nedeni:

ParseFloat kullanma:

parseFloat('2.34cms')  //Output: 2.34
parseFloat('12.5')     //Output: 12.5
parseFloat('012.3')    //Output: 12.3

ParseInt kullanma:

parseInt('2.34cms')  //Output: 2
parseInt('12.5')     //Output: 12
parseInt('012.3')    //Output: 12

Eğer parseInt değerlerini ondalık sayılardan sonra atarsanız, parseFloat kayan nokta sayılarıyla çalışmanıza izin verir ve bu nedenle değerleri ondalık sayılardan sonra tutmak istiyorsanız daha uygun olur. ParseInt öğesini yalnızca ve yalnızca tam sayı değerini istediğinizden eminseniz kullanın.


6
Soru "Nasıl bir dize javascript tamsayı dönüştürmek" oldu
Pierre Arlaud

15

Ayrıca bir yan not olarak: Mootools, herhangi bir yerel dize (veya float (veya tamsayı)) üzerinde kullanılan toInt () işlevine sahiptir.

"2".toInt()   // 2
"2px".toInt() // 2
2.toInt()     // 2

7
Üçüncü örnek a'ya neden olur SyntaxError, çift nokta kullanmalısınız, örneğin: 2..toInt();ilk nokta bir Numberdeğişmezin temsilini sona erdirir ve ikinci nokta özellik erişimcisidir.
CMS

2
bu soru mootools ile ilgili değil, JavaScript ile ilgili.
Liam

14

Lütfen aşağıdaki örneğe bakın. Şüphe gidermek yardımcı olacaktır

Example                  Result

parseInt("4")            4
parseInt("5aaa")         5
parseInt("4.33333")      4
parseInt("aaa");         NaN (means "Not a Number")

parseint işlevini kullanarak Bu yalnızca tamsayı op değerini verir, dizeyi değil


12

kullanmak +(stringOfNumber)yerine kullanabilirizparseInt(stringOfNumber)

Örn:, +("21")21 gibi int değerini döndürür parseInt("21").

bu tekli "+" operatörünü şamandıra ayrıştırmak için de kullanabiliriz ...


1
Ama bunu formüllerde kullanamazsınız! Yani (1 + ("21")) * 10 === 1210!
Alexander Vasilyev

2
@AlexanderVasilyev Yapabileceğinizi düşünüyorum, sadece etrafında fazladan bir parantez kullanmaz mıydınız +?
NiCk Newman

@NiCkNewman Yorumladığımız cevaptaki örnekten + ("21") alıyorum.
Alexander Vasilyev

Bu çözümü gerçekten sevmiyorum. Olduğu gibi açık değil parseInt. Ortak bir uygulama, ilk bakışta const myNumber = +myNumberAsAStringbir standart +=veya =+operatör gibi görünüyor . Ayrıca yanlış kullanılırsa, birleştirme hatalarına neden olabilir. Bu çözüm, sayı sağlanmadığında 0'ın sol taraf olarak kabul edilmesine dayanır .
Storm Muller

10

Deneyin str - 0dönüştürmek stringiçin number.

> str = '0'
> str - 0
  0
> str = '123'
> str - 0
  123
> str = '-12'
> str - 0
  -12
> str = 'asdf'
> str - 0
  NaN
> str = '12.34'
> str - 0
  12.34

Dizeyi int'e dönüştürmenin çeşitli yollarının performansını karşılaştırmak için iki bağlantı

https://jsperf.com/number-vs-parseint-vs-plus

http://phrogz.net/js/string_to_number.html


1
@AlexanderYau, bu başına doc , '1'dönüştürülecektir1 tarafından ToNumberdaha sonra 1 - 0olurdu1
zangw

10

JavaScript'te bir dizeyi sayı değerine dönüştürmenin birçok yolu vardır ... Hepsi basit ve kullanışlı, hangisinin sizin için çalışma şeklini seçin:

var num = Number("999.5"); //999.5
var num = parseInt("999.5", 10); //999
var num = parseFloat("999.5"); //999.5
var num = +"999.5"; //999.5

Ayrıca herhangi bir Matematik işlemi onları sayıya dönüştürür, örneğin ...

var num = "999.5" / 1; //999.5
var num = "999.5" * 1; //999.5
var num = "999.5" - 1 + 1; //999.5
var num = "999.5" - 0; //999.5
var num = Math.floor("999.5"); //999
var num = ~~"999.5"; //999

Tercih ettiğim yol, +bir dizeyi JavaScript'te sayıya dönüştürmenin zarif yolu olan işaret kullanmaktır .


8

Google bana bu cevabı sonuç olarak verdi, bu yüzden ...

Aslında C ve JavaScript arasında bir bağlanma için bir dize bir tamsayı olarak kaydetmek gerekiyordu, bu yüzden dize bir tamsayı değerine dönüştürmek:

/*
    Examples:
        int2str( str2int("test") ) == "test" // true
        int2str( str2int("t€st") ) // "t¬st", because "€".charCodeAt(0) is 8364, will be AND'ed with 0xff
    Limitations:
        max 4 chars, so it fits into an integer
*/
function str2int(the_str) {
    var ret = 0;
    var len = the_str.length;
    if (len >= 1) ret += (the_str.charCodeAt(0) & 0xff) <<  0;
    if (len >= 2) ret += (the_str.charCodeAt(1) & 0xff) <<  8;
    if (len >= 3) ret += (the_str.charCodeAt(2) & 0xff) << 16;
    if (len >= 4) ret += (the_str.charCodeAt(3) & 0xff) << 24;
    return ret;
}
function int2str(the_int) {
    var tmp = [
        (the_int & 0x000000ff) >>  0,
        (the_int & 0x0000ff00) >>  8,
        (the_int & 0x00ff0000) >> 16,
        (the_int & 0xff000000) >> 24
    ];
    var ret = "";
    for (var i=0; i<4; i++) {
        if (tmp[i] == 0)
            break;
        ret += String.fromCharCode(tmp[i]);
    }
    return ret;
}

4
Bu 4 baytlık değerleri depolamanın ve almanın ilginç bir yoludur. Sorunun geleneksel yorumuna cevap vermez: bir sayının dize temsilini bir tamsayı değerine dönüştürme. Ne olursa olsun, int2strbir bayt 0 ise işleviniz durur, bu değer içinde meşru bir öğe olabilir, bu nedenle if... breakkaldırılmalıdır, böylece tam 4 baytlık bir değer elde edersiniz.
Suncat2000

8

Bence hiçbir yanıt tüm uç durumları kapsamaz, çünkü bir kayan nokta ayrıştırmak hataya neden olmalıdır.

function parseInteger(value) {
    if(value === '') return NaN;
    const number = Number(value);
    return Number.isInteger(number) ? number : NaN;
}
parseInteger("4")            // 4
parseInteger("5aaa")         // NaN
parseInteger("4.33333")      // NaN
parseInteger("aaa");         // NaN

1
Bir Sayı Değil Dönmek bir kayan nokta için biraz agresif, değil mi?
Thomas Ayoub

2
Öyle parseIntegerdeğil parseNumber. JS tamsayıları desteklemediğinden ve ayrı türler olarak yüzdüğünden, her çözümün bir çözüm olduğunu düşünüyorum. Değil Bir Numara yanıltıcı ise, nullyerine dönebiliriz NaN.
Michał Knapik

4

İşte en kolay çözüm

let myNumber = "123" | 0;

Daha kolay çözüm

let myNumber = +"123";

2

yukarıdakilerin hepsi doğrudur. NaN döndürür diğer akıllıca "typeot x === 'sayı'" yaparak bir dizede bir sayı olduğundan emin olun

 var num = "fsdfsdf242342";
 typeof num => 'string';

 var num1 = "12423";
 typeof num1 => 'number';
 +num1 = > 12423`

V8.5.0 düğümünde var num1 = "12423"; typeof num1;geri döner string.
Edu Zamora

2

Başka bir seçenek de XOR değerini iki katına çıkarmaktır:

var i = 12.34;
console.log('i = ' + i);
console.log('i ⊕ i ⊕ i = ' + (i ^ i ^ i));

Bu çıktı:

i = 12.34
i  i  i = 12

2

Ben sadece bir artı (+) dize önce ekledi ve bu çözüm oldu!

+"052254" //52254

Umarım yardımcı olur ;)


2

Onların kendi güçleri ile basamakların çarpımını toplamak:

yani: 123 = 100 + 20 + 3 = 1 * 100 + 2 + 10 + 3 * 1 = 1 * (10 ^ 2) + 2 * (10 ^ 1) + 3 * (10 ^ 0)

function atoi(array) {

// use exp as (length - i), other option would be to reverse the array.
// multiply a[i] * 10^(exp) and sum

let sum = 0;

for (let i = 0; i < array.length; i++) {
    let exp = array.length-(i+1);
    let value = array[i] * Math.pow(10,exp);
    sum+=value;
}

return sum;

}


1

function doSth(){
  var a = document.getElementById('input').value;
  document.getElementById('number').innerHTML = toNumber(a) + 1;
}
function toNumber(str){
  return +str;
}
<input id="input" type="text">
<input onclick="doSth()" type="submit">
<span id="number"></span>


1

Bunu kullanıyorum

String.prototype.toInt = function (returnval) { 
    var i = parseInt(this);
    return isNaN(i) ? returnval !== undefined ? returnval : - 1  :      i; 
}

bu şekilde her zaman bir int alırım.


1

Geçerli bir tamsayı almanızı sağlamanın en güvenli yolu:

let integer = (parseInt(value, 10) || 0);

Örnekler:

// Example 1 - Invalid value:
let value = null;
let integer = (parseInt(value, 10) || 0);
// => integer = 0
// Example 2 - Valid value:
let value = "1230.42";
let integer = (parseInt(value, 10) || 0);
// => integer = 1230
// Example 3 - Invalid value:
let value = () => { return 412 };
let integer = (parseInt(value, 10) || 0);
// => integer = 0

1
function parseIntSmarter(str) {
    // ParseInt is bad because it returns 22 for "22thisendsintext"
    // Number() is returns NaN if it ends in non-numbers, but it returns 0 for empty or whitespace strings.
    return isNaN(Number(str)) ? NaN : parseInt(str, 10);
}

0

artı kullanabilirsiniz, örneğin =>

var personAge = '24'; var personAge1 = (+ personAge)

personOge türünü görebilirsiniz

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.