Chcę przekonwertować te typy wartości, '3'
, '2.34'
, '0.234343'
, itp na liczbę. W JavaScript możemy użyć Number()
, ale czy jest jakaś podobna metoda dostępna w PHP?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
php
casting
type-conversion
Sara
źródło
źródło
Odpowiedzi:
Zwykle nie musisz tego robić, ponieważ PHP w większości przypadków wymusi ten typ. W sytuacjach, w których chcesz jawnie przekonwertować typ, rzutuj :
źródło
.
jest to separator przecinka dziesiętnego , może nie być bezpieczne . en.wikipedia.org/wiki/…Można to zrobić na kilka sposobów:
Rzuć ciągi na liczbowe pierwotne typy danych:
Wykonuj operacje matematyczne na ciągach:
Posługiwać się
intval()
lubfloatval()
:Zastosowanie
settype()
.źródło
(double)
to tylko alias dla(float)
.$num = "10" + 1
przykład).intval("9999999999")==2147483647
.intval
jest przydatny, ponieważ wtedy możesz go użyć, warray_map('intval', $arrayOfStrings);
którym nie możesz zrobić z rzutowaniem.$num = "10" + 1;
tego lepiej jest użyć$num = "10" * 1;
ponieważ nie zmieni to wartości (neutralny element mnożenia), jest to w zasadzie coś takiego,toNumber(..)
ponieważ ostateczny typ zostanie określony przez to, co jest potrzebne do konwersji ciągu „10” -> (int) 10; „10.1” -> (liczba zmiennoprzecinkowa) 10.1;Aby uniknąć problemów, spróbuj
intval($var)
. Kilka przykładów:źródło
12.7896
?(int)$my_str
nie będzie działać, ponieważ mam do czynienia konkretnie z ciągami Liks01
i013
że chcę interpretować jako podstawy 10 ... Więc chciałem sposób wyraźnie stanowić podstawę.W dowolnym (luźnym) języku zawsze możesz rzucić ciąg na liczbę, dodając do niej zero.
Jednak nie ma to większego sensu, ponieważ PHP zrobi to automatycznie w momencie użycia tej zmiennej, i będzie rzutowany na ciąg znaków w momencie wyjścia.
Zauważ, że możesz chcieć zachować kropkowane liczby jako łańcuchy, ponieważ po rzutowaniu na zmienną liczbę zmiennoprzecinkową można zmienić nieprzewidywalnie, ze względu na naturę liczb zmiennoprzecinkowych.
źródło
typeof('123'+0)
daje'string'
, bo'123'+0
daje'1230'
.0+'123'
aby uzyskać123
Możesz użyć:
Lub możesz użyć:
źródło
is_float
, a jeśli to minie, użyj do(float)
zamiast zamiast(int)
.Jeśli chcesz uzyskać zmiennoprzecinkowe
$value = '0.4'
, ale int dla$value = '4'
, możesz napisać:Jest trochę brudny, ale działa.
źródło
strpos($val, '.') === false ? intval($val) : floatval($val);
localeconv()['decimal_point']
zamiast'.'
. Zaletą tegostrpos
rozwiązania jest to, że jest prawie dwa razy szybszy niż dwukrotne rzucanie.2.1e2
, ma przecinek dziesiętny, ale wynikowa liczba jest liczbą całkowitą+
operatora tożsamości:,var_dump(+'0.4', +'4')
daje liczbę zmiennoprzecinkową i liczbę całkowitą. php.net/manual/en/language.operators.arithmetic.phpZawsze możesz dodać do niego zero!
źródło
A non well formed numeric value encountered
. dowolny pomysł?Zamiast wybrać, czy do konwersji
string
doint
lubfloat
można po prostu dodać0
do niego i PHP automatycznie przekonwertować wynik do typu numerycznego.źródło
W PHP możesz używać
intval(string) or floatval(string)
funkcji do konwersji ciągów na liczby.źródło
Tak, w PHP jest podobna metoda, ale jest ona tak mało znana, że rzadko o niej słyszysz. Jest to operator arytmetyczny zwany „ tożsamością ”, jak opisano tutaj:
Operatory arytmetyczne
Aby przekonwertować ciąg liczbowy na liczbę, wykonaj następujące czynności:
źródło
is_numeric
, więc umieść kod do obsługi ciągów, których nie można poprawnie przekonwertować.)Tylko mała notatka do odpowiedzi, które mogą być przydatne i bezpieczniejsze w niektórych przypadkach. Możesz sprawdzić, czy łańcuch rzeczywiście zawiera najpierw prawidłową wartość liczbową, a dopiero potem przekonwertować ją na typ liczbowy (na przykład, jeśli musisz manipulować danymi pochodzącymi z bazy danych, która konwertuje ints na łańcuchy). Możesz użyć,
is_numeric()
a następniefloatval()
:źródło
Oto funkcja, która osiąga to, czego szukasz. Najpierw sprawdzamy, czy wartość można rozumieć jako liczbę, jeśli tak, zamieniamy ją na liczbę całkowitą i zmiennoprzecinkową. Jeśli int i zmiennoprzecinkowe są takie same (np. 5 == 5.0), wówczas zwracamy wartość int. Jeśli int i zmiennoprzecinkowe nie są takie same (np. 5! = 5.3), zakładamy, że potrzebujesz precyzji zmiennoprzecinkowego i zwróć tę wartość. Jeśli wartość nie jest liczbą, wyrzucamy ostrzeżenie i zwracamy null.
źródło
Odkryłem, że w JavaScript prostym sposobem na konwersję ciągu na liczbę jest pomnożenie go przez 1. To rozwiązuje problem konkatenacji, ponieważ symbol „+” ma wiele zastosowań w JavaScript, podczas gdy symbol „*” jest czysto do mnożenia matematycznego.
W oparciu o to, co widziałem tutaj, dotyczące tego, że PHP jest skłonny automatycznie interpretować ciąg zawierający cyfry jako liczbę (i komentarze na temat dodawania, ponieważ w PHP „+” służy wyłącznie do dodawania matematycznego), ta sztuczka z mnożeniem działa dobrze także dla PHP.
Przetestowałem go i działa ... Chociaż w zależności od tego, w jaki sposób uzyskałeś ciąg, możesz chcieć zastosować do niego funkcję trim (), zanim pomnożymy ją przez 1.
źródło
Oto funkcja, którą napisałem, aby uprościć rzeczy dla siebie:
Zwraca także skrócone wersje boolean, integer, double i real.
Wywołanie typu z parseNumeric ustawionym na true spowoduje konwersję ciągów liczbowych przed sprawdzeniem typu.
A zatem:
type („5”, true) zwróci int
type („3.7”, true) zwróci liczbę zmiennoprzecinkową
typ („500”) zwróci ciąg znaków
Bądź ostrożny, ponieważ jest to rodzaj fałszywej metody sprawdzania, a twoja rzeczywista zmienna nadal będzie ciągiem znaków. W razie potrzeby będziesz musiał przekonwertować rzeczywistą zmienną na poprawny typ. Potrzebowałem go tylko, aby sprawdzić, czy baza danych powinna załadować identyfikator elementu lub alias, nie powodując przy tym żadnych nieoczekiwanych efektów, ponieważ i tak zostanie on przeanalizowany jako ciąg znaków w czasie wykonywania.
Edytować
Jeśli chcesz wykryć, czy obiekty są funkcjami, dodaj ten przypadek do przełącznika:
źródło
Oprócz odpowiedzi Boykodev proponuję to:
źródło
$id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;
zamiast $ target_id_cron = (int) $ id_cron - 1;A non well formed numeric value encountered
gdy chcę zmienić ciąg na zmiennoprzecinkowy$num = '12,24' * 1
. Jakieś sugestie?Możesz go użyć do konwersji ciągu znaków na int w PHP .
źródło
Po prostu możesz napisać w ten sposób:
źródło
Pomnóż liczbę tylko przez 1, aby łańcuch został przekonwertowany na typ liczbowy.
źródło
Możesz użyć:
Ale najlepszym rozwiązaniem jest użycie:
Lub
źródło
Możesz zmienić typ danych w następujący sposób
Z powodów historycznych „double” jest zwracany w przypadku liczby zmiennoprzecinkowej.
Dokumentacja PHP
źródło
Wszystkie sugestie tracą typ liczbowy.
To wydaje mi się najlepszą praktyką:
źródło
PHP zrobi to za Ciebie w określonych granicach
źródło
Jest sposób:
Używanie
is_*
nie będzie działać, ponieważvariable
jest:string
.Użycie kombinacji,
json_encode()
a następniejson_decode()
konwersja do postaci „prawdziwej”. Jeśli jest to prawda,string
wynik byłby nieprawidłowy.Wyjdzie:
string(2) "Me" int(0) float(0)
źródło
Dostałem pytanie „powiedz, że pisałeś wbudowaną funkcję do rzucania liczby całkowitej na ciąg znaków w PHP, jak byś napisał tę funkcję” w wywiadzie programistycznym. Oto rozwiązanie.
źródło
Czytałem odpowiedzi i nie widziałem, aby ktokolwiek wspomniał o największym zastrzeżeniu w konwersji liczb PHP.
Najbardziej pozytywna odpowiedź sugeruje wykonanie następujących czynności:
To wspaniale. PHP wykonuje casting bezpośredni. Ale co jeśli zrobilibyśmy następujące rzeczy?
Czy PHP uważa takie konwersje za prawidłowe?
Najwyraźniej tak .
PHP czyta ciąg znaków, aż znajdzie pierwszy znak nienumeryczny dla wymaganego typu. Oznacza to, że dla liczb całkowitych znakami numerycznymi są [0–9]. W rezultacie czyta
3
, ponieważ znajduje się w zakresie [0–9], kontynuuje czytanie. Czyta.
i zatrzymuje się tam, ponieważ nie znajduje się w zakresie [0–9].To samo by się stało, gdybyś rzucił na spławik lub podwoił. PHP czytałby
3
wtedy.
, a1
następnie4
zatrzymywałby się na,i
ponieważ nie jest to poprawny znak liczbowy zmiennoprzecinkowy.W rezultacie
"million" >= 1000000
ocenia na false, ale"1000000million" >= 1000000
ocenia natrue
.Zobacz też:
https://www.php.net/manual/en/language.operators.comparison.php jak konwersje są wykonywane podczas porównywania
https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion jak konwersje ciągów znaków na odpowiednie liczby
źródło
Jeśli nie wiesz z góry, czy masz liczbę zmiennoprzecinkową lub liczbę całkowitą,
a łańcuch może zawierać znaki specjalne (takie jak spacja, € itp.),
A jeśli może zawierać więcej niż 1 kropkę lub przecinek,
możesz użyć tego funkcjonować:
źródło
Odmienne podejście:
json_encode($your_array, JSON_NUMERIC_CHECK);
opcjonalnie dekoduj go z powrotemźródło