Ciąg PHP do Float


120

Nie znam PHP w ogóle i miałem krótkie pytanie.

Mam 2 zmienne pricePerUniti InvoicedUnits. Oto kod, który nadaje im wartości:

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

Jeśli to wyświetlę, otrzymam prawidłowe wartości. Powiedzmy 5000zafakturowane jednostki i 1.00ceny.

Teraz muszę pokazać całkowitą wydaną kwotę. Kiedy pomnożę te dwa razem, nie działa (zgodnie z oczekiwaniami są to ciągi).

Ale nie mam pojęcia, jak analizować / rzutować / konwertować zmienne w PHP.

Co powinienem zrobić?

Odpowiedzi:


201
$rootbeer = (float) $InvoicedUnits;

Powinienem to zrobić za Ciebie. Sprawdź żonglowanie typami . Powinieneś również przeczytać konwersję ciągów znaków na liczby .


Jest to najprostsza metoda ... ale czasami napotykam problemy z robieniem tego z pewnymi konfiguracjami bazy danych i VARCHAR>11długością ... nie zawęziłem jeszcze dlaczego.
Talvi Watia,

2
^ warto zauważyć, że (float) usuwa 0 z ciągu, jeśli jest to pierwsza cyfra

Pamiętaj też, że „11 000,00” wyświetli 11 zamiast oczekiwanej 11
000,00


23

Cóż, jeśli użytkownik zapisze 1,00,000, floatvar pokaże błąd. Więc -

floatval(preg_replace("/[^-0-9\.]/","",$input));

Jest to znacznie bardziej niezawodne.

Stosowanie :

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));

7
Zamiast ereg użytku ciąża $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza

4
Tak, ereg, ta funkcja została WYCOFANA. Więc trzeba użyć preg zamiast ereg :)
HADI

9

Radzenie sobie ze znacznikami w zmiennoprzecinkowych jest nietrywialnym zadaniem. W notacji angielskiej / amerykańskiej formatujesz tysiąc plus 46*10-2:

1,000.46

Ale w Niemczech zmieniłbyś przecinek i kropkę:

1.000,46


To sprawia, że ​​naprawdę trudno jest odgadnąć właściwą liczbę w aplikacjach wielojęzycznych.
Zdecydowanie sugeruję użycie Zend_MeasureZend Framework do tego zadania. Ten składnik przeanalizuje ciąg znaków do postaci zmiennoprzecinkowej według języka użytkownika.


3
W dzisiejszych czasach (+3 lata) można było używać NumberFormatter od PHP 5.3 z intlrozszerzeniem.
zamnuts

1
PHP 5.3 było dostępne, kiedy odpowiedziałem na pytanie, ale do czasu Twojego komentarza nie wiedziałem o tej pojedynczej funkcji, ponieważ dziesiątki bibliotek robią coś podobnego. Ale nie będą miały tak dobrego pokrycia lokalizacji, jak ma rozszerzenie intl. Dzięki, spróbuję to zapamiętać.
Tobias P.

1

Użyj tej funkcji, aby rzutować wartość zmiennoprzecinkową z dowolnego stylu tekstu:

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

To rozwiązanie nie jest zależne od żadnych ustawień regionalnych. W ten sposób użytkownicy mogą wpisywać wartości zmiennoprzecinkowe w dowolny sposób. Jest to bardzo pomocne, np. Gdy masz projekt, który jest tylko w języku angielskim, ale ludzie na całym świecie go używają i mogą nie pamiętać, że projekt potrzebuje kropki zamiast przecinka dla wartości typu float. Możesz wrzucić javascript do miksu i pobrać domyślne ustawienia przeglądarki, ale nadal wiele osób ustawia te wartości na angielski, ale nadal wpisuje 1,25 zamiast 1,25 (szczególnie, ale nie wyłącznie, w branży tłumaczeniowej, badaniach i IT)


jakieś uwagi na temat tego, dlaczego to jest złe / gdzie się nie udaje?
Hafenkranich

czy jest podobnie elastyczny sposób, który jest szybszy?
Hafenkranich

1
Używa flagi e, która „nie jest już obsługiwana”. To moje przypuszczenie.
Leif

0

Miałem problem ze standardowym sposobem, aby to zrobić:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

Jeśli nie ma poprawnej liczby, parser nie powinien zwracać liczby, powinien zgłosić błąd. (Jest to warunek, który próbuję złapać w swoim kodzie, YMMV)

Aby to naprawić, wykonałem następujące czynności:

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

Następnie przed dalszym przetwarzaniem konwersji mogę sprawdzić i zwrócić błąd, jeśli nie ma prawidłowej analizy ciągu.


0

Jeśli potrzebujesz obsługiwać wartości, których nie można osobno przekonwertować, możesz użyć tej metody:

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}

0

możesz skorzystać z tego linku, aby dowiedzieć się więcej o tym, jak przekonwertować ciąg / liczbę na liczbę / zmiennoprzecinkowe / dziesiętne w PHP. OTO CO MÓWI TEN LINK ...

Metoda 1: użycie funkcji number_format (). Funkcja number_format () służy do konwersji ciągu znaków na liczbę. Po pomyślnym zakończeniu zwraca sformatowaną liczbę, w przeciwnym razie w przypadku niepowodzenia zwraca E_WARNING.

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

Metoda 2: Używanie rzutowania typów: Rzutowanie typów może bezpośrednio konwertować ciąg znaków na typ pierwotny typu float, double lub integer. To najlepszy sposób na przekształcenie ciągu znaków w liczbę bez żadnej funkcji.

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

Metoda 3: Użycie funkcji intval () i floatval (). Funkcje intval () i floatval () mogą również służyć do konwersji łańcucha na odpowiadające mu wartości całkowite i zmiennoprzecinkowe.

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

Metoda 4: Dodając 0 lub wykonując operacje matematyczne. Numer ciągu można również przekształcić w liczbę całkowitą lub zmiennoprzecinkową, dodając 0 do ciągu. W PHP, wykonując operacje matematyczne, łańcuch jest niejawnie konwertowany na liczbę całkowitą lub zmiennoprzecinkową.

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.