Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyszukiwanie cen(liczb zmiennoprzecinkowych)Problem!
Niktoś
post 15.11.2011, 13:05:59
Post #1





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Witam. Za pomocą wyrażenia regularnego wymuszam na użytkowniku wpisanie w pola inputa liczby np dla.
925tyś345zł49gr użytkownik musi wpisać:
925.345.49 lub 49zł54gr-49.54 itp-po ilości kropek mogę w przyszłości formatować takie liczby np.
Jeśli 2 kropki formatowanie -pierwsza kropka tyś,druga kropka zł,jeśli są trzy kropki to analogicznie mil->tyś->zł itp
np 456.345.56 po formatowaniu wynikiem będzie->456tyś345zł56."gr"(To tak dla ciekawości)
Do bazy zapisuje się to w kolumnie varchar,czyli jako zwykły tekst.O ile zapis,odczyt tego nie stanowi problemu to poważnym problemem jest u mnie wyszukiwanie tych stringów(liczb) w przedziale z selectem z klauzulą between.
Jakoś to robi po afrykańsku,dodatkowo patrzałem na google na różnych przykładach i badanie liczb zmiennoprzecinkowych wygląda tak:
dla liczb 30.785 oraz 2.888.46 :
select .........between 2 AND 40-wyszuka obie pozycje-po prostu nie widzi ,że liczba 2.888.46 jest większa 30.785 i większa od 40.
Jak wyszukiwać takie liczby?A może ,żle to wszystko zrealizowałem-powinnem użyć liczb całkowitych w bazie danych-pobierać te liczby i formatować je na zmiennoprzecinkowe.
Proszę o jakieś rady.

Ten post edytował Niktoś 15.11.2011, 13:12:24
Go to the top of the page
+Quote Post
Sephirus
post 15.11.2011, 13:37:24
Post #2





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

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


Ok w bazie najlepiej trzymać wielkości całkowite - jeżeli twoje sumy zamykają się na całkowitych groszach to:

10 zł zapisujesz jako 1000

45 560,98 zapisujesz jako 4556098

- zawsze masz wtedy liczbę groszy - bez błędów zaokrągleń itd..

Acha i jak BigInt to zapisz smile.gif

I teraz tak - nie znam takiego zapisu pieniężnego jaki proponujesz - znam dwa:

100 000.00 PLN

lub

100,000.00 PLN

Ewentualnie może być taki śiśle Polski zapis typu 100 000,00 PLN ale obstawał bym przy jednym z tych wyżej.

Ja wybrałbym 100,000.00

Zamiana tego na liczbę to banał -

  1. $liczba = (int) str_replace(',','',$kwota); // i już


Wyciągnięcie z liczby odpowiednich członów i jej sformatowanie też nie jest problemem smile.gif można to robić na X sposobów smile.gif

Zostawiam to Tobie wink.gif

P.S. W bazie łatwiej szuka się po intach tongue.gif


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Niktoś
post 15.11.2011, 13:52:21
Post #3





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Dzięki za odpowiedź.
Cytat
I teraz tak - nie znam takiego zapisu pieniężnego jaki proponujesz - znam dwa:

100 000.00 PLN

lub

100,000.00 PLN

Ależ ja mam ten drugi tylko zamiast przecinka jest kropka czyli 100.000.00PLN
Dodatkowo mam-w swoim formularzu wybór opcji gr/zł.
Mam tylko pytanie czy pozostawić -takie wymuszenie formatowania w inpucie??
Jaki schemat zrealizować:
1.dane wejściwe(liczb zmiennoprzecinkowa)->zapis do bazy(liczba całkowita)->odczyt z bazy(konwersja liczba zmiennoprzecinkowa)
2.dane wejściowe(liczba całkowita)->zapis do bazy(liczba całkowita)->odczyt z bazy((konwersja liczba zmiennoprzecinkowa).

Go to the top of the page
+Quote Post
nospor
post 15.11.2011, 13:58:21
Post #4





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Cytat
Mam tylko pytanie czy pozostawić -takie wymuszenie formatowania w inpucie??
Jaki schemat zrealizować:
1.dane wejściwe(liczb zmiennoprzecinkowa)->zapis do bazy(liczba całkowita)->odczyt z bazy(konwersja liczba zmiennoprzecinkowa)
2.dane wejściowe(liczba całkowita)->zapis do bazy(liczba całkowita)->odczyt z bazy((konwersja liczba zmiennoprzecinkowa).

Dziwne pytanie. Przecież to już zależy od Ciebie/klienta czy chcesz wymuszać na użytkownikach jakiś format danych jakie wpisują, czy poprostu mają wpisać inta, bez żadne zabawy z formatowaniem.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Sephirus
post 15.11.2011, 13:59:27
Post #5





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

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


To nie ma znaczenia - jak Tobie będzie wygodniej. A raczej jak użytkownikom.

Wydaje mi się że przy podawaniu kwot (tymbardziej dużych) ludzie nie ufają zapisom innym niż polskie czyli 100000,25 zł ale to tylko mi się wydaje, zmuszanie użytkownika do wpisywania czegoś w rodzaju 100,234.45 może być zarówno dobrym jak i złym pomysłem - musisz sam podjąć decyzję :/

Co do mojego poprzedniego kodu to zapomniałem o *100 tongue.gif

  1. $liczba = (int) str_replace(',','',$kwota); $liczba*=100;




--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Niktoś
post 15.11.2011, 14:11:03
Post #6





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Dziękuję za odpowiedzi,no to teraz mi odpadną z pola jednostki monetarne zł/gr.Obliczanie według najniższej wartości monetarnej,jest najlepszym pomysłem -że też wcześniej się nie spytałem.Teraz trochę pracy z przerabianiem skryptu mnie czeka.
Mam taki pomysł-aby przy zapisie kwoty wymuszać formatowanie w inpucie.
Przy zwykłym wyszukiwaniu już nie.

Wielkie Dzięki.
Go to the top of the page
+Quote Post
nospor
post 15.11.2011, 14:12:39
Post #7





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Cytat
Mam taki pomysł-aby przy zapisie kwoty wymuszać formatowanie w inpucie.
Przy zwykłym wyszukiwaniu już nie.
A nie będzie to mylące dla userów? Raz w inpucie muszą pisać z formatowaniem, w innym miejscu juz bez formatowania.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Niktoś
post 15.11.2011, 19:27:28
Post #8





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Nie ,bo wyszukiwać będzie całkiem inna grupa użytkowników.
Co do :
Cytat
Co do mojego poprzedniego kodu to zapomniałem o *100
-nie wiem po co to?
Jak z liczby 100.000.000 użyje str_replace('.','',$kwota) to pousuwa mi wszystkie kropki i będzie 10000000- po co to jeszcze mnożyć przez 100?
Tylko jak zrobić odwrotność str_replace('.','',$kwota) ,aby przywrócić kropki w odpowiednie miejsca przy wyświetlaniu?

Wydaje mi się ,że trzeba będzie dzielić w pętli przez 1000 i sprawdzać ile razy pętle wykona półki nie osiągnie postaci 0,1 czyli mniejszej od 1.
czyli coś ala:
$i=0;
do{

$liczba =$liczba/1000;
$i++;

}while($liczba<1)
$i będzie ilością kropek.
Teraz trzeba by było zbadać ilość znaków i wstawić kropki co 3 miejsce od końca liczby.
Czy dobrze kombinuje?

Ok ten zapis 100.000.000 jaki w chwili obecnej mam ,dał mi trochę do myślenia-jest nie do zrealizowania.
Gdyż używając - str_replace usuniemy wszystkie kropki,przez co uniemożliwi to ewentualne odzyskanie reszty jeśli taka ów istnieje w liczbie.Już wiem po co ten przecinek w liczbie i mnożenie przez 100.
,-separator liczb całkowitych
.-separator reszty
Usuwamy separator liczb całkowitych i mnożymy * 100 aby pozbyć się reszty-przez co sprowadzamy do liczby naturalnej(w bazie danych big int).
Aby sprawdzić czy liczba ma resztę po prostu dzielimy przez 100.
Chyba dobrze to zrozumiałem.

Ten post edytował Niktoś 15.11.2011, 19:38:14
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 24.04.2024 - 20:02