Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL][PHP]funkcja str_replace - zamiana znaków, zamiana, zapis i odczyt z bazy danych
kosmic
post
Post #1





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 31.10.2007

Ostrzeżenie: (0%)
-----


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 to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
-Gość-
post
Post #2





Goście







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.
Go to the top of the page
+Quote Post
melkorm
post
Post #3





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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ę.

Ten post edytował melkorm 20.12.2011, 09:12:27
Go to the top of the page
+Quote Post
Sephirus
post
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/wink.gif)

Go to the top of the page
+Quote Post
kosmic
post
Post #5





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 31.10.2007

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/wink.gif)


dzięki wielkie (IMG:style_emoticons/default/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ć (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/tongue.gif)

dzięki wielkie, pozdro

Ten post edytował kosmic 20.12.2011, 13:08:45
Go to the top of the page
+Quote Post
melkorm
post
Post #6





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 16:06