Yanıtlar:
En basit yol yerel Number
iş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)
'4'>>0
ve '4'>>>0
.
parseInt
ve parseFloat
mutlu bir şekilde mektupları kabul eder. Sadece tutarlı bir şekilde Number
geri döner NaN
.
NaN
olmayan her değer için / istisnası ile sonuçlanmalıdır . Olarak bu işin nedenle hiçbiri Number('2.2')
zorladı için 2
ve Number('')
zorlamak için 0'a
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 parseInt
geç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
parseInt('0asdf', 10)
üretir 0
.
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, NaN
dizeler 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 2e2
olan 200
NaN 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 isNaN
numaranın NaN olmadığından emin olmak için kullanmak isteyeceksiniz (genellikle ayrışmanın başarısız olduğunu öğrenmenin tek yolu).
97,8,00
ve 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 ...
.replace(/[^0-9.]/g, "")
, aksi takdirde "1.05" "105" olur.
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
, (tamsayı) yerine (yöntem string
nedeniyle) elde ediyoruz . Eğer yuvarlanmış tamsayıyı kullanmak istiyorsak muhtemelen kullanmak daha iyidir.toFixed
number
Math.round("97.654");
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;
}
var x = "1000"*1;
İş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
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
Ayrıştırmayı deneyin.
var number = parseInt("10", 10); //number will have value of 10.
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
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
parseInt
Şamandıra için kullanmak doğru olmaz. parseFloat
bu durumda düzgün çalışır.
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.
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
SyntaxError
, çift nokta kullanmalısınız, örneğin: 2..toInt();
ilk nokta bir Number
değişmezin temsilini sona erdirir ve ikinci nokta özellik erişimcisidir.
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 ...
+
?
parseInt
. Ortak bir uygulama, ilk bakışta const myNumber = +myNumberAsAString
bir 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 .
Deneyin str - 0
dönüştürmek string
iç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ı
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 .
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;
}
int2str
bir bayt 0 ise işleviniz durur, bu değer içinde meşru bir öğe olabilir, bu nedenle if
... break
kaldırılmalıdır, böylece tam 4 baytlık bir değer elde edersiniz.
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
parseInteger
değ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, null
yerine dönebiliriz NaN
.
İşte en kolay çözüm
let myNumber = "123" | 0;
Daha kolay çözüm
let myNumber = +"123";
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`
var num1 = "12423"; typeof num1;
geri döner string
.
Ben sadece bir artı (+) dize önce ekledi ve bu çözüm oldu!
+"052254" //52254
Umarım yardımcı olur ;)
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;
}
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>
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
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);
}
artı kullanabilirsiniz, örneğin =>
var personAge = '24'; var personAge1 = (+ personAge)
personOge türünü görebilirsiniz