Jak przekonwertować ciąg w JavaScript na liczbę całkowitą?
javascript
string
integer
data-conversion
cubuspl42
źródło
źródło
Odpowiedzi:
Najprostszym sposobem byłoby użycie
Number
funkcji natywnej :Jeśli to nie zadziała, istnieją metody parseInt , unary plus , parseFloat z floor i Math.round .
parsowanie:
unary plus, jeśli ciąg jest już w postaci liczby całkowitej:
jeśli Twój ciąg jest lub może być liczbą zmiennoprzecinkową i potrzebujesz liczby całkowitej:
lub, jeśli zamierzasz używać Math.floor kilka razy:
Jeśli jesteś typem, który zapomina wstawić podstawkę, gdy wywołujesz parseInt, możesz użyć parseFloat i zaokrąglić go, jak chcesz. Tutaj używam podłogi.
Co ciekawe, Math.round (jak Math.floor) wykona konwersję ciągu na liczbę, więc jeśli chcesz zaokrąglić liczbę (lub jeśli masz liczbę całkowitą w ciągu), jest to świetny sposób, być może mój ulubiony:
źródło
'4'>>0
i'4'>>>0
.parseInt
iparseFloat
chętnie przyjmuje listy.Number
Powraca tylkoNaN
konsekwentnie.NaN
każdą wartością, która nie jest liczbą całkowitą. Dlatego żaden z nich nie działa jakoNumber('2.2')
przymus2
iNumber('')
przymus na 0.Wypróbuj funkcję parsowania:
Ale jest problem. Jeśli spróbujesz przekonwertować „010” za pomocą funkcji parsowania, wykryje ona liczbę ósemkową i zwróci liczbę 8. Tak więc musisz określić podstawkę (od 2 do 36). W tym przypadku podstawa 10.
Przykład:
Pamiętaj, że
parseInt
ignoruje złe dane po przeanalizowaniu dowolnego ważnego elementu.Ten przewodnik będzie analizował jako 51:
źródło
parseInt('0asdf', 10)
produkuje0
.Istnieją dwa główne sposoby konwertowania ciągu na liczbę w javascript. Jednym ze sposobów jest parsowanie go, a drugim sposobem jest zmiana jego typu na Liczba. Wszystkie sztuczki w innych odpowiedziach (np. Jednoargumentowy plus) polegają na niejawnym wymuszeniu typu ciągu na liczbę. Możesz również zrobić to samo wyraźnie za pomocą funkcji Number.
Rozbiór gramatyczny zdania
parseInt i parseFloat to dwie funkcje używane do parsowania ciągów znaków na liczby. Parsowanie zakończy się po cichu, jeśli trafi w znak, którego nie rozpoznaje, co może być przydatne do parsowania ciągów takich jak „92px”, ale jest również nieco niebezpieczne, ponieważ nie spowoduje żadnego błędu przy złym wprowadzaniu, zamiast tego Zwrócę NaN, chyba że ciąg zaczyna się od cyfry. Białe znaki na początku łańcucha są ignorowane. Oto przykład tego, że robi coś innego niż chcesz i nie daje żadnych wskazówek, że coś poszło nie tak:
Dobrą praktyką jest zawsze podawanie podstawnika jako drugiego argumentu. W starszych przeglądarkach, jeśli ciąg zaczynałby się od 0, byłby interpretowany jako ósemkowy, gdyby nie podano podstawki, co zaskoczyło wiele osób. Zachowanie w systemie szesnastkowym jest wyzwalane przez rozpoczęcie łańcucha od 0x, jeśli nie podano żadnej podstawki, np
0xff
. Standard faktycznie zmienił się wraz z ecmascript 5, więc współczesne przeglądarki nie wyzwalają już ósemki, gdy na początku jest 0, jeśli nie podano podstawnika. parseInt rozumie podstawniki do podstawy 36, w którym to przypadku zarówno duże, jak i małe litery są traktowane jako równoważne.Zmiana typu ciągu na liczbę
Wszystkie inne sztuczki wspomniane powyżej, które nie używają parseInt, obejmują niejawne zmuszanie łańcucha do liczby. Wolę to robić jawnie,
To działa inaczej niż metody parsowania (chociaż nadal ignoruje białe znaki). Jest to bardziej rygorystyczne: jeśli nie rozumie całego łańcucha, niż zwraca
NaN
, więc nie można go używać do takich łańcuchów97px
. Ponieważ chcesz prymitywnej liczby zamiast obiektu opakowującego liczby, upewnij się, że nie umieszczasz jejnew
przed funkcją Number.Oczywiście konwersja na liczbę daje wartość, która może być liczbą zmiennoprzecinkową, a nie liczbą całkowitą, więc jeśli chcesz liczbę całkowitą, musisz ją zmodyfikować. Można to zrobić na kilka sposobów:
Każdy operator bitowy (tutaj zrobiłem bitowo lub, ale możesz również zrobić podwójną negację, jak we wcześniejszej odpowiedzi lub przesunięciu bitów) przekonwertuje wartość na 32-bitową liczbę całkowitą, a większość z nich zamieni się na liczbę całkowitą ze znakiem. Zauważ, że nie będzie to pożądane dla dużych liczb całkowitych . Jeśli liczby całkowitej nie można przedstawić w 32 bitach, zostanie ona zawinięta.
Aby działać poprawnie z większymi liczbami, należy użyć metod zaokrąglania
Należy pamiętać, że wszystkie te metody zrozumieć notacji wykładniczej, więc
2e2
jest200
raczej niż Nan. Ponadto Number rozumie „Infinity”, podczas gdy metody analizy nie.Zwyczaj
Jest mało prawdopodobne, aby którakolwiek z tych metod działała dokładnie tak, jak chcesz. Na przykład zwykle chciałbym, aby błąd był zgłaszany, jeśli parsowanie się nie powiedzie, i nie potrzebuję wsparcia dla nieskończoności, wykładniczej lub wiodących białych znaków. W zależności od przypadku, czasem warto napisać niestandardową funkcję konwersji.
Zawsze sprawdź, czy wynikiem działania metody Number lub jednej z metod analizy jest liczba, której oczekujesz. Prawie na pewno będziesz chciał użyć,
isNaN
aby upewnić się, że liczba nie jest NaN (zazwyczaj jedyny sposób, aby dowiedzieć się, że analiza nie powiodła się).źródło
97,8,00
czy nie. Prostą sztuczką jest zrobienie czegoś,.replace(/[^0-9]/g, "")
co usunie wszystkie cyfry z łańcucha, a następnie dokona konwersji. To oczywiście zignoruje wszystkie szalone ciągi, które prawdopodobnie powinieneś pomylić, a nie tylko parsować ....replace(/[^0-9.]/g, "")
, w przeciwnym razie „1.05” zmieni się na „105”.var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
otrzymujemystring
(z powodu.toFixed
metody) zamiastnumber
(liczba całkowita). Jeśli chcemy zaokrągloną liczbę całkowitą, prawdopodobnie lepiej po prostu użyćMath.round("97.654");
ParseInt () i + są różne
źródło
Najszybszy
Test
Oto małe porównanie prędkości (tylko Mac OS) ... :)
Dla chrome „plus” i „mul” są najszybsze (> 700 000,00 operacji na sekundę), „Math.floor” jest najwolniejszy. W przeglądarce Firefox „plus” jest najwolniejszy (!) „Mul” jest najszybszy (> 900 000 000 operacji na sekundę). W Safari „parseInt” jest postem, „liczba” jest najwolniejsza (ale wyniki są dość podobne,> 13 000 000 <31 000 000). Dlatego Safari dla rzutowania ciągu na int jest ponad 10 razy wolniejsze niż inne przeglądarki. Zwycięża więc „ Mul ” :)
Możesz uruchomić go w przeglądarce za pomocą tego linku https://jsperf.com/js-cast-str-to-number/1
Aktualizacja
Testuję również
var x = ~~"1000";
- w Chrome i Safari jest nieco wolniejszy niżvar x = "1000"*1
(<1%), w Firefox jest nieco szybszy (<1%). Aktualizuję powyższe zdjęcie i testujęźródło
Choć stare pytanie, ale może to komuś pomóc.
Używam tego sposób konwertowania ciąg do
intnumerTak więc, mnożąc przez 1, wartość się nie zmienia, ale js automatycznie zwraca liczbę.
Ale jak pokazano poniżej, należy tego użyć, jeśli masz pewność, że
str
jest to liczba (lub może być reprezentowana jako liczba), w przeciwnym razie zwróci NaN - nie liczbę.możesz stworzyć prostą w użyciu funkcję, np
źródło
Spróbuj parsować.
źródło
Przepraszam, wysłałem tutaj złą odpowiedź. naprawiony.
To stare pytanie, ale uwielbiam tę sztuczkę:
Podwójnie ujemny bitowy porzuca kropkę po przecinku ORAZ konwertuje ją na format liczbowy. Powiedziano mi, że jest to nieco szybsze niż wywoływanie funkcji i tak dalej, ale nie jestem do końca przekonany.
EDYCJA: Inna metoda, którą właśnie widziałem tutaj (pytanie o javascript >>>, która jest przesunięciem zera w prawo), która pokazuje, że przesunięcie liczby o 0 za pomocą tego operatora przekształca liczbę na uint32, co jest miłe, jeśli też chcę to bez znaku . Ponownie, konwertuje to na liczbę całkowitą bez znaku , co może prowadzić do dziwnych zachowań, jeśli użyjesz podpisanego numeru.
źródło
Uważaj, jeśli używasz parseInt do konwersji pływaka w notacji naukowej! Na przykład:
spowoduje
zamiast
źródło
parseInt
nie działałoby dobrze dla pływaka.parseFloat
działa poprawnie w tym przypadku.Aby przekonwertować ciąg na liczbę całkowitą, polecam użycie parseFloat i NOT parseInt. Dlatego:
Za pomocą parseFloat:
Za pomocą parseInt:
Jeśli zauważyłeś, że parseInt odrzuca wartości po przecinku, podczas gdy parseFloat pozwala pracować z liczbami zmiennoprzecinkowymi, a zatem bardziej odpowiednie, jeśli chcesz zachować wartości po dziesiętnych. Użyj parseInt wtedy i tylko wtedy, gdy masz pewność, że chcesz uzyskać wartość całkowitą.
źródło
Również na marginesie: Mootools ma funkcję toInt (), która jest używana na dowolnym natywnym ciągu (lub zmiennoprzecinkowym (lub całkowitym)).
źródło
SyntaxError
, że powinieneś użyć podwójnej kropki, np .:2..toInt();
pierwsza kropka kończy reprezentacjęNumber
literału, a druga kropka jest akcesorem właściwości.Zobacz poniższy przykład, który pomoże ci wyjaśnić swoje wątpliwości
za pomocą funkcji parsowania Podaje tylko liczbę całkowitą występującą, a nie ciąg
źródło
możemy użyć
+(stringOfNumber)
zamiast używaćparseInt(stringOfNumber)
Przykład:
+("21")
zwraca liczbę całkowitą z 21, jakparseInt("21")
.możemy także użyć tego jednoargumentowego operatora „+” do analizowania zmiennoprzecinkowego ...
źródło
+
?parseInt
. Wspólna implementacja na pierwszy rzut okaconst myNumber = +myNumberAsAString
wygląda jak standard+=
lub=+
operator. Również nieprawidłowe użycie może prowadzić do błędów konkatenacji. To rozwiązanie opiera się na fakcie, że 0 jest przyjmowane jako lewa strona, gdy nie podano żadnej liczby.W JavaScript jest wiele sposobów na konwersję ciągu na wartość liczbową ... Wszystkie proste i przydatne, wybierz sposób, który dla Ciebie działa:
Również dowolne operacje matematyczne konwertują je na liczby, na przykład ...
Moim ulubionym sposobem jest użycie
+
znaku, który jest eleganckim sposobem konwersji ciągu znaków na liczbę w JavaScript.źródło
Spróbuj
str - 0
przekonwertowaćstring
nanumber
.Oto dwa łącza do porównania wydajności kilku sposobów konwersji łańcucha na int
https://jsperf.com/number-vs-parseint-vs-plus
http://phrogz.net/js/string_to_number.html
źródło
'1'
zostanie przekonwertowany1
przezToNumber
, a następnie1 - 0
będzie1
Google dało mi tę odpowiedź, więc ...
Właściwie musiałem „zapisać” ciąg jako liczbę całkowitą, aby uzyskać powiązanie między C i JavaScript, więc przekonwertowałem ciąg na wartość całkowitą:
źródło
int2str
funkcja zatrzymuje się, jeśli bajt ma wartość 0, co może być uzasadnionym elementem tej wartości, więcif
...break
należy usunąć, aby uzyskać pełną 4-bajtową wartość.Moim zdaniem, żadna odpowiedź nie obejmuje wszystkich przypadków krawędzi, ponieważ parsowanie zmiennoprzecinkowe powinno spowodować błąd.
źródło
parseInteger
nieparseNumber
. Myślę, że każde rozwiązanie jest obejściem, ponieważ JS nie obsługuje liczb całkowitych i liczb zmiennoprzecinkowych jako osobnych typów. Moglibyśmy wrócićnull
zamiastNaN
, jeśli liczba nie wprowadza w błąd.Oto najprostsze rozwiązanie
Łatwiejsze rozwiązanie
źródło
wszystkie powyższe są poprawne. Przedtem upewnij się, że jest to liczba w ciągu znaków, wpisując „typeot x === 'number'”, w przeciwnym razie zwróci NaN
źródło
var num1 = "12423"; typeof num1;
zwraca wartośćstring
.Inną opcją jest podwojenie wartości XOR samą w sobie:
Spowoduje to:
źródło
Dodałem tylko jeden plus (+) przed ciągiem i to było rozwiązanie!
Mam nadzieję, że to pomoże ;)
źródło
Podsumowując mnożenie cyfr z ich odpowiednią siłą dziesięciu:
tj .: 123 = 100 + 20 + 3 = 1 * 100 + 2 + 10 + 3 * 1 = 1 * (10 ^ 2) + 2 * (10 ^ 1) + 3 * (10 ^ 0)
}
źródło
źródło
używam tego
w ten sposób zawsze odzyskuję int.
źródło
Najbezpieczniejszy sposób na uzyskanie prawidłowej liczby całkowitej:
Przykłady:
źródło
źródło
możesz użyć plus, na przykład =>
var personAge = „24”; var personAge1 = (+ personAge)
wtedy zobaczysz typ osoby Wiek jest liczbą
źródło