Hej.
Pewnie jakaś głupota, ale nie mogę sobie z tym poradzić. Mianowicie z API dostaje cenę jako string:
"2 345,21 zł"
I nie mogę jej przekształcić na float: 2345.21
number_format zwraca 2.00 tak samo jak (float).
Pomożecie?
<?php
$float = (float) str_replace(',', '.', filter_var("2 345,21 zł", FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_THOUSAND));
var_dump($float);
Ale może da się krócej bo dawno PHP nie używałem.
O ile rozwiązanie @Markuz wygląda ok, to ja jednak na Twoim miejscu zrezygnowałbym z operacji na pieniądzach z użyciem float. Zobacz jak działa bcmath
i raczej idź w tym kierunku.
Markuz napisał(a):
> <?php
>
> $float = (float) str_replace(',', '.', filter_var("2 345,21 zł", FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_THOUSAND));
> var_dump($float);
> ```
> Ale może da się krócej bo dawno PHP nie używałem.
Dzięki Działa! :)
> ##### [jurek1980 napisał(a)](/Forum/1803563):
O ile rozwiązanie @Markuz wygląda ok, to ja jednak na Twoim miejscu zrezygnowałbym z operacji na pieniądzach z użyciem float. Zobacz jak działa `bcmath` i raczej idź w tym kierunku.
Ok, sprawdzę co to za biblioteka. Rozwiązanie wyżej załatwia moje "potrzeby" :)
Ok, sprawdzę co to za biblioteka. Rozwiązanie wyżej załatwia moje "potrzeby"
"2 345,21 zł"
I nie mogę jej przekształcić na float: 2345.21
No właśnie problem polega na tym, że po przekształceniu na float nie będziesz miał 2345.21 i na pieniądzach nie operuj przy użyciu liczb zmiennoprzecinkowych.
API robi dobrze zwracając String. Tak jak pisał @jurek1980 należy unikać prostego typu float. Do tego lepiej jest użyć BCMath.
Druga sprawa, to zapis tej liczby: 2 345,21 zł . Są tu dwa problemy:
- separator dziesiętny jest jako przecinek (czyli według polskiej lokalizacji),
- grupowanie tysięcy jest jako spacja.
PHP domyślnie w swoim zapisie liczb typu float i double stosuje kropkę. Spacja służy do oddzielania tokenów, więc trzeba poinformować PHP, że po spacji też jest numer.
rufete napisał(a):
Hej.
Pewnie jakaś głupota, ale nie mogę sobie z tym poradzić. Mianowicie z API dostaje cenę jako string:
"2 345,21 zł"
I nie mogę jej przekształcić na float: 2345.21
number_format zwraca 2.00 tak samo jak (float).
Pomożecie?
Pierwsza rzecz, jaką powinieneś zrobić (i jaką się dziwie czemu nikt z doświadczonych programistów tutaj nie zasugerował), to jest przeczytać dokumentację tego API z którego korzytasz, i spróbować znaleźć inne pole, które nie zwraca ceny w taki powalony (czyt. sformatowany) sposób. Jeśli to API jest czegoś warte, to na 100% powinno zwrócić kasę jako int
(czyli. ilość groszy), albo chociaż jako string
bez formatwowania - zakłądajac oczywiście że to jakieś sensowne API.
Jeśli to natomiast nie jest żadne publiczne/dobre API, tylko np Twoje z innej aplikacji którą napisałeś, to powinieneś je przerobić tak, żeby po prostu zwracała int
groszy, oraz sformatowaną ilość. Jednej byś używał wtedy do wyświetlania, jedną do innych obliczeń.
Dopiero w ostateczności postawiłbym na tight-coupling formatowania tego API z Twoją logiką, i wtedy bym użył odpowiedzi gości wyżej, z parsowaniem tej danej na int
+ należałoby napisać unity pod te funkcje.
Chyba że to w ogóle nie jest żadne API, tylko napisałeś sobie jakiś scrapper który zczytuje string ze strony, i tam nie masz podanych groszy, bo to nie jest API wcale tylko zescrappowana strona?