経度と緯度を含むユーザー入力を解析したい。私がやりたいのは、符号と小数点以下の桁数を維持しながら、文字列を数値に強制することです。しかし、私がやりたいのは、ユーザーの入力が無効な場合にメッセージを表示することです。どれに従うべきか
parseFloat(x)
2番目
new Number(x)
三番
~~x
第4
+x
経度と緯度を含むユーザー入力を解析したい。私がやりたいのは、符号と小数点以下の桁数を維持しながら、文字列を数値に強制することです。しかし、私がやりたいのは、ユーザーの入力が無効な場合にメッセージを表示することです。どれに従うべきか
parseFloat(x)
2番目
new Number(x)
三番
~~x
第4
+x
Number(x)
これらの 2 つのどちらかを選択する必要がある場合は、末尾のガベージを許可しないため、 を使用します。(まあ、「許可」しますが、結果はNaN
.)
つまり、Number("123.45balloon")
is ですが、NaN
(数値として) です。parseFloat("123.45balloon")
123.45
クリング氏が指摘するように、どちらが「より良い」かはあなた次第です。
編集— ああ、あなたは戻って追加しました+x
と~~x
. コメントに書いたように、コンストラクタ+x
を使うのと同じですが、演算子Number()
の構文上の柔軟性から、少し危険だと思います。+
つまり、カット アンド ペーストでエラーが発生しやすくなります。~~x
いずれにせよ整数 (32 ビット整数) が必要であることがわかっている場合、この形式は適切です。ただし、緯度/経度の場合、それはおそらくあなたが望むものではありません.
最初のものはより良いです。それは明白であり、正しいです。あなたは浮動小数点数を解析したいと言いました。~~x
あなたに整数を与えるでしょう。
が数値かどうかをテストするinput
には、次を使用します。
function isNumeric(obj){
return !isNaN( parseFloat(obj) ) && isFinite( obj );
}
にキャストString
するNumber
には、を使用します+
。これが最速の方法です。
単項+演算子は、オペランドを数値に型変換します。追加の数学演算を実行しないため、文字列を数値に型変換するための最速の方法です。
したがって、全体として、おそらくこれが必要です。
if(!isNumeric(inputValue)){
alert('invalid number');
}else{
var num = +inputValue;
}
isNumeric
から借りたjQuery
これは、正しい入力が取得されるまで繰り返し入力を取得するために作成するコードです。
var d;
do {
d = prompt("Enter a number");
d = new Number(d);
} while( isNaN(d) );
document.write( d );
注: 文字が数値以外の場合new Number(d)
は常に表示されますが、末尾の無効な文字は無視されます。NaN
parseFloat(d)