Niedawno wpadł na kawałek kodu bardzo podobne do tego:Konwersja cały łańcuch na liczbę całkowitą w JavaScript
var nHours = parseInt(txtHours);
if(isNaN(nHours)) // Do something
else // Do something else with the value
Deweloper, który napisał ten kod był pod wrażeniem, że nHours
albo by być liczbą całkowitą który dokładnie pasował do txtHours
lub . Jest kilka rzeczy nie tak z tym założeniem.
Po pierwsze, deweloper po lewej stronie argumentu radix, co oznacza wprowadzenie "09"
, spowoduje, że zamiast 9
pojawi się wartość 0
. Ten problem może być rozwiązany poprzez dodanie przelicznika w taki sposób:
var nHours = parseInt(txtHours,10);
if(isNaN(nHours)) // Do something
else // Do something else with the value
Następnie wejście "1.5"
spowoduje wartości 1
zamiast NaN
który nie ma co oczekiwać od 1.5
deweloper nie jest liczbą całkowitą. Podobnie wartość "1a"
spowoduje wyświetlenie wartości 1
zamiast NaN
.
Wszystkie te problemy są dość zrozumiałe, ponieważ jest to jeden z najczęstszych przykładów konwersji ciągu na liczbę całkowitą, a większość miejsc nie omawia tych przypadków.
W każdym razie dało mi to do myślenia, że nie jestem świadomy żadnych wbudowane w sposób, aby uzyskać taką liczbę całkowitą. Istnieje Number(txtHours)
(lub +txtHours
), który jest bliżej, ale akceptuje liczby niecałkowite i traktuje null
i ""
jako 0 zamiast NaN
.
Aby pomóc programiście z I, pod warunkiem następującą funkcję:
function ConvertToInteger(text)
{
var number = Math.floor(+text);
return text && number == text ? number : NaN;
}
to wydaje się obejmować wszystkie powyższe problemy. Czy ktoś wie o czymś złym w tej technice, czy może prostszy sposób uzyskania tych samych wyników?
Prawdopodobnie powielone [http://stackoverflow.com/questions/131406/what-is-the-best-metod-to-convert-to-an-integer-in-javascript](http://stackoverflow.com/questions/131406/what-is-the-best-method-to-convert-to-an-integer-in-javascript) – subosito
'Number (txtHours)' zamiast 'number (txtHours)' –
Istnieje również konwencja, w której nazwy funkcji konstruktora są pisane wielką literą, a zwykłe nazwy funkcji nie. Polecam trzymać się tej konwencji, używając małej litery, na przykład 'convertToInteger' lub' toInteger'. Poza tym funkcja wygląda na całkiem solidną. –