IsNumeric()
古いVB6関数と同じ概念空間に何かがあることを願っていますか?
44 に答える
2020 年 10 月 2 日:多くの必要最小限のアプローチには、ここでの回答の多くが考慮されていない微妙なバグ (空白、暗黙の部分解析、基数、配列の強制など) が含まれていることに注意してください。次の実装はうまくいくかもしれませんが、小数点 " .
"以外の数値区切り文字には対応していないことに注意してください。
function isNumeric(str) {
if (typeof str != "string") return false // we only process strings!
return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
!isNaN(parseFloat(str)) // ...and ensure strings of whitespace fail
}
変数 (文字列を含む) が数値かどうかを確認するには、数値でないかどうかを確認します。
これは、変数の内容が文字列か数値かに関係なく機能します。
isNaN(num) // returns true if the variable does NOT contain a valid number
例
isNaN(123) // false
isNaN('123') // false
isNaN('1e10000') // false (This translates to Infinity, which is a number)
isNaN('foo') // true
isNaN('10px') // true
isNaN('') // false
isNaN(' ') // false
isNaN(false) // false
もちろん、必要に応じてこれを無効にすることもできます。たとえば、指定したIsNumeric
例を実装するには:
function isNumeric(num){
return !isNaN(num)
}
数値を含む文字列を数値に変換するには:
文字列に数字のみが含まれている場合にのみ機能し、それ以外の場合は を返しますNaN
。
+num // returns the numeric value of the string, or NaN
// if the string isn't purely numeric characters
例
+'12' // 12
+'12.' // 12
+'12..' // NaN
+'.12' // 0.12
+'..12' // NaN
+'foo' // NaN
+'12px' // NaN
文字列を大まかに数値に変換するには
たとえば、「12px」を 12 に変換するのに便利です。
parseInt(num) // extracts a numeric value from the
// start of the string, or NaN.
例
parseInt('12') // 12
parseInt('aaa') // NaN
parseInt('12px') // 12
parseInt('foo2') // NaN These last three may
parseInt('12a5') // 12 be different from what
parseInt('0x10') // 16 you expected to see.
浮き輪
+num
, (名前が示すように) とは異なり、parseInt
小数点以下のすべてを切り捨てて float を整数に変換することに注意してください (この動作parseInt()
のために使用したい場合は、代わりに別の方法を使用する方がよいでしょう) 。 :
+'12.345' // 12.345
parseInt(12.345) // 12
parseInt('12.345') // 12
空の文字列
空の文字列は少し直感に反するかもしれません。+num
空の文字列またはスペースを含む文字列をゼロに変換isNaN()
し、同じことを想定します。
+'' // 0
+' ' // 0
isNaN('') // false
isNaN(' ') // false
しかしparseInt()
、同意しません:
parseInt('') // NaN
parseInt(' ') // NaN
文字列が整数 (小数点以下の桁数なし) かどうかを確認するだけの場合は、正規表現が適しています。などの他の方法isNaN
は、非常に単純なものには複雑すぎます。
function isNumeric(value) {
return /^-?\d+$/.test(value);
}
console.log(isNumeric('abcd')); // false
console.log(isNumeric('123a')); // false
console.log(isNumeric('1')); // true
console.log(isNumeric('1234567890')); // true
console.log(isNumeric('-23')); // true
console.log(isNumeric(1234)); // true
console.log(isNumeric(1234n)); // true
console.log(isNumeric('123.4')); // false
console.log(isNumeric('')); // false
console.log(isNumeric(undefined)); // false
console.log(isNumeric(null)); // false
正の整数のみを許可するには、次を使用します。
function isNumeric(value) {
return /^\d+$/.test(value);
}
console.log(isNumeric('123')); // true
console.log(isNumeric('-23')); // false
そして、あなたはRegExpの道を行くことができます:
var num = "987238";
if(num.match(/^-?\d+$/)){
//valid integer (positive or negative)
}else if(num.match(/^\d+\.\d+$/)){
//valid float
}else{
//not valid number
}
この質問に対する受け入れられた回答には、かなりの数の欠陥があります (他のユーザーによって強調されているように)。これは、javascript でアプローチする最も簡単で実証済みの方法の 1 つです。
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
以下に、いくつかの良いテスト ケースを示します。
console.log(isNumeric(12345678912345678912)); // true
console.log(isNumeric('2 ')); // true
console.log(isNumeric('-32.2 ')); // true
console.log(isNumeric(-32.2)); // true
console.log(isNumeric(undefined)); // false
// the accepted answer fails at these tests:
console.log(isNumeric('')); // false
console.log(isNumeric(null)); // false
console.log(isNumeric([])); // false
文字列に数値、任意の数値 (整数または浮動小数点)、および正確な数値のみが含まれていることを本当に確認したい場合は、/ 、、または単独で使用することはできません。が実際に数値を返す場合とを返す場合に注意してください。したがって、残りの説明から除外します。parseInt()
parseFloat()
Number()
!isNaN()
!isNaN()
true
Number()
false
NaN
問題は、文字列に数字だけparseFloat()
が含まれていなくても、文字列に数字が含まれている場合は数字を返すことです。
parseFloat("2016-12-31") // returns 2016
parseFloat("1-1") // return 1
parseFloat("1.2.3") // returns 1.2
問題Number()
は、渡された値がまったく数値でない場合に数値を返すことです!
Number("") // returns 0
Number(" ") // returns 0
Number(" \u00A0 \t\n\r") // returns 0
独自の正規表現をローリングする際の問題は、Javascript が認識するように浮動小数点数に一致する正確な正規表現を作成しない限り、ケースを見逃すか、認識すべきではないケースを認識してしまうことです。独自の正規表現を作成できる場合でも、なぜでしょうか? それを行うためのより簡単な組み込みの方法があります。
ただし、Number()
(and isNaN()
) は、返すべきでないときに数値を返すすべてのケースで正しいことを行いparseFloat()
、その逆も同様であることがわかります。したがって、文字列が本当に正確で単なる数値かどうかを調べるには、両方の関数を呼び出して、両方が true を返すかどうかを確認します。
function isNumber(str) {
if (typeof str != "string") return false // we only process strings!
// could also coerce to string: str = ""+str
return !isNaN(str) && !isNaN(parseFloat(str))
}
isNan 関数を試してください:
isNaN() 関数は、値が不正な数値 (Not-a-Number) であるかどうかを判別します。
この関数は、値が NaN と等しい場合に true を返します。それ以外の場合は false を返します。
この関数は、Number 固有のNumber.isNaN()メソッドとは異なります。
グローバル isNaN() 関数は、テストされた値を Number に変換してからテストします。
Number.isNan() は値を Number に変換せず、Number 型ではない値に対して true を返しません...
古い質問ですが、与えられた回答にはいくつかの点が欠けています。
科学表記法。
!isNaN('1e+30')
は ですがtrue
、ほとんどの場合、人々が数字を尋ねるときは、 のようなものと一致させたくありません1e+30
。
大きな浮動小数点数は奇妙な動作をすることがあります
観察 (Node.js を使用):
> var s = Array(16 + 1).join('9')
undefined
> s.length
16
> s
'9999999999999999'
> !isNaN(s)
true
> Number(s)
10000000000000000
> String(Number(s)) === s
false
>
一方で:
> var s = Array(16 + 1).join('1')
undefined
> String(Number(s)) === s
true
> var s = Array(15 + 1).join('9')
undefined
> String(Number(s)) === s
true
>
したがって、 が予想される場合はString(Number(s)) === s
、文字列を最大 15 桁に制限することをお勧めします (先頭のゼロを省略した後)。
無限大
> typeof Infinity
'number'
> !isNaN('Infinity')
true
> isFinite('Infinity')
false
>
これらすべてを考慮して、指定された文字列が次のすべてを満たす数値であることを確認します。
- 非科学的表記法
Number
との間の予測可能な変換String
- 有限の
はそれほど簡単な作業ではありません。ここに簡単なバージョンがあります:
function isNonScientificNumberString(o) {
if (!o || typeof o !== 'string') {
// Should not be given anything but strings.
return false;
}
return o.length <= 15 && o.indexOf('e+') < 0 && o.indexOf('E+') < 0 && !isNaN(o) && isFinite(o);
}
ただし、これでも完全にはほど遠いです。先頭のゼロはここでは処理されませんが、長さのテストを台無しにします。
見積もり:
isNaN(num) // 変数に有効な数値が含まれていない場合は true を返します
先頭/末尾のスペースをチェックする必要がある場合は、完全には当てはまりません。たとえば、特定の桁数が必要で、たとえば PIN の「 111 」や「 111 」ではなく「 1111 」を取得する必要がある場合などです。入力。
使用する方が良い:
var num = /^\d+$/.test(num)
ただし、この関数は、たとえば parseInt("100px") に対して 100 を返すという意味で少し異なることに注意してください。
さて、私は自分で作ったこれを使っています...
これまでのところ機能しています:
function checkNumber(value) {
return value % 1 == 0;
}
何か問題がありましたら、教えてください。
function isNumberCandidate(s) {
const str = (''+ s).trim();
if (str.length === 0) return false;
return !isNaN(+str);
}
console.log(isNumberCandidate('1')); // true
console.log(isNumberCandidate('a')); // false
console.log(isNumberCandidate('000')); // true
console.log(isNumberCandidate('1a')); // false
console.log(isNumberCandidate('1e')); // false
console.log(isNumberCandidate('1e-1')); // true
console.log(isNumberCandidate('123.3')); // true
console.log(isNumberCandidate('')); // false
console.log(isNumberCandidate(' ')); // false
console.log(isNumberCandidate(1)); // true
console.log(isNumberCandidate(0)); // true
console.log(isNumberCandidate(NaN)); // false
console.log(isNumberCandidate(undefined)); // false
console.log(isNumberCandidate(null)); // false
console.log(isNumberCandidate(-1)); // true
console.log(isNumberCandidate('-1')); // true
console.log(isNumberCandidate('-1.2')); // true
console.log(isNumberCandidate(0.0000001)); // true
console.log(isNumberCandidate('0.0000001')); // true
console.log(isNumberCandidate(Infinity)); // true
console.log(isNumberCandidate(-Infinity)); // true
console.log(isNumberCandidate('Infinity')); // true
if (isNumberCandidate(s)) {
// use +s as a number
+s ...
}
「組み込み」のソリューションを見つけようとする頭の痛い問題から解放されます。
良い答えはありません。このスレッドで非常に支持されている答えは間違っています。
npm install is-number
JavaScript では、値が数値であるかどうかを確実に確認することは、必ずしも単純であるとは限りません。開発者が +、-、または Number() を使用して文字列値を数値にキャストすることは一般的です (たとえば、値がユーザー入力、正規表現一致、パーサーなどから返される場合)。しかし、予期しない結果をもたらす直感的でない多くのエッジ ケースがあります。
console.log(+[]); //=> 0
console.log(+''); //=> 0
console.log(+' '); //=> 0
console.log(typeof NaN); //=> 'number'
この関数をフォーム検証ツールとして使用しましたが、ユーザーに指数関数を記述させたくないので、次の関数を思い付きました。
<script>
function isNumber(value, acceptScientificNotation) {
if(true !== acceptScientificNotation){
return /^-{0,1}\d+(\.\d+)?$/.test(value);
}
if (true === Array.isArray(value)) {
return false;
}
return !isNaN(parseInt(value, 10));
}
console.log(isNumber("")); // false
console.log(isNumber(false)); // false
console.log(isNumber(true)); // false
console.log(isNumber("0")); // true
console.log(isNumber("0.1")); // true
console.log(isNumber("12")); // true
console.log(isNumber("-12")); // true
console.log(isNumber(-45)); // true
console.log(isNumber({jo: "pi"})); // false
console.log(isNumber([])); // false
console.log(isNumber([78, 79])); // false
console.log(isNumber(NaN)); // false
console.log(isNumber(Infinity)); // false
console.log(isNumber(undefined)); // false
console.log(isNumber("0,1")); // false
console.log(isNumber("1e-1")); // false
console.log(isNumber("1e-1", true)); // true
</script>
文字列または数値が数値かどうかをテストする
const isNumeric = stringOrNumber =>
stringOrNumber == 0 || !!+stringOrNumber;
または、文字列または数値を数値に変換する場合
const toNumber = stringOrNumber =>
stringOrNumber == 0 || +stringOrNumber ? +stringOrNumber : NaN;
少し紛らわしい私の試み、おそらく最善の解決策ではない
function isInt(a){
return a === ""+~~a
}
console.log(isInt('abcd')); // false
console.log(isInt('123a')); // false
console.log(isInt('1')); // true
console.log(isInt('0')); // true
console.log(isInt('-0')); // false
console.log(isInt('01')); // false
console.log(isInt('10')); // true
console.log(isInt('-1234567890')); // true
console.log(isInt(1234)); // false
console.log(isInt('123.4')); // false
console.log(isInt('')); // false
// other types then string returns false
console.log(isInt(5)); // false
console.log(isInt(undefined)); // false
console.log(isInt(null)); // false
console.log(isInt('0x1')); // false
console.log(isInt(Infinity)); // false
正の数 (家番号など) を探している場合は、次のように使用します。
if (mystring > 0) ...
私の解決策:
// returns true for positive ints;
// no scientific notation, hexadecimals or floating point dots
var isPositiveInt = function(str) {
var result = true, chr;
for (var i = 0, n = str.length; i < n; i++) {
chr = str.charAt(i);
if ((chr < "0" || chr > "9") && chr != ",") { //not digit or thousands separator
result = false;
break;
};
if (i == 0 && (chr == "0" || chr == ",")) { //should not start with 0 or ,
result = false;
break;
};
};
return result;
};
特定のニーズに合わせて、ループ内に条件を追加できます。
私は以下を使用しています:
const isNumber = s => !isNaN(+s)
私はこのようにします:
function isString(value)
{
return value.length !== undefined;
}
function isNumber(value)
{
return value.NaN !== undefined;
}
もちろん、「長さ」が定義されている他のオブジェクトを渡すと、 isString() はここでトリップします。