Обеспечить ввод числовой (с плавающей запятой) с помощью Javascript, позволяющий знак минус? [Дубликат]

A NullReferenceException бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.

Например:

  1. При использовании метода string пустой строки:
    string str = string.Empty;
    str.ToLower(); // throw null reference exception
    
  2. Когда свойство нулевого объекта доступно:
    Public Class Person {
        public string Name { get; set; }
    }
    Person objPerson;
    objPerson.Name  /// throw Null refernce Exception 
    
812
задан Electrons_Ahoy 6 October 2008 в 20:12
поделиться

21 ответ

Чтобы проверить, является ли переменная (включая строку) числом, проверьте, не является ли она числом:

Это работает независимо от того, содержит ли переменная строку или номер.

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

Конечно, вы можете это отрицать, если вам нужно. Например, чтобы реализовать пример 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 two may be different
parseInt('12a5')   // 12       from what you expected to see. 

Поплавки

Имейте в виду, что, в отличие от +num, parseInt (как следует из названия) преобразует float в целое число, отрубив все после десятичной точки (если вы хотите использовать parseInt() из-за этого поведения, вам, вероятно, лучше использовать другой метод вместо ):

+'12.345'          // 12.345
parseInt(12.345)   // 12
parseInt('12.345') // 12

Пустые строки

Пустые строки могут быть немного противоречивыми. +num преобразует пустые строки в ноль, а isNaN() принимает одно и то же:

+''                // 0
isNaN('')          // false

Но parseInt() не согласен:

parseInt('')       // NaN
1689
ответ дан Gust van de Wal 26 August 2018 в 00:37
поделиться
  • 1
    Очень важная заметка о parseInt заключается в том, что она позволит вам указать радиус для преобразования строки в int. Это большая проблема, поскольку она пытается угадать радиус для вас, если вы его не дадите. Так, например: parseInt («17») приводит к 17 (десятичный, 10), но parseInt («08») приводит к 0 (восьмеричный, 8). Итак, если вы не намерены использовать другое, безопаснее использовать parseInt (число, 10), явно указывая 10 в качестве основания. – Adam Raney 28 April 2009 в 23:48
  • 2
    Обратите внимание, что! IsNaN (undefined) возвращает false. – David 6 November 2010 в 06:34
  • 3
    Это просто неправильно - как получилось так много упреков? Вы не можете использовать isNaN & quot; Чтобы проверить, не является ли переменная номером & quot ;. & quot; не число & quot; не то же самое, что и «IEEE-794 NaN», что и означает isNaN. В частности, это использование терпит неудачу при тестировании логических и пустых строк, по крайней мере. См. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . – EML 30 December 2013 в 02:33
  • 4
    Самый быстрый способ проверить, является ли что-то числом, - это «равный самому себе». check: var n = 'a'; if (+n === +n) { // is number } Это ~ 3994% быстрее, чем isNaN в последней версии Chrome. См. Тест производительности здесь: jsperf.com/isnan-vs-typeof/5 – Kevin Jurkowski 22 January 2014 в 02:59
  • 5
    ** Предупреждение ** Этот ответ неверен. Используйте на свой риск. Пример: isNaN(1 + false + parseInt("1.do you trust your users?")) – keithpjolley 31 May 2017 в 14:50

Если вы просто пытаетесь проверить, является ли строка целым числом (без десятичных знаков), регулярное выражение - это хороший способ. Другие методы, такие как isNaN, слишком сложны для чего-то настолько простого.

function isNumeric(value) {
    return /^-{0,1}\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('123.4'));        // false
console.log(isNumeric(''));             // false
console.log(isNumeric(undefined));      // false
console.log(isNumeric(null));           // false

Чтобы использовать только целые числа positive , используйте это:

function isNumeric(value) {
    return /^\d+$/.test(value);
}

console.log(isNumeric('123'));          // true
console.log(isNumeric('-23'));          // false
35
ответ дан Clay 26 August 2018 в 00:37
поделиться
  • 1
    В этом случае RegEx == bad – Joel Coehoorn 6 October 2008 в 20:27
  • 2
    Это не выполняется для шестнадцатеричных чисел (например, 0x12), плавает без начального нуля (например, 0,42) и отрицательных чисел. – Ori 18 April 2012 в 02:25
  • 3
    console.log (IsNumeric ( '- 1')); – yongnan 13 November 2014 в 02:02
  • 4
    @JoelCoehoorn Позаботьтесь о том, почему RegExp == плохо здесь? Кажется, для меня был действительный прецедент. – computrius 30 December 2014 в 17:02
  • 5
    Есть больше способов, чем кажется, чтобы построить число (шестнадцатеричные числа в другом комментарии - всего лишь один пример), и есть много чисел, которые могут считаться недействительными (переполнение типа, слишком точное и т. Д.). Кроме того, регулярное выражение работает медленнее и сложнее, чем использование встроенных механизмов – Joel Coehoorn 30 December 2014 в 19:18
  • 6
    console.log (IsNumeric ( '2e2')); – Gael 2 March 2015 в 16:27
  • 7
    Также терпит неудачу, если число - это определенные значения с плавающей запятой. – Michael 2 March 2016 в 23:13
  • 8
    Возможно, просто переименуйте & quot; isNumeric & quot; к "hasOnlyDigits". во многих случаях это именно тот чек, который вы ищете. – gus3001 9 October 2017 в 20:39

Вы можете использовать результат Number при передаче аргумента его конструктору.

Если аргумент (строка) не может быть преобразован в число, он возвращает NaN, поэтому вы можете определить, была ли приведенная строка допустимым числом или нет.

Примечания: Обратите внимание, что при передаче пустой строки или '\t\t' и '\n\t', когда Number возвращает 0; Передача true вернет 1, а false вернет 0.

    Number('34.00') // 34
    Number('-34') // -34
    Number('123e5') // 12300000
    Number('123e-5') // 0.00123
    Number('999999999999') // 999999999999
    Number('9999999999999999') // 10000000000000000 (integer accuracy up to 15 digit)
    Number('0xFF') // 255
    Number('Infinity') // Infinity  

    Number('34px') // NaN
    Number('xyz') // NaN
    Number('true') // NaN
    Number('false') // NaN

    // cavets
    Number('    ') // 0
    Number('\t\t') // 0
    Number('\n\t') // 0
5
ответ дан Community 26 August 2018 в 00:37
поделиться

Моя попытка немного запутать, возможно, не лучшее решение

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));           // true
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
1
ответ дан Endless 26 August 2018 в 00:37
поделиться
  • 1
    Это не так уж плохо, два плохих, это не работает для каких-либо десятичных обозначений, таких как (1) научная нотация и (2) нотация not-base-10, такая как восьмеричная (042) и шестнадцатеричная (0x45f ) – Domi 29 April 2017 в 08:58

Возможно, есть один или два человека, которые сталкиваются с этим вопросом, которым требуется гораздо более строгая проверка, чем обычно (как и я). В этом случае это может быть полезно:

if(str === String(Number(str))) {
  // it's a "perfectly formatted" number
}

Остерегайтесь! Это будет отклонять строки, такие как .1, 40.000, 080, 00.1. Это очень придирчиво - строка должна соответствовать «самой минимальной совершенной форме» номера для прохождения этого теста.

Он использует конструктор String и Number для перевода строки в число и назад, и, таким образом, проверяет, соответствует ли «идеальная минимальная форма» JavaScript (тот, который он преобразовал с помощью исходного конструктора Number) в исходную строку.

5
ответ дан Joe 26 August 2018 в 00:37
поделиться
  • 1
    Спасибо @JoeRocc. Мне тоже это нужно, но только для целых чисел, поэтому я добавил: (str === String(Math.round(Number(str)))). – keithpjolley 31 May 2017 в 14:43

Я тестировал, и решение Майкла лучше. Проголосуйте за его ответ выше (найдите эту страницу для «Если вы действительно хотите убедиться, что строка», чтобы найти ее). В сущности, его ответ таков:

function isNumeric(num){
  num = "" + num; //coerce num to be a string
  return !isNaN(num) && !isNaN(parseFloat(num));
}

Он работает для каждого тестового примера, который я описал здесь: https://jsfiddle.net/wggehvp9/5/

Многие из других решений терпят неудачу для этих случаев: '', null, "", true и []. Теоретически вы можете использовать их с правильной обработкой ошибок, например:

return !isNaN(num);

или

return (+num === +num);

со специальной обработкой для / \ s /, null, "" , true, false, [] (и другие?)

5
ответ дан JohnP2 26 August 2018 в 00:37
поделиться
  • 1
    Это все равно возвращает true с конечными / ведущими пробелами. Добавление чего-то подобного в return-statement позволило бы решить следующее: & amp; & amp; ! / ^ \ S + | \ s + $ / g.test (ул) – Ultroman the Tacoman 15 May 2017 в 13:13
  • 2
    Итак, «123» должно быть ложным, а не числом, а «1234» должно быть числом? Мне нравится, как это происходит, так что & quot; 123 & Quot; это число, но это может быть по усмотрению разработчика, если ведущее или конечное пространство должно изменить значение. – JohnP2 14 June 2017 в 19:10

parseInt (), но имейте в виду, что эта функция немного отличается в том смысле, что она, например, возвращает 100 для parseInt («100px»).

5
ответ дан liggett78 26 August 2018 в 00:37
поделиться

Старый вопрос, но в данных ответах несколько точек.

Научная нотация.

!isNaN('1e+30') is true, однако в большинстве случаев, когда люди

Большие плавающие числа могут вести себя странно

Наблюдать (используя 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 цифр максимум (после опущения ведущих нулей).

Infinity

> 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);
  }

Однако даже этот далеко не полный. Ведущие нули здесь не обрабатываются, но они проводят проверку длины.

10
ответ дан mark 26 August 2018 в 00:37
поделиться
  • 1
    «однако в большинстве случаев, когда люди запрашивают номера, они не хотят сопоставлять такие вещи, как 1е + 30». Почему ты так сказал? Если кто-то хочет знать, содержит ли строка число, мне кажется, что они захотят узнать, содержит ли он число, а 1е + 30 - число. Конечно, если бы я тестировал строку для числового значения в JavaScript, я бы хотел, чтобы это соответствовало. – Dan Jones 4 January 2017 в 18:42

Если вы действительно хотите убедиться, что строка содержит только число, любое число (целая или плавающая точка) и точно число, вы не можете использовать 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()isNaN()) делает правильную вещь для каждого случая, когда parseFloat() возвращает число, когда оно должно 't, и наоборот. Итак, чтобы узнать, действительно ли строка точно и только число, вызовите обе функции и посмотрите, верят ли они оба :

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))
}
22
ответ дан Michael 26 August 2018 в 00:37
поделиться
  • 1
    Это возвращает true, когда строка имеет начальные или конечные пробелы. ' 1', '2 ' и ' 3 ' все возвращают true. – Rudey 22 February 2017 в 21:07
  • 2
    Добавление чего-то подобного в return-statement позволило бы решить следующее: & amp; & amp; ! / ^ \ S + | \ s + $ / g.test (ул) – Ultroman the Tacoman 15 May 2017 в 13:07
  • 3
    @RuudLenders - большинству людей будет безразлично, есть ли пробелы, которые отключаются, чтобы сделать строку допустимым числом, потому что ее легко случайно помещают в дополнительные пространства в большом количестве интерфейсов. – Ian 3 November 2017 в 20:34
  • 4
    Это верно, если числовая строка поступает с пользовательского ввода. Но я думал, что я должен упомянуть пробелы в любом случае, потому что я думаю, что большинство людей, которым нужна функция isNumber, не имеют дело с пользовательскими интерфейсами. Кроме того, хороший ввод номера не позволит создавать пробелы. – Rudey 4 November 2017 в 22:25

PFB - рабочее решение:

 function(check){ 
    check = check + "";
    var isNumber =   check.trim().length>0? !isNaN(check):false;
    return isNumber;
    }
1
ответ дан Predhin 26 August 2018 в 00:37
поделиться

Ну, я использую этот, который я сделал ...

Он работает до сих пор:

function checkNumber(value) {
    if ( value % 1 == 0 )
    return true;
    else
    return false;
}

Если вы заметили какие-либо проблемы с этим, скажите мне, пожалуйста.

4
ответ дан Rafael 26 August 2018 в 00:37
поделиться
  • 1
    Это дает неправильный результат для пустой строки, пустого массива, false и null. – Ori 18 April 2012 в 02:23
  • 2
    Разве это не должно быть тройным равным? – toasted_flakes 9 May 2013 в 16:44
  • 3
    В моем приложении мы разрешаем только a-z A-Z и 0-9 символов. Я нашел описанное выше, если строка не начиналась с 0xnn, а затем она возвращала бы ее как числовую, если она не должна была. Я написал в комментарии ниже, поэтому форматирование остается нетронутым. – rwheadon 8 July 2014 в 16:10
  • 4
    вы могли бы просто сделать «return value% 1 === 0 ' – Brian Schermerhorn 10 July 2015 в 21:42

В моем приложении мы разрешаем только a-z A-Z и 0-9 символов. Я нашел ответ выше, используя « string % 1 === 0», если строка не начиналась с 0xnn (например, 0x10), а затем она возвращала бы ее как числовую, когда мы этого не хотели. Следующая простая ловушка в моей числовой проверке, похоже, делает трюк в наших конкретных случаях.

function isStringNumeric(str_input){   
    //concat a temporary 1 during the modulus to keep a beginning hex switch combination from messing us up   
    //very simple and as long as special characters (non a-z A-Z 0-9) are trapped it is fine   
    return '1'.concat(str_input) % 1 === 0;}

Внимание: это может быть связано с давней ошибкой в ​​Javascript и Actionscript [Number ("1" + the_string)% 1 === 0)], я не могу говорить за это, но это именно то, что нам нужно.

0
ответ дан rwheadon 26 August 2018 в 00:37
поделиться
  • 1
    Почему это будет ошибкой в ​​JavaScript? – Bergi 8 July 2014 в 16:29
  • 2
    Я просто не вижу того же поведения с аналогичным решением в perl или C, и так как я не являюсь разработчиком языка программирования для javascript или actionscript, я не знаю, является ли поведение, которое я испытываю действительно намеренно или нет. – rwheadon 8 July 2014 в 17:16
  • 3
    Ну, javascript немного небрежно относится к неявному типу, но как только вы знаете, что можете легко понять, как это работает. Вы бросаете строки в числа (путем вызова на них числовой % 1), и это будет интерпретировать строку как шестнадцатеричный или плавающий литерал. – Bergi 8 July 2014 в 17:23

Мне нравится простота этого.

Number.isNaN(Number(value))

Вышеупомянутый обычный Javascript, но я использую его в сочетании с типом типа typeguard для проверки интеллектуального типа. Это очень полезно для компилятора typescript, чтобы дать вам правильную intellisense и никаких ошибок типа.

Типпечатные типы typecript

isNotNumber(value: string | number): value is string {
    return Number.isNaN(Number(this.smartImageWidth));
}
isNumber(value: string | number): value is number {
    return Number.isNaN(Number(this.smartImageWidth)) === false;
}

Допустим, у вас есть свойство width, которое является number | string. Вы можете захотеть сделать логику на основе того, является ли она строкой.

var width: number|string;
width = "100vw";

if (isNotNumber(width)) 
{
    // the compiler knows that width here must be a string
    if (width.endsWith('vw')) 
    {
        // we have a 'width' such as 100vw
    } 
}
else 
{
    // the compiler is smart and knows width here must be number
    var doubleWidth = width * 2;    
}

Типная защита достаточно умна, чтобы ограничить тип width внутри оператора if ТОЛЬКО string , Это позволяет компилятору разрешить width.endsWith(...), который он не допустил бы, если бы этот тип был string | number.

Вы можете вызвать тип защиты, какой вы хотите isNotNumber, isNumber, isString, isNotString, но я думаю, что isString неоднозначно и труднее читать.

1
ответ дан Simon_Weaver 26 August 2018 в 00:37
поделиться

Цитата:

isNaN (num) // возвращает true, если переменная НЕ содержит допустимое число

не совсем верно, если вам нужно для проверки ведущих / конечных пробелов - например, когда требуется определенное количество цифр, и вам нужно получить, скажем, «1111», а не «111» или «111», возможно, для ввода PIN-кода.

Лучше использовать:

var num = /^\d+$/.test(num)
3
ответ дан Siubear 26 August 2018 в 00:37
поделиться
  • 1
    Значения '-1', '0.1' и '1e10' все возвращают false. Кроме того, значения, превышающие положительную бесконечность или меньшие, чем отрицательная бесконечность, верны, хотя они, вероятно, должны возвращать false. – Rudey 22 February 2017 в 21:11

Попробуйте функцию isNan :

Функция isNaN () определяет, является ли значение незаконным числом (Not-a-Number).

Эта функция возвращает true, если значение равно NaN. В противном случае он возвращает false.

Эта функция отличается от метода Number.isNaN () , характерного для номера.

& nbsp; Глобальная функция isNaN () преобразует проверенное значение в число, а затем проверяет его.

Number.isNan () не преобразует значения в число и не возвращает true для любого значения, которое а не типа Number ...

20
ответ дан tanguy_k 26 August 2018 в 00:37
поделиться
  • 1
    Рад, что смог помочь :) – theraccoonbear 6 October 2008 в 20:32
  • 2
    Убедитесь, что вы добавили чек для пустой строки. isNaN ('') возвращает false, но вы, вероятно, хотите, чтобы в этом случае он возвращал true. – Michael Haren 6 October 2008 в 20:44
  • 3
    isFinite - лучшая проверка - речь идет о странном угловом случае Infinity – Jonny Leeds 20 January 2015 в 13:02
  • 4
    @MichaelHaren Не достаточно! isNaN() возвращает false для строки ANY , содержащей только пробельные символы, включая такие вещи, как '\ u00A0'. – Michael 2 March 2016 в 23:13
  • 5
    ПРЕДУПРЕЖДЕНИЕ: Не работает для значений: null, & quot; (пустая строка) и false. – Jenny O'Reilly 27 July 2017 в 08:02

Если кто-то когда-либо зашел так далеко, я потратил некоторое время на взломы, пытаясь исправить момент. js ( https://github.com/moment/moment ). Вот что я отнял у него:

function isNumeric(val) {
    var _val = +val;
    return (val !== val + 1) //infinity check
        && (_val === +val) //Cute coercion check
        && (typeof val !== 'object') //Array/object check
}

Обрабатывает следующие случаи:

True! :

isNumeric("1"))
isNumeric(1e10))
isNumeric(1E10))
isNumeric(+"6e4"))
isNumeric("1.2222"))
isNumeric("-1.2222"))
isNumeric("-1.222200000000000000"))
isNumeric("1.222200000000000000"))
isNumeric(1))
isNumeric(0))
isNumeric(-0))
isNumeric(1010010293029))
isNumeric(1.100393830000))
isNumeric(Math.LN2))
isNumeric(Math.PI))
isNumeric(5e10))

Неверно! :

isNumeric(NaN))
isNumeric(Infinity))
isNumeric(-Infinity))
isNumeric())
isNumeric(undefined))
isNumeric('[1,2,3]'))
isNumeric({a:1,b:2}))
isNumeric(null))
isNumeric([1]))
isNumeric(new Date()))

По иронии судьбы, тот, с которым я боюсь больше всего:

isNumeric(new Number(1)) => false

Любые предложения приветствуются. :]

1
ответ дан The Dembinski 26 August 2018 в 00:37
поделиться
  • 1
    Как насчет isNumeric(' ') и isNumeric('')? – Alex Cory 31 January 2017 в 05:00
  • 2
    Я хотел бы добавить && (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Number, чтобы решить вышеупомянутую проблему, а также один из них. – frankenapps 15 January 2018 в 20:08

Почему реализация jQuery недостаточно хороша?

function isNumeric(a) {
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0;
};

Майкл предложил что-то вроде этого (хотя я украл измененную версию user1691651-John здесь):

function isNumeric(num){
    num = "" + num; //coerce num to be a string
    return !isNaN(num) && !isNaN(parseFloat(num));
}

Ниже приведено решение с наиболее вероятной плохими характеристиками, но надежными результатами. Это приложение, сделанное из реализации jQuery 1.12.4 и ответа Майкла, с дополнительной проверкой для ведущих / конечных пробелов (поскольку версия Майкла возвращает true для чисел с ведущими / конечными пробелами):

function isNumeric(a) {
    var str = a + "";
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0 &&
           !/^\s+|\s+$/g.test(str) &&
           !isNaN(str) && !isNaN(parseFloat(str));
};

Однако последняя версия имеет две новые переменные. Один из них можно обойти, выполнив:

function isNumeric(a) {
    if ($.isArray(a)) return false;
    var b = a && a.toString();
    a = a + "";
    return b - parseFloat(b) + 1 >= 0 &&
            !/^\s+|\s+$/g.test(a) &&
            !isNaN(a) && !isNaN(parseFloat(a));
};

Я не тестировал ни одного из них очень, другими способами, чем вручную проверять несколько вариантов использования, с которыми я буду бить текущее затруднительное положение, которое является очень стандартным материалом. Это положение «стоящих на плечах гигантов».

3
ответ дан Ultroman the Tacoman 26 August 2018 в 00:37
поделиться

Мое решение:

// 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;
 };

Вы можете добавить дополнительные условия внутри цикла, чтобы соответствовать вашим конкретным потребностям.

0
ответ дан GoTo 26 August 2018 в 00:37
поделиться

Вот однострочный, чтобы проверить, является ли sNum допустимым числовым значением; он был протестирован для самых разных входов:

!isNaN(+s.replace(/\s|\$/g, ''));  // returns True if numeric value
0
ответ дан lifebalance 26 August 2018 в 00:37
поделиться

Я делаю это так:

function isString(value)
{
    return value.length !== undefined;
}
function isNumber(value)
{
    return value.NaN !== undefined;
}

Конечно, isString () будет сработано здесь, если вы передадите другой объект, у которого определена длина.

-4
ответ дан Murray Lang 26 August 2018 в 00:37
поделиться

Вы можете использовать типы, например, с librar y, чтобы получить статическую проверку времени компиляции. Конечно, не очень полезно для ввода пользователем.

// @flow

function acceptsNumber(value: number) {
  // ...
}

acceptsNumber(42);       // Works!
acceptsNumber(3.14);     // Works!
acceptsNumber(NaN);      // Works!
acceptsNumber(Infinity); // Works!
acceptsNumber("foo");    // Error!
0
ответ дан What Would Be Cool 26 August 2018 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: