Недавно я столкнулся с фрагментом кода, очень похожим на этот:
var nHours = parseInt(txtHours);
if( isNaN(nHours)) // Do something
else // Do something else with the value
Разработчик, написавший этот код, был впечатлен, что nHours
будет либо целым числом, которое точно соответствует txtHours
, либо NaN
. В этом предположении есть несколько ошибок.
Во-первых, разработчик оставил аргумент системы счисления, что означает, что ввод «09»
приведет к значению 0
вместо 9
. Эту проблему можно решить, добавив основание системы счисления следующим образом:
var nHours = parseInt(txtHours,10);
if( isNaN(nHours)) // Do something
else // Do something else with the value
Далее, ввод «1.5»
приведет к значению 1
вместо NaN
], чего не ожидал разработчик с 1. 5
не является целым числом. Аналогичным образом, значение «1a»
приведет к значению 1
вместо NaN
.
Все эти проблемы в некоторой степени понятны, поскольку это один из наиболее распространенных примеров того, как преобразовать строку в целое число, и в большинстве случаев эти случаи не обсуждаются.
Во всяком случае, это заставило меня подумать, что я не знаю ни одного встроенного способа получения целого числа, такого как этот. Существует Number (txtHours)
(или + txtHours
), которое подходит ближе, но принимает нецелые числа и обрабатывает null
и ""
] как 0 вместо NaN
.
Чтобы помочь разработчику, я предоставил следующую функцию:
function ConvertToInteger(text)
{
var number = Math.floor(+text);
return text && number == text ? number : NaN;
}
Кажется, она покрывает все вышеперечисленные проблемы. Кто-нибудь знает что-нибудь не так с этой техникой или, может быть, более простой способ получить те же результаты?