Jak przekonwertować ciąg na liczbę w PHP?

670

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
Sara
źródło
63
Czytelnik uwaga: nie jest prawdziwa odpowiedź na to pytanie :(
Matthieu Napoli
@MatthieuNapoli Odpowiedź jest taka, że ​​zwykle Php wymyśla to dla ciebie - jeden z atutów dynamicznego systemu typów.
Kolob Canyon
12
Ze wszystkimi łańcuchami niepewności i „zwykle”.
person27
2
@MatthieuNapoli W jaki sposób casting nie jest „prawdziwą odpowiedzią”? Możesz nawet sprawdzić typ po rzutach, jeśli chcesz być tym dzieckiem
Kanion Kolob
3
@MatthieuNapoli Cieszę się, że wyjaśniłeś swój punkt widzenia, że ​​istnieje więcej niż jeden sposób na skórowanie kota, niż nie ma sposobu, aby to zrobić. Na przykład rzutowanie jest bardzo ważne w operacjach na bazach danych. Na przykład w sparametryzowanym zapytaniu PDO czasami wystąpi walka o to, aby analizator składni zdał sobie sprawę, że jest liczbą, a nie łańcuchem, a następnie otrzymujesz 0 w polu liczby całkowitej, ponieważ nie rzuciłeś ciągu na liczbę całkowitą w kroku parametru.
stubsthewizard

Odpowiedzi:

1031

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 :

$num = "3.14";
$int = (int)$num;
$float = (float)$num;
deceze
źródło
4
tutaj sytuacja jest nieco inna Chcę przekonwertować dowolny ciąg (zawierający tylko liczby) na liczbę ogólną. Jak U może wiedzieć w javaScript, możemy użyć parseInt () do konwersji string => int lub parseFloat () do konwersji string => float. ale ogólnie javaScript używa Number () do konwersji ciągu => liczba. Chcę podobną metodę w php?
Sara,
4
Przydało mi się to, gdy otrzymałem numer miesiąca z ciągu pełnej daty, którego użyłem do pobrania wartości z tablicy nazw ćmy. Automatyczne rzutowanie nie ma tu miejsca, ponieważ indeksy ciągów są prawidłowe, ale nie równoważne.
Cazuma Nii Cavalcanti
19
W zależności od kontekstu założenie, że .jest to separator przecinka dziesiętnego , może nie być bezpieczne . en.wikipedia.org/wiki/…
Dave Jarvis
3
@Sara: Możesz także utworzyć funkcję do konwersji ciągu na liczbę , najpierw rzutując go na liczbę całkowitą, a następnie , a następnie porównując, czy obie wartości (liczba całkowita i liczba zmiennoprzecinkowa) są równe. Jeśli tak, powinieneś zwrócić wartość jako liczbę całkowitą, jeśli nie, to jako liczbę zmiennoprzecinkową. Mam nadzieję, że masz pomysł.
Youstay Igo
2
Są chwile, kiedy musisz podać liczbę całkowitą do systemu plików, nie jest dobrym pomysłem czekać na PHP, aby dokonał konwersji za Ciebie.
AaA
173

Można to zrobić na kilka sposobów:

  1. Rzuć ciągi na liczbowe pierwotne typy danych:

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
  2. Wykonuj operacje matematyczne na ciągach:

    $num = "10" + 1;
    $num = floor("10.1");
  3. Posługiwać się intval() lub floatval():

    $num = intval("10");
    $num = floatval("10.1");
  4. Zastosowanie settype().

fardjad
źródło
9
Zauważ, że (double)to tylko alias dla (float).
deceze
4
@downvoter, nie wiem, co jest nie tak z moją odpowiedzią. Zauważ, że zamieściłem to, zanim OP zredagowała swoje pytanie, ale dotyczy to również edytowanego pytania ( $num = "10" + 1przykład).
fardjad
2
@ ed-ta: całkiem pewne, że zwróci wartość min / max zamiast 0, jeśli przekażesz ciągi znaków. Tj intval("9999999999")==2147483647.
RIV
6
intvaljest przydatny, ponieważ wtedy możesz go użyć, w array_map('intval', $arrayOfStrings);którym nie możesz zrobić z rzutowaniem.
icc97
2
zamiast $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;
Holly,
57

Aby uniknąć problemów, spróbuj intval($var). Kilka przykładów:

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34 (octal as starts with zero)
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26 (hex as starts with 0x)
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>
gopeca
źródło
4
IMHO, jest to jedyna poprawna odpowiedź, ponieważ jest jedyną, która bierze pod uwagę podstawę ciągu liczbowego. Wszystkie odpowiedzi (nawet sugerujące funkcję zdefiniowaną przez użytkownika), które po prostu używają rzutowania typu, zakończą się niepowodzeniem, jeśli ciąg liczbowy ma jedno lub więcej zer wiodących, a ciąg NIE jest pomyślany jako liczba o podstawie ósemkowej.
Składnia Junkie
jakiś pomysł, jeśli chcę przekonwertować „12.7896” na 12.7896?
Agnes Palit,
użyj floatval (), aby przekonwertować ciąg na float. floatval („12.7896”) zwróci 12.7896
gopeca
Dlaczego nie jest to zaakceptowana odpowiedź? Jako outsidera PHP I już wiedział, że (int)$my_strnie będzie działać, ponieważ mam do czynienia konkretnie z ciągami Liks 01i 013że chcę interpretować jako podstawy 10 ... Więc chciałem sposób wyraźnie stanowić podstawę.
Giacomo Alzetta
48

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.

Twój zdrowy rozsądek
źródło
35
Istnieje wiele języków, w których nie można rzutować ciągu na liczbę, dodając zero, zwykle uważa się to za błąd, a nie prawidłową metodę rzutowania :).
Jan Špaček
4
honzasp ma rację, na przykład w JavaScript typeof('123'+0)daje 'string', bo '123'+0daje '1230'.
Oriol
5
Uwaga: w PHP zaleca się, aby przez większość czasu używać porównań stylów ===. Więc jeśli będziesz porównywał swoje dane, może być bardzo ważne, w jakim typie są przechowywane.
Jonathon
Zauważ, że dodając zero, nie „rzucasz” w prawdziwym tego słowa znaczeniu, zasadniczo konwertujesz.
CSᵠ
12
@oriol w javascript musisz dodać liczbę do zera, 0+'123'aby uzyskać123
Timo Huovinen
24

Możesz użyć:

(int)(your value);

Lub możesz użyć:

intval(string)
noobie-php
źródło
co jeśli wprowadzony numer to „2.3456”, w jaki sposób otrzymam 2,3456?
Sara,
6
pytanie dotyczy także pływaków.
taseenb,
Pokaż mi 1 linię OP, gdzie jest napisane float? przed przekazaniem komentarzy i oddaniem głosów spójrz na Original Post.
noobie-php,
2
Przykład pokazuje liczby
zmiennoprzecinkowe
Najpierw sprawdź, czy liczba jest liczbą zmiennoprzecinkową z is_float, a jeśli to minie, użyj do (float)zamiast zamiast (int).
Martin van Driel,
24

Jeśli chcesz uzyskać zmiennoprzecinkowe $value = '0.4', ale int dla $value = '4', możesz napisać:

$number = ($value == (int) $value) ? (int) $value : (float) $value;

Jest trochę brudny, ale działa.

Aleksei Akireikin
źródło
3
Być może mniej brudny? strpos($val, '.') === false ? intval($val) : floatval($val);
jchook 21.04.16
4
@jchook Prawdopodobnie bardziej brudny, ponieważ zależy od regionu - np. „0,4” zamiast „0.4”.
Nick Rice
Słuszna uwaga. Przypuszczam, że możesz użyć localeconv()['decimal_point']zamiast '.'. Zaletą tego strposrozwiązania jest to, że jest prawie dwa razy szybszy niż dwukrotne rzucanie.
jchook 28.04.17
2
@jchook, który łamie się na przypadkach takich jak 2.1e2, ma przecinek dziesiętny, ale wynikowa liczba jest liczbą całkowitą
Tomáš Blatný,
1
Wystarczy użyć +operatora tożsamości:, var_dump(+'0.4', +'4')daje liczbę zmiennoprzecinkową i liczbę całkowitą. php.net/manual/en/language.operators.arithmetic.php
tvanc
15

Zawsze możesz dodać do niego zero!

Input             Output
'2' + 0           2 (int)
'2.34' + 0        2.34 (float)
'0.3454545' + 0   0.3454545 (float)
Boykodev
źródło
Mam ten błąd A non well formed numeric value encountered. dowolny pomysł?
Agnes Palit
15

Zamiast wybrać, czy do konwersji stringdo intlub floatmożna po prostu dodać 0do niego i PHP automatycznie przekonwertować wynik do typu numerycznego.

// Being sure the string is actually a number
if (is_numeric($string))
    $number = $string + 0;
else // Let the number be 0 if the string is not a number
    $number = 0;
webNeat
źródło
13

W PHP możesz używać intval(string) or floatval(string)funkcji do konwersji ciągów na liczby.

Kashif Khan
źródło
4
nie, chcę wspólnej metody. co oznacza, że ​​jeśli jego „5” => powinno zostać przekonwertowane na 5, a jeśli jego „2.345” => powinno zostać przekonwertowane na 2.345.
Sara,
13

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:

$a = +$a;
aldemarcalazans
źródło
Ostrzeżenie: wykryto włamanie.
Greg
Cześć Greg. Czy kliknąłeś link zamieszczony tutaj? Oto, co deweloperzy powiedzieli o tym operatorze: Konwersja $ a na int lub float odpowiednio. „Konwersja” tutaj nie może być rozumiana jako konwersja liczby na liczbę. Dlaczego? Ponieważ z wyłącznego arytmetycznego punktu widzenia operator ten jest absolutnie bezużyteczny! Pomnożenie dowolnej liczby przez „+1” (odpowiednik funkcji tożsamości) absolutnie nie ma na to wpływu. Dlatego nie wyobrażam sobie innego narzędzia dla tego operatora niż sugerowana tutaj konwersja typu.
aldemarcalazans
@Greg - z pewnością jest to mniej hack, niż większość innych odpowiedzi. Jest to wbudowany operator, który robi dokładnie to, czego zażądano. (Chociaż prawdopodobnie najlepiej najpierw sprawdzić is_numeric, więc umieść kod do obsługi ciągów, których nie można poprawnie przekonwertować.)
ToolmakerSteve
Rozumiem, że idealnie nadaje się do użycia operatora arytmetycznego do rzucania, ale naprawdę łatwo go przegapić. Myślę, że warto ostrzec.
Greg
11

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ępnie floatval():

$a = "whatever"; // any variable

if (is_numeric($a)) 
    var_dump(floatval($a)); // type is float
else 
    var_dump($a); // any type
taseenb
źródło
9

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.

function toNumber($val) {
    if (is_numeric($val)) {
        $int = (int)$val;
        $float = (float)$val;

        $val = ($int == $float) ? $int : $float;
        return $val;
    } else {
        trigger_error("Cannot cast $val to a number", E_USER_WARNING);
        return null;
    }
}
CogSciGradStudent
źródło
6

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.

vernonner3voltazim
źródło
6

Oto funkcja, którą napisałem, aby uprościć rzeczy dla siebie:

Zwraca także skrócone wersje boolean, integer, double i real.

function type($mixed, $parseNumeric = false)
{        
    if ($parseNumeric && is_numeric($mixed)) {
        //Set type to relevant numeric format
        $mixed += 0;
    }
    $t = gettype($mixed);
    switch($t) {
        case 'boolean': return 'bool'; //shorthand
        case 'integer': return 'int';  //shorthand
        case 'double': case 'real': return 'float'; //equivalent for all intents and purposes
        default: return $t;
    }
}

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:

case 'object': return is_callable($mixed)?'function':'object';
Dieter Gribnitz
źródło
6

Oprócz odpowiedzi Boykodev proponuję to:

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)
narkoman
źródło
Po
krótkiej refleksji
1
To jest punkt! :) Nawiasem mówiąc, twoje rozwiązanie jest znacznie lepsze niż wszystkie powyższe notacje naukowe . Dziękuję Ci.
drugan
to rozwiązanie rozwiązało mój problem. W moim przypadku $id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;zamiast $ target_id_cron = (int) $ id_cron - 1;
inMILD
1
Wystąpił ten błąd, A non well formed numeric value encounteredgdy chcę zmienić ciąg na zmiennoprzecinkowy $num = '12,24' * 1. Jakieś sugestie?
Agnes Palit
5
$a = "10";

$b = (int)$a;

Możesz go użyć do konwersji ciągu znaków na int w PHP .

Pritom
źródło
2
jeśli wprowadzony numer to „7.2345” Nie mogę użyć (int), to muszę użyć (float). Potrzebuję ogólnego rozwiązania.
Sara,
1
Zawsze możesz użyć double lub float.
Pritom
5

Po prostu możesz napisać w ten sposób:

<?php
    $data = ["1","2","3","4","5"];
    echo json_encode($data, JSON_NUMERIC_CHECK);
?>
Dominic Amal Joe F.
źródło
3
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak ten kod odpowiada na pytanie, poprawia jego długoterminową wartość.
Alex Riabov
1
Jesteś tego pewien? Nie zamieni to ciągu na liczbę, ale tablicę na ciąg JSON
Nico Haase,
Tak, @NicoHaase, jeśli liczba ma format ciągów w tablicy, zostanie przekonwertowana na liczbę.
Dominic Amal Joe F
5

Pomnóż liczbę tylko przez 1, aby łańcuch został przekonwertowany na typ liczbowy.

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}
rolodef
źródło
W porządku, ale ta metoda (i podobne sztuczki) są już wymienione w 24 innych odpowiedziach na to pytanie - nie widzę wartości w ponownym opublikowaniu go.
DavidW,
4

Możesz użyć:

((int) $var)   ( but in big number it return 2147483647 :-) )

Ale najlepszym rozwiązaniem jest użycie:

if (is_numeric($var))
    $var = (isset($var)) ? $var : 0;
else
    $var = 0;

Lub

if (is_numeric($var))
    $var = (trim($var) == '') ? 0 : $var;
else
    $var = 0;
Mehdi Ajdari
źródło
2

Możesz zmienić typ danych w następujący sposób

$number = "1.234";

echo gettype ($number) . "\n"; //Returns string

settype($number , "float");

echo gettype ($number) . "\n"; //Returns float

Z powodów historycznych „double” jest zwracany w przypadku liczby zmiennoprzecinkowej.

Dokumentacja PHP

David Lozano
źródło
2

Wszystkie sugestie tracą typ liczbowy.

To wydaje mi się najlepszą praktyką:

function str2num($s){
// Returns a num or FALSE
    $return_value =  !is_numeric($s) ? false :               (intval($s)==floatval($s)) ? intval($s) :floatval($s);
    print "\nret=$return_value type=".gettype($return_value)."\n";
}
Rocco Galasso
źródło
1

PHP zrobi to za Ciebie w określonych granicach

<?php
   $str = "3.148";
   $num = $str;

   printf("%f\n", $num);
?>
Adrian Cornish
źródło
Nie chcę tego stawiać. Chcę go przekonwertować i zapisać w zmiennej.
Sara,
1
To automatycznie przekształciło go w liczbę zmiennoprzecinkową. Luźna konwersja PHP robi to za Ciebie. Chociaż może nie działać zgodnie z oczekiwaniami, więc inne odpowiedzi z wyraźną konwersją mogą działać lepiej dla Ciebie.
Adrian Cornish
$ str może zawierać „5” lub „5.258” za pomocą printf („% f \ n”, $ str) „5” zostanie wstawione jako 5.000000 (chcę to jako 5) dla 5.280000 (chcę, żeby to było 5.28) zawiera więcej miejsc po przecinku.
Sara,
1

Jest sposób:

$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);

Używanie is_*nie będzie działać, ponieważ variablejest: string.

Użycie kombinacji, json_encode()a następnie json_decode()konwersja do postaci „prawdziwej”. Jeśli jest to prawda, stringwynik byłby nieprawidłowy.

$num = "Me";
$int = (int)$num;
$float = (float)$num;

var_dump($num, $int, $float);

Wyjdzie: string(2) "Me" int(0) float(0)

Anuga
źródło
0

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.

$nums = ["0","1","2","3","4","5","6","7","8","9"];
$int = 15939; 
$string = ""; 
while ($int) { 
    $string .= $nums[$int % 10]; 
    $int = (int)($int / 10); 
} 
$result = strrev($string);
Brendan
źródło
0

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:

$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3

To wspaniale. PHP wykonuje casting bezpośredni. Ale co jeśli zrobilibyśmy następujące rzeczy?

$str = "3.14is_trash"
$intstr = (int)$str

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 3wtedy ., a 1następnie 4zatrzymywałby się na, iponieważ nie jest to poprawny znak liczbowy zmiennoprzecinkowy.

W rezultacie "million" >= 1000000ocenia na false, ale "1000000million" >= 1000000ocenia na true.

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

Dragas
źródło
0

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ć:

// This function strip spaces and other characters from a string and return a number.
// It works for integer and float.
// It expect decimal delimiter to be either a '.' or ','
// Note: everything after an eventual 2nd decimal delimiter will be removed.
function stringToNumber($string) {
    // return 0 if the string contains no number at all or is not a string:
    if (!is_string($string) || !preg_match('/\d/', $string)) {
        return 0;
    } 

    // Replace all ',' with '.':
    $workingString = str_replace(',', '.', $string);

    // Keep only number and '.':
    $workingString = preg_replace("/[^0-9.]+/", "", $workingString);

    // Split the integer part and the decimal part,
    // (and eventually a third part if there are more 
    //     than 1 decimal delimiter in the string):
    $explodedString = explode('.', $workingString, 3);

    if ($explodedString[0] === '') {
        // No number was present before the first decimal delimiter, 
        // so we assume it was meant to be a 0:
        $explodedString[0] = '0';
    } 

    if (sizeof($explodedString) === 1) {
        // No decimal delimiter was present in the string,
        // create a string representing an integer:
        $workingString = $explodedString[0];
    } else {
        // A decimal delimiter was present,
        // create a string representing a float:
        $workingString = $explodedString[0] . '.' .  $explodedString[1];
    }

    // Create a number from this now non-ambiguous string:
    $number = $workingString * 1;

    return $number;
}
użytkownik1657853
źródło
-8

Odmienne podejście:

  1. Wciśnij wszystko do tablicy / tablicy asocjacyjnej.
  2. json_encode($your_array, JSON_NUMERIC_CHECK); opcjonalnie dekoduj go z powrotem
  3. ?
  4. Zysk!
Peter Mortensen
źródło
7
Przepełnienie stosu dotyczy odpowiedzi na pytania, a nie żartów. Jestem pewien, że jest na to miejsce, ale to nie jest to miejsce.