文字列を整数に変換しますか?
-
16-09-2019 - |
質問
JavaScript で文字列を整数に変換するにはどうすればよいですか?
解決
最も簡単な方法は、ネイティブNumber
機能を使用することです
var x = Number("1000")
それはあなたのために動作しない場合は、床とののparseInt を、を、単項プラスのの 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";
あなたの文字列があるか、フロートかもしれないと、あなたは整数をしたい場合:
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.floorのような)恐らくMath.roundは、番号変換に文字列を行います(または、あなたが文字列の整数を持っている場合)、これは素晴らしい方法、多分私のお気に入りです:
var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)
他のヒント
のparseInt機能を試してみてください。
var number = parseInt("10");
しかし、問題があります。あなたがのparseInt関数を使用して「010」に変換しようとすると、それは8進数として検出して、それで、あなたは(2〜36)基数を指定する必要が数8を返します。この場合、ベース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
. 。実際、ecmascript 5 で標準が変更されたため、最近のブラウザでは、基数が指定されていない場合、先頭に 0 がある場合に 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
ビット単位の演算子 (ここではビット単位の or を実行しましたが、以前の回答やビットシフトのように二重否定を行うこともできます) は値を 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"))
これらのメソッドはすべて指数表記を理解するので、 2e2
は 200
NaN ではなく。また、Number は "Infinity" を理解しますが、解析メソッドは認識しません。
カスタム
これらの方法のいずれも、意図したとおりに動作する可能性は低いです。たとえば、通常は、解析が失敗した場合にエラーをスローする必要がありますが、無限大、指数関数、または先頭の空白のサポートは必要ありません。ユースケースによっては、カスタム変換関数を作成することが合理的な場合があります。
Number またはいずれかの解析メソッドの出力が予期した種類の数値であることを常に確認してください。ほぼ確実に使いたくなるでしょう isNaN
数値が NaN でないことを確認します (通常、解析が失敗したことを確認する唯一の方法です)。
のparseInt()と+が異なる
parseInt("10.3456") // returns 10
+"10.3456" // returns 10.3456
古い問題が、多分これが誰かの役に立つことができます。
私は<ストライキ>に文字列を変換するこの方法を使用するint型打つ>番号
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.
最速
var x = "1000"*1;
テスト
ここでは速度の比較を少し示します (Mac OS のみ)。:)
クロムの場合、「plus」と「mul」が最も速く (>700,000,00 op/秒)、「Math.floor」が最も遅くなります。Firefox の場合、「plus」が最も遅くなります (!)、「mul」が最も速くなります (>900,000,000 op/秒)。Safari では、「parseInt」が高速で、「number」が最も低速です (ただし、結果は非常に似ており、>13,000,000 <31,000,000)。そのため、文字列を int にキャストする Safari は他のブラウザより 10 倍以上遅くなります。したがって、勝者は「マル' :)
このリンクからブラウザ上で実行できますhttps://jsperf.com/js-cast-str-to-number/1
アップデート
私もテストします var x = ~~"1000";
- Chrome と Safari では、より少し遅くなります。 var x = "1000"*1
(<1%)、Firefox では少し高速です (<1%)。上の画像を更新してテストします
間違った回答をここに投稿してしまいました、申し訳ありません。修理済み。
これは古い質問ですが、私はこのトリックが大好きです。
~~"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
また、サイドノートとして:MooToolsは、任意の天然の文字列で使用されている機能オーバーライド:()(またはフロート(または整数))
"2".toInt() // 2
"2px".toInt() // 2
2.toInt() // 2
文字列を整数に変換するには、parseFloat と ない parseInt.その理由は次のとおりです。
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.It下記
あなたの疑問をクリアするのに役立ちます参照してください。Example Result
parseInt("4") 4
parseInt("5aaa") 5
parseInt("4.33333") 4
parseInt("aaa"); NaN (means "Not a Number")
のparseInt関数を使用してそれだけ整数のOP本を与えるとしない文字列
私たちは、代わりに+(stringOfNumber)
を使用してのparseInt(stringOfNumber)
を使用することができます。
例:+("21")
はparseInt("21")
ように21の整数を返す
私たちはあまりにもfloatを解析するために、この単項 "+" 演算子を使用することができます...
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つのリンクがあります。
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 で文字列を数値に変換するエレガントな方法です。
私の意見では、何の答えはfloatを解析すると、エラーが発生しなければならないように、すべてのエッジケースをカバーしていません。
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
Googleは、結果として私にこの答えを与えたので...
私は実際に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;
}
上記の全てが正しいです。ことは、これは実行して文字列内の数である前に、他の賢明な「typeotのx === 『数』を」必ずしてください、それはNaNに
を返します。 var num = "fsdfsdf242342";
typeof num => 'string';
var num1 = "12423";
typeof num1 => 'number';
+num1 = > 12423`
別のオプションは、二重のXORにあり、それ自体で価値ます:
var i = 12.34;
console.log('i = ' + i);
console.log('i ⊕ i ⊕ i = ' + (i ^ i ^ i));
この意志出力ます:
i = 12.34
i ⊕ i ⊕ i = 12
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型のバックを取得するこの方法でます。
の私は、文字列の前に1つのプラス(+)を追加し、それが解決した!の
+"052254" //52254
それがお役に立てば幸いです;)
10のそれぞれのパワーを持つ桁の掛け算を合計ます:
例:123 = 100 + 20 + 3 = 1×100 + 2 + 10 + 3 * 1 = 1 *(10 ^ 2)+ 2 *(10 ^ 1)+ 3 *(^ 0〜10)
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 myNumber = "123" | 0;
は有効な整数を取得確保するための最も安全な方法をます:
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
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);
}