JavaScriptで文字列を整数に変換するにはどうすればよいですか?
31 に答える
最も簡単な方法は、ネイティブNumber
関数を使用することです。
var x = Number("1000")
それがうまくいかない場合は、parseInt、単項プラス、floorを使用したparseFloat、およびMath.roundメソッドがあります。
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])
文字列がすでに整数の形式である場合は、単項プラス:
var x = +"1000";
文字列がfloatであるか、floatである可能性があり、整数が必要な場合:
var x = Math.floor("1000.01"); //floor automatically converts string to number
または、Math.floorを数回使用する場合:
var floor = Math.floor;
var x = floor("1000.01");
parseIntを呼び出すときに基数を入れるのを忘れるタイプの場合は、parseFloatを使用して、好きなように丸めることができます。ここでは床を使用します。
var floor = Math.floor;
var x = floor(parseFloat("1000.01"));
興味深いことに、Math.round(Math.floorのような)は文字列から数値への変換を行うので、数値を丸めたい場合(または文字列に整数がある場合)、これは素晴らしい方法であり、おそらく私のお気に入りです:
var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)
parseInt関数を試してください:
var number = parseInt("10");
しかし問題がある。parseInt関数を使用して「010」を変換しようとすると、8進数として検出され、8を返します。したがって、基数(2から36)を指定する必要があります。この場合、10進数です。
parseInt(string, radix)
例:
var result = parseInt("010", 10) == 10; // Returns true
var result = parseInt("010") == 10; // Returns false
parseInt
有効なものを解析した後、不良データを無視することに注意してください。
このGUIDは51として解析されます。
var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true
javascriptで文字列を数値に変換する主な方法は2つあります。1つの方法はそれを解析することであり、もう1つの方法はその型を数値に変更することです。他の回答(単項プラスなど)のすべてのトリックには、文字列の型を数値に強制的に強制することが含まれます。Number関数を使用して同じことを明示的に行うこともできます。
構文解析
var parsed = parseInt("97", 10);
parseIntとparseFloatは、文字列を数値に解析するために使用される2つの関数です。認識できない文字にヒットすると、解析はサイレントに停止します。これは、「92px」などの文字列の解析に役立ちますが、入力が正しくない場合にエラーが発生しないため、多少危険です。文字列が数字で始まらない限り、NaNを返します。文字列の先頭の空白は無視されます。これは、あなたが望むものとは異なる何かをし、何かがうまくいかなかったことを示さない例です:
var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97
常に基数を2番目の引数として指定することをお勧めします。古いブラウザでは、文字列が0で始まっている場合、基数が指定されていないと8進数として解釈されるため、多くの人が驚きました。16進数の動作は、基数が指定されていない場合に文字列を0xで開始することによってトリガーされます0xff
。標準は実際にはecmascript5で変更されたため、基数が指定されていない場合、先行ゼロがある場合に最近のブラウザーは8進数をトリガーしなくなりました。parseIntは、基数36までの基数を理解します。この場合、大文字と小文字の両方が同等として扱われます。
文字列のタイプを数値に変更する
parseIntを使用しない上記の他のすべてのトリックは、文字列を数値に暗黙的に強制することを含みます。私はこれを明示的に行うことを好みます、
var cast = Number("97");
これは、解析メソッドとは異なる動作をします(ただし、空白は無視されます)。より厳密です。文字列全体を返すよりも理解できない場合は、。NaN
のような文字列には使用できません97px
。Numberラッパーオブジェクトではなくプリミティブ番号が必要なためnew
、Number関数の前に置かないように注意してください。
明らかに、数値に変換すると、整数ではなく浮動小数点数になる可能性のある値が得られるため、整数が必要な場合は、それを変更する必要があります。これを行うにはいくつかの方法があります。
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
任意のビット演算子(ここではビット単位またはを実行しましたが、前の回答またはビットシフトのように二重否定を実行することもできます)は値を32ビット整数に変換し、それらのほとんどは符号付き整数に変換します。これは、大きな整数には必要ないことに注意してください。整数を32ビットで表現できない場合は、折り返します。
~~"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
大きな数値で正しく機能するには、丸め方法を使用する必要があります
Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))
coeercionは指数表記とInfinityを理解するため、NaN2e2
では200
なく理解しますが、解析メソッドは理解しないことに注意してください。
カスタム
これらの方法のいずれかがあなたが望むことを正確に行うことはありそうにありません。たとえば、通常、解析が失敗した場合にエラーをスローする必要があり、Infinity、指数、または先頭の空白のサポートは必要ありません。ユースケースによっては、カスタム変換関数を作成することが理にかなっている場合があります。
Numberの出力または解析メソッドの1つが、期待する種類の数値であることを常に確認してください。ほぼ確実にisNaN
、数値がNaNでないことを確認するために使用する必要があります(通常、解析が失敗したことを確認する唯一の方法です)。
ParseInt()と+は異なります
parseInt("10.3456") // returns 10
+"10.3456" // returns 10.3456
最速
var x = "1000"*1;
テスト
これが速度の比較です(Mac OSのみ)... :)
chromeの「plus」と「mul」が最も速く(> 700,000,00 op / sec)、「Math.floor」が最も遅くなります。Firefoxの場合、「plus」が最も遅くなります(!)「mul」が最も速くなります(> 900,000,000 op / sec)。Safariでは、「parseInt」は高速で、「数値」は最も低速です(ただし、結果は非常に似ており、> 13,000,000 <31,000,000です)。したがって、文字列をintにキャストするSafariは、他のブラウザよりも10倍以上低速です。したがって、勝者は' mul 'です:)
このリンクhttps://jsperf.com/js-cast-str-to-number/1を使用して、ブラウザで実行できます 。
アップデート
私もテストvar x = ~~"1000";
します-ChromeとSafariでは(<1%)よりも少し遅く、var x = "1000"*1
Firefoxでは(<1%)少し速くなります。上の写真を更新してテストします
古い質問ですが、おそらくこれは誰かに役立つ可能性があります。
文字列を整数に変換するこの方法を使用します
var str = "25"; // string
var number = str*1; // number
したがって、1を掛けても値は変わりませんが、jsは自動的に数値を返します。
ただし、以下に示すように、これはstr
、が数値である(または数値として表すことができる)ことが確実な場合に使用する必要があります。そうでない場合は、数値ではなくNaNが返されます。
使用する簡単な関数を作成できます。
function toNumber(str) {
return str*1;
}
parseIntを試してください。
var number = parseInt("10", 10); //number will have value of 10.
ここに間違った答えを投稿しました、ごめんなさい。修繕。
これは古い質問ですが、私はこのトリックが大好きです:
~~"2.123"; //2
~~"5"; //5
ダブルビット単位の負の値は、小数点以降はすべてドロップされ、数値形式に変換されます。関数などを呼び出すよりも少し速いと言われていますが、完全には確信していません。
編集:私がここで見た別の方法(javascript >>>演算子に関する質問、これはゼロフィルの右シフトです)は、この演算子で数値を0だけシフトすると、数値がuint32に変換されることを示しています。また、署名されていないことを望みます。繰り返しますが、これは符号なし整数に変換され、符号付き数値を使用すると奇妙な動作を引き起こす可能性があります。
"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5
parseIntを使用して浮動小数点を科学的記数法に変換する場合は注意してください。例えば:
parseInt("5.6e-14")
結果として
5
それ以外の
0
文字列を整数に変換するには、parseIntではなくparseFloatを使用することをお勧めします。理由は次のとおりです。
parseFloatの使用:
parseFloat('2.34cms') //Output: 2.34
parseFloat('12.5') //Output: 12.5
parseFloat('012.3') //Output: 12.3
parseIntの使用:
parseInt('2.34cms') //Output: 2
parseInt('12.5') //Output: 12
parseInt('012.3') //Output: 12
したがって、parseIntは小数点以下の値を破棄することに気付いた場合、parseFloatを使用すると浮動小数点数を処理できるため、小数点以下の値を保持する場合に適しています。整数値が必要であることが確実な場合にのみ、parseIntを使用してください。
以下の例をご覧ください。疑問を解消するのに役立ちます
Example Result
parseInt("4") 4
parseInt("5aaa") 5
parseInt("4.33333") 4
parseInt("aaa"); NaN (means "Not a Number")
parseint関数を使用することにより、整数のopのみが提供され、文字列は提供されません
また、補足として:Mootoolsには、任意のネイティブ文字列(またはfloat(または整数))で使用される関数toInt()があります。
"2".toInt() // 2
"2px".toInt() // 2
2.toInt() // 2
+(stringOfNumber)
使用する代わりに使用できますparseInt(stringOfNumber)
例:+("21")
のように21のintを返しますparseInt("21")
。
この単項「+」演算子を使用して、floatを解析することもできます。
Javascriptでは、次のことができます。-
ParseInt
parseInt("10.5") //returns 10
1を掛ける
var s = "10";
s = s*1; //returns 10
単項演算子の使用(+)
var s = "10";
s = +s; //returns 10
ビット演算子の使用
(注:それは後に壊れ始めます2140000000
。例:-)~~"2150000000" = -2144967296
var s= "10.5";
s = ~~s; //returns 10
Math.floor()またはMath.ceil()の使用
var s = "10";
s = Math.floor(s) || Math.ceil(s); //returns 10
JavaScriptには、文字列を数値に変換する方法がたくさんあります...すべてシンプルで便利です。適切な方法を選択してください。
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
また、数学演算はそれらを数値に変換します。たとえば...
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
私の好みの方法は+
、JavaScriptで文字列を数値に変換するエレガントな方法であるsignを使用することです。
str - 0
に変換string
してみてください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
文字列をintに変換するいくつかの方法のパフォーマンスを比較するための2つのリンクを次に示します。
これが最も簡単な解決策です
let myNumber = "123" | 0;
より簡単な解決策
let myNumber = +"123";
私の意見では、フロートを解析するとエラーが発生するため、すべてのエッジケースをカバーする答えはありません。
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
その結果、グーグルは私にこの答えをくれたので...
CとJavaScriptをバインドするために、実際には文字列を整数として「保存」する必要があったので、文字列を整数値に変換します。
/*
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;
}
最も簡単な方法は+
、このように使用することです
const strTen = "10"
const numTen = +strTen // string to number conversion
console.log(typeof strTen) // string
console.log(typeof numTen) // number
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);
}
プラスを使用できます。例えば:
var personAge = '24';
var personAge1 = (+personAge)
typeof personAge1
次に、 ;で新しい変数の型を確認できます。これはnumber
です。
別のオプションは、値をそれ自体と2倍のXORすることです。
var i = 12.34;
console.log('i = ' + i);
console.log('i ⊕ i ⊕ i = ' + (i ^ i ^ i));
これは出力します:
i = 12.34
i ⊕ i ⊕ i = 12
文字列の前にプラス(+)を1つだけ追加しましたが、それが解決策でした。
+"052254" //52254
それが役に立てば幸い ;)
数字の乗算をそれぞれの10の累乗で合計します。
つまり、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;
}
有効な整数を確実に取得するための最も安全な方法:
let integer = (parseInt(value, 10) || 0);
例:
// 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
上記のすべてが正しいです。「typeotx==='number'」を実行して、これが文字列内の数値であることを確認してください。そうでない場合は、NaNが返されます。
var num = "fsdfsdf242342";
typeof num => 'string';
var num1 = "12423";
typeof num1 => 'number';
+num1 = > 12423`
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>
私はこれを使います
String.prototype.toInt = function (returnval) {
var i = parseInt(this);
return isNaN(i) ? returnval !== undefined ? returnval : - 1 : i;
}
このようにして、私は常にintを取り戻します。
これは(おそらく)整数を解析するための最良の解決策ではありませんが、整数を「抽出」する必要がある場合は、たとえば次のようになります。
"1a2b3c" === 123
"198some text2hello world!30" === 198230
// ...
これは機能します(整数の場合のみ):
var str = '3a9b0c3d2e9f8g'
function extractInteger(str) {
var result = 0;
var factor = 1
for (var i = str.length; i > 0; i--) {
if (!isNaN(str[i - 1])) {
result += parseInt(str[i - 1]) * factor
factor *= 10
}
}
return result
}
console.log(extractInteger(str))
もちろん、これは整数の解析にも機能しますが、他の方法よりも遅くなります。
このメソッドを使用して整数を解析し、文字列が数値でない場合に返すこともできますが、これは内部に依存しており、おそらく高速であるNaN
ため、なぜ必要なのかわかりません。parseInt
parseInt
var str = '3a9b0c3d2e9f8g'
function extractInteger(str) {
var result = 0;
var factor = 1
for (var i = str.length; i > 0; i--) {
if (isNaN(str[i - 1])) return NaN
result += parseInt(str[i - 1]) * factor
factor *= 10
}
return result
}
console.log(extractInteger(str))
それを試してみてください
console.log(Number('90'));
console.log(+'90');