Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][PHP]funkcja str_replace - zamiana znaków
Forum PHP.pl > Forum > Przedszkole
kosmic
witam,
mam mały problem i troszke sobie nie radzę z jego rozwiązaniem, a mianowicie chodzi mi o pewnego typu sytuację, jaka zachodzi w moim skrypcie...

powiedzmy, że chcę zapisać do bazy daną cyfrę, a dokładniej kwotę, którą pobieram z pliku test.csv !
no i pobrana kwota to powiedzmy: 1.234.567,89 zł lub 1 234 567,89zł - w zależności jak sobie wyeksportuję plik,
ale zmierzam do sedna, ponieważ aby poprawnie i czytelnie było to później odczytane, to chciałbym zapisać to do bazy w taki sposób: 1 234 567,89zł, choć te grosze to już są mało istotne i może być to bez nich...

chodzi o to, że potrzebuje później wyciągać te dane, aby dokładnie i czytelnie były widoczne, do tego jeśli takich liczb jest 500, to najmniejszą kwotę i największą itp... no i podmieniam sobie znaki np:

Kod
$nd2 = trim(str_replace(".", " ", $d2));
lub
$nd2 = trim(str_replace(" ", "", $d2));


no i teraz jeśli pole tabeli w sql ma atrybut INT: to zapisuje się tylko pierwsza liczba, do pierwszej spacji, np: 1, chyba że zamienię kropkę lub spację na puste pole i liczba jest zapisana bez żadnego odstępu: 1234567
i w tym przypadku swobodnie znajde min, max i pobiorę żądaną kwotę, ale wyświetla mi się właśnie jako jeden ciąg cyfr, a to nie jest już czytelne i nie łądnie wygląda,

jeśli natomiast atrybut pola jest powiedzmy varchar, to mogę zapisać tak jak chcę do bazy: 1 234 567,89 - ale wtedy są przekłamania jeśli chodzi o max i min, no i wartości też są tylko do pierwszej spacji

min i max pobieram w ten sposób:
Kod
$min_turn = mysql_query("SELECT MIN(dane2) AS min_dane2 FROM baza");
$row = mysql_fetch_assoc($min_turn);
$min = $row['min_dane2'];

$max_turn = mysql_query("SELECT MAX(dane2) AS max_dane2 FROM baza");
$row = mysql_fetch_assoc($max_turn);
$max = $row['max_dane2'];


proszę o pomoc, bo co prawda mogę zapisać to bez żadnych odstępów do tabeli i potem to wyświetlić, ale w przypadku liczb rzędu kilkanaście milionów złotych, to nie są czytelne te liczby, bo trzeba liczyć trójkami, aby wiedzieć czy jest to milion, czy dziesięc itp...
Gość
Ja bym wykombinował tak:
Dawał do bazy jako int normalnie, bez spacji itp.
Działa normalnie wtedy min i max. A gdy wyciągasz możesz stworzyć funkcje która będzie co trzy liczby oddzielała spacją - tylko pamiętaj, musi iść z prawej do lewej bo inaczej zamiast wyjść: 1 000 000 wyjdzie 100 000 000. Nie zapomnij też o tym, żeby liczyło dopiero po przecinku (podziel na dwie liczby: zł i grosze).
Taki algorytm moim zdaniem powinien być dobry.

Musisz pobawić się więc tym albo poszukać na google takiego skryptu.
melkorm
Do zapisu ułamków w MySQL'u używa się pola typu DECIMAL.

A do wyświetlania kwot użyj money_format

Edit: jeszcze śpię.
Sephirus
Prawidłowe podejście w przypadku gdy chcesz operować tymi liczbami w bazie jako "liczby" jest tylko jedno:

1. W bazie zapis jako INT - czyli 1 234 567,89

Jak tego dokonać? Aby wilk był syta i owca cała należy całą tą liczbę wrzucić do bazy razem z groszami. Najprościej:

  1. $liczba = preg_replace('/[^0-9]{1}/','',$liczba);


Dzięki temu z 1 234 567,89 masz 123456789 - czyli liczbę groszy wink.gif

2. Działania na bazie - pole proponuje bigint - można na nim działać jak tylko sobie życzysz - pamietaj jednak że liczbę musisz podzielić przez 100 aby mieć złotówki bo jest w groszach smile.gif

3. Odczyt z bazy - odczytujemy oczywiście liczbę i możemy na niej działać "matematycznie" w przypadku wyświetlania możemy użyć funkcji:

  1. $liczba = 123456789;
  2.  
  3. $liczba = number_format($liczba , 2, ',', ' ');
  4.  
  5. echo $liczba; // da 1 234 567,89


HTH wink.gif

kosmic
Cytat(Sephirus @ 20.12.2011, 09:08:04 ) *
Prawidłowe podejście w przypadku gdy chcesz operować tymi liczbami w bazie jako "liczby" jest tylko jedno:

1. W bazie zapis jako INT - czyli 1 234 567,89

Jak tego dokonać? Aby wilk był syta i owca cała należy całą tą liczbę wrzucić do bazy razem z groszami. Najprościej:

  1. $liczba = preg_replace('/[^0-9]{1}/','',$liczba);


Dzięki temu z 1 234 567,89 masz 123456789 - czyli liczbę groszy wink.gif

2. Działania na bazie - pole proponuje bigint - można na nim działać jak tylko sobie życzysz - pamietaj jednak że liczbę musisz podzielić przez 100 aby mieć złotówki bo jest w groszach smile.gif

3. Odczyt z bazy - odczytujemy oczywiście liczbę i możemy na niej działać "matematycznie" w przypadku wyświetlania możemy użyć funkcji:

  1. $liczba = 123456789;
  2.  
  3. $liczba = number_format($liczba , 2, ',', ' ');
  4.  
  5. echo $liczba; // da 1 234 567,89


HTH wink.gif


dzięki wielkie smile.gif
o to mi włąśnie chodziło...

a dokładnie, jeśli chodzi o zapis do bazy, to trim(str_replace) też mozna spokojnie to zrobić, tworząc tablice, gdzie spacje, kropke lub przecinek eliminuje się, co daje nam ciągłą liczbę, którą potem trzeba podzielić smile.gif

w przypadku tym co podałęś, należy ewentualnie jeszcze dodać opcje liczb ujemnych, bo taki rzypadek też może wsytąić, a mając:
  1. $liczba = preg_replace('/[^0-9]{1}/','',$liczba);

jak jest coś ujemnego, to już będzie błąd, ponieważ wszystkie liczby zostaną zapisane do bazy jako dodatnie...

ale jeśli chodzi o odczyt, to faktycznie funkcja number_format szybko robi to co chiałem tongue.gif

dzięki wielkie, pozdro
melkorm
Hum, a po kiego męczyć się z preg_match, explode itp skoro wystarczy numer_format -> zapis do bazy przy polu DECIMAL (które obsługuje max/min etc) i przy wyświetlaniu po prostu znowu number_format lub money_format?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.