A NullReferenceException
бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.
Например:
string str = string.Empty;
str.ToLower(); // throw null reference exception
Public Class Person {
public string Name { get; set; }
}
Person objPerson;
objPerson.Name /// throw Null refernce Exception
Это работает независимо от того, содержит ли переменная строку или номер.
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
Если вы просто пытаетесь проверить, является ли строка целым числом (без десятичных знаков), регулярное выражение - это хороший способ. Другие методы, такие как 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
Вы можете использовать результат 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
Моя попытка немного запутать, возможно, не лучшее решение
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
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
) в исходную строку.
(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, [] (и другие?)
parseInt (), но имейте в виду, что эта функция немного отличается в том смысле, что она, например, возвращает 100 для parseInt («100px»).
, 10
. parseInt('09')
теперь равно 9.
– Rory O'Kane
2 October 2017 в 19:48
Старый вопрос, но в данных ответах несколько точек.
Научная нотация.
!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);
}
Однако даже этот далеко не полный. Ведущие нули здесь не обрабатываются, но они проводят проверку длины.
Если вы действительно хотите убедиться, что строка содержит только число, любое число (целая или плавающая точка) и точно число, вы не можете использовать 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))
}
' 1'
, '2 '
и ' 3 '
все возвращают true.
– Rudey
22 February 2017 в 21:07
isNumber
, не имеют дело с пользовательскими интерфейсами. Кроме того, хороший ввод номера не позволит создавать пробелы.
– Rudey
4 November 2017 в 22:25
PFB - рабочее решение:
function(check){
check = check + "";
var isNumber = check.trim().length>0? !isNaN(check):false;
return isNumber;
}
Ну, я использую этот, который я сделал ...
Он работает до сих пор:
function checkNumber(value) {
if ( value % 1 == 0 )
return true;
else
return false;
}
Если вы заметили какие-либо проблемы с этим, скажите мне, пожалуйста.
В моем приложении мы разрешаем только 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)], я не могу говорить за это, но это именно то, что нам нужно.
% 1
), и это будет интерпретировать строку как шестнадцатеричный или плавающий литерал.
– Bergi
8 July 2014 в 17:23
Мне нравится простота этого.
Number.isNaN(Number(value))
Вышеупомянутый обычный Javascript, но я использую его в сочетании с типом типа typeguard для проверки интеллектуального типа. Это очень полезно для компилятора typescript, чтобы дать вам правильную intellisense и никаких ошибок типа.
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
неоднозначно и труднее читать.
Цитата:
isNaN (num) // возвращает true, если переменная НЕ содержит допустимое число
blockquote>не совсем верно, если вам нужно для проверки ведущих / конечных пробелов - например, когда требуется определенное количество цифр, и вам нужно получить, скажем, «1111», а не «111» или «111», возможно, для ввода PIN-кода.
Лучше использовать:
var num = /^\d+$/.test(num)
'-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 ...
blockquote>
isNaN()
возвращает false
для строки ANY i>, содержащей только пробельные символы, включая такие вещи, как '\ u00A0'.
– Michael
2 March 2016 в 23:13
Если кто-то когда-либо зашел так далеко, я потратил некоторое время на взломы, пытаясь исправить момент. 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
Любые предложения приветствуются. :]
&& (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));
};
Я не тестировал ни одного из них очень, другими способами, чем вручную проверять несколько вариантов использования, с которыми я буду бить текущее затруднительное положение, которое является очень стандартным материалом. Это положение «стоящих на плечах гигантов».
Мое решение:
// 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;
};
Вы можете добавить дополнительные условия внутри цикла, чтобы соответствовать вашим конкретным потребностям.
Вот однострочный, чтобы проверить, является ли sNum
допустимым числовым значением; он был протестирован для самых разных входов:
!isNaN(+s.replace(/\s|\$/g, '')); // returns True if numeric value
Я делаю это так:
function isString(value)
{
return value.length !== undefined;
}
function isNumber(value)
{
return value.NaN !== undefined;
}
Конечно, isString () будет сработано здесь, если вы передадите другой объект, у которого определена длина.
Вы можете использовать типы, например, с librar y, чтобы получить статическую проверку времени компиляции. Конечно, не очень полезно для ввода пользователем.
// @flow
function acceptsNumber(value: number) {
// ...
}
acceptsNumber(42); // Works!
acceptsNumber(3.14); // Works!
acceptsNumber(NaN); // Works!
acceptsNumber(Infinity); // Works!
acceptsNumber("foo"); // Error!
isNaN
& quot; Чтобы проверить, не является ли переменная номером & quot ;. & quot; не число & quot; не то же самое, что и «IEEE-794 NaN», что и означаетisNaN
. В частности, это использование терпит неудачу при тестировании логических и пустых строк, по крайней мере. См. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . – EML 30 December 2013 в 02:33var n = 'a'; if (+n === +n) { // is number }
Это ~ 3994% быстрее, чем isNaN в последней версии Chrome. См. Тест производительности здесь: jsperf.com/isnan-vs-typeof/5 – Kevin Jurkowski 22 January 2014 в 02:59isNaN(1 + false + parseInt("1.do you trust your users?"))
– keithpjolley 31 May 2017 в 14:50