Как проверить, является ли число JavaScript действительным, действительным числом? - PullRequest
12 голосов
/ 16 декабря 2011

МОЙ код:

function isNumber(n){
return typeof n == 'number' && !isNaN(n);
}

window.onload=function(){
var a=0,b=1,c=2.2,d=-3,e=-4.4,f=10/3;
var shouldBeTrue=[a,b,c,d,e,f];

var aa="0",bb="1",cc="2.2",dd="-3",ee="-4.4",ff="10/3";
var shouldBeFalse=[aa,bb,cc,dd,ee,ff];

var aaa,bbb=true,ccc=false,ddd=document.getElementsByTagName('html');
var alsoTheseBeFalse=[aaa,bbb,ccc,ddd,""," ",,null,NaN];

for(var i=0;i<shouldBeTrue.length;i++)
    if(isNumber(shouldBeTrue[i]) != true) alert("x");
for(i=0;i<shouldBeFalse.length;i++)
    if(isNumber(shouldBeFalse[i]) != false) alert("x");
for(i=0;i<alsoTheseBeFalse.length;i++)
    if(isNumber(alsoTheseBeFalse[i]) != false) alert("x");
}

Что еще я должен проверить, чтобы убедиться, что моя функция на 101% идеальна во всех отношениях?(также, если вы знаете лучшую функцию, пожалуйста, скажите мне)

Ответы [ 5 ]

18 голосов
/ 16 декабря 2011

Если вы хотите проверить, является ли число действительным числом, вам также следует проверить, является ли оно конечным:

function isNumber(n){
    return typeof n == 'number' && !isNaN(n) && isFinite(n);
 }

Другой метод (пояснение ниже):

function isNumber(n){
    return typeof n == 'number' && !isNaN(n - n);
}

Обновление: два выражения для проверки действительного числа

Так как числа JavaScript представляют собой действительные числа, операнд вычитания на том же числе должен давать нулевое значение (аддитивная идентичность) . Числа вне диапазона должны (и будут) недействительными, NaN.

1        - 1        = 0    // OK
Infinity - Infinity = NaN  // Expected
NaN      - NaN      = NaN  // Expected
NaN      - Infinity = NaN
1 голос
/ 24 сентября 2016

JS числа могут быть среди следующих значений:

  • Конечные числа
  • +Infinity и -Infinity
  • NaN

Тогда есть также нечисловые значения, которые приводятся к числам, например, числовые объекты.Возможно, вы захотите считать их числовыми.

Если вы хотите проверить только конечные числа, просто используйте Number.isFinite:

Number.isFinite(value)

var isNumber = Number.isFinite;
assert('isNumber(1)', true);
assert('isNumber(1.1)', true);
assert('isNumber(+0)', true);
assert('isNumber(-0)', true);
assert('isNumber(-1.1)', true);
assert('isNumber(Math.PI)', true);
assert('isNumber(1e300)', true);
assert('isNumber(+Infinity)', false);
assert('isNumber(-Infinity)', false);
assert('isNumber(NaN)', false);
assert('isNumber(null)', false);
assert('isNumber(undefined)', false);
assert('isNumber(true)', false);
assert('isNumber(false)', false);
assert('isNumber("123")', false);
assert('isNumber("foo")', false);
assert('isNumber(new Number(1))', false);
assert('isNumber([])', false);
assert('isNumber({})', false);
assert('isNumber(function(){})', false);
function assert(code, expected) {
  var result = eval(code);
  console.log('Test ' + (result===expected ? 'pass' : 'FAIL') + ': ', code, ' -> ', result);
}

Если вы хотите включить бесконечность, отметьте тип и исключите NaN:

typeof value === "number" && !Number.isNaN(value)

function isNumber(value) {
  return typeof value === "number" && !Number.isNaN(value);
}
assert('isNumber(1)', true);
assert('isNumber(1.1)', true);
assert('isNumber(+0)', true);
assert('isNumber(-0)', true);
assert('isNumber(-1.1)', true);
assert('isNumber(Math.PI)', true);
assert('isNumber(1e300)', true);
assert('isNumber(+Infinity)', true);
assert('isNumber(-Infinity)', true);
assert('isNumber(NaN)', false);
assert('isNumber(null)', false);
assert('isNumber(undefined)', false);
assert('isNumber(true)', false);
assert('isNumber(false)', false);
assert('isNumber("123")', false);
assert('isNumber("foo")', false);
assert('isNumber(new Number(1))', false);
assert('isNumber([])', false);
assert('isNumber({})', false);
assert('isNumber(function(){})', false);
function assert(code, expected) {
  var result = eval(code);
  console.log('Test ' + (result===expected ? 'pass' : 'FAIL') + ': ', code, ' -> ', result);
}

Если вы хотите рассматривать числовые объекты как числа, вы можете развернуть их, используя

value = Number.valueOf.call(value); // throws if value was not a number object

function isNumber(value) {
  try { value = Number.prototype.valueOf.call(value); } catch(err) { }
  return Number.isFinite(value);
}
assert('isNumber(1)', true);
assert('isNumber(1.1)', true);
assert('isNumber(+0)', true);
assert('isNumber(-0)', true);
assert('isNumber(-1.1)', true);
assert('isNumber(Math.PI)', true);
assert('isNumber(1e300)', true);
assert('isNumber(+Infinity)', false);
assert('isNumber(-Infinity)', false);
assert('isNumber(NaN)', false);
assert('isNumber(null)', false);
assert('isNumber(undefined)', false);
assert('isNumber(true)', false);
assert('isNumber(false)', false);
assert('isNumber("123")', false);
assert('isNumber("foo")', false);
assert('isNumber(new Number(1))', true);
assert('isNumber([])', false);
assert('isNumber({})', false);
assert('isNumber(function(){})', false);
function assert(code, expected) {
  var result = eval(code);
  console.log('Test ' + (result===expected ? 'pass' : 'FAIL') + ': ', code, ' -> ', result);
}

Если вы хотите включить произвольные значения, приводимые к числам, вы можете использовать унарный + для приведения.isNaN функция (не путать с Number.isNaN), которая будет сначала приводить, а затем сравнивать с NaN.Но имейте в виду, что строки пробелов и null приводятся к +0, а не NaN.Поэтому вас может заинтересовать Проверка десятичных чисел в JavaScript - IsNumeric ()

0 голосов
/ 30 июля 2018

Я использую комбинацию разбора и проверки номеров .. как указано ниже

function isNumber(inputValue){ return ((parseFloat(inputValue) ==0 || parseFloat(inputValue)) && !isNaN(inputValue)); };

надеюсь, это поможет

0 голосов
/ 16 декабря 2011

Если вы считаете, что число в его обертке объекта является числом, то оно потерпит неудачу с:

isNumber( new Number(123) )

Поскольку у downvoter есть некоторые проблемы с пониманием, которые не могут быть устраненыпростой тест, new Number(123) вернет 'object' из теста typeof и как таковой не пройдет.

0 голосов
/ 16 декабря 2011

Это зависит от того, что вы хотите считать числом.Ваш код классифицирует Infinity и -Infinity как числа.Если вы не хотите этого, замените! IsNaN (n) на isFinite (n).

И ваш код классифицирует '42' (строковый литерал) как не число из-за проверки типа;но я предположил, что это намеренно.

...