Преобразование всей строки в целое число в JavaScript

Недавно я столкнулся с фрагментом кода, очень похожим на этот:

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

Кажется, она покрывает все вышеперечисленные проблемы. Кто-нибудь знает что-нибудь не так с этой техникой или, может быть, более простой способ получить те же результаты?

7
задан drs9222 12 November 2010 в 19:45
поделиться