String to float

0

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?

3
<?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.

7

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.

0
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" :)
5

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.

4

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.

1
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?

1 użytkowników online, w tym zalogowanych: 0, gości: 1