Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyrażenie regularne
Forum PHP.pl > Forum > Przedszkole
Largo
Witam,

Mam pewien problem związany z walidacją mojego skryptu. Otóż użytkownik wpisuję kwotę, którą chcę wysłać. Kwota jest zmiennoprzecinkowa do dwóch miejsc po przecinku. Ale np. dodając do bazy kwotę ( pole decimal! ) - 1,23 baza wysypię się z powodu ',', więc go usuwam. Mimo to zauważyłem, że skrypt ma pewne tendencje do naużywania tego. Jaki jest w sendie sprawy problem?

Chciałbym, aby usuwał wszystkie napotkane przecinki na pusty string, a ostatni zamienił na kropkę, jeżeli jednak nie istnieje to powinien dodać: '.00', np:

Początkowa kwota: 1,23,56,32
Zmieniona: 1235632.32

Początkowa kwota: 32423
Zmieniona kwota: 32423.00

Wg. mojego czytania manual'a nie da się tego wykonać bez wyrażeń regularnych. str_replace działa na wszystkich wystąpieniach, a inne nie zamieniają. Niestety, nie podam nawet trochę kodu, mogę podać ten co dokonuje weryfikacji obecnej. Czy takie coś ma sens? Pytam o głupią sprawę ( weryfikacja kwoty... ), ale wiem, że szukają błędów.

Pozdrawiam,
Largo
Sabistik
A patrzyłeś na number_format ?
Fifi209
strrpos winksmiley.jpg Zamień ostatni na kropkę i potem możesz str_replace
Largo
Witaj,

W sumie podsunąłeś pomysł z strrpos jaki ja znalazłem :-) Oto co wykonałem:

  1. //-------------------------------------
  2. // Prepare amount!
  3. //-------------------------------------
  4. if ( strrpos( $this->ipsclass->input['amount'], ',' ) !== FALSE )
  5. {
  6. $this->ipsclass->input['amount'] = substr_replace( ',', '.', strrpos( $this->ipsclass->input['amount'], ',' ), 1 );
  7. }
  8.  
  9. $this->ipsclass->input['amount'] = floatval( str_replace( ',', '', $this->ipsclass->input['amount'] ) );


Problem pojawił mi się przemyśliwując mój kod. Co się stanie jeżeli user wpiszę: 1,1,1 ? Zamieni na 11.1? Teraz to się zastanawiam jak zareaguje baza, jak ona doda taki wynik dla pola decimal(10, 2 )? Czy traktować jedną liczbę jako dziesiątki czy jedności?

PS. OK, podjąłem decyzję i zaokrąglę jedności do dziesiątek. Kod poprawiony dodam jak wrócę zasłużonego dziś piwka :-) Dziękuje za poradę!

Oto poprawiony kod. Proszę go ocenić i poddać wszelkie lepsze propozycje:

  1. //-------------------------------------
  2. // Prepare amount!
  3. //-------------------------------------
  4. if ( strrpos( $this->ipsclass->input['amount'], ',' ) !== FALSE )
  5. {
  6. $this->ipsclass->input['amount'] = substr_replace( $this->ipsclass->input['amount'], '.', strrpos( $this->ipsclass->input['amount'], ',' ), 1 );
  7.  
  8. list( $integer, $digits ) = explode( '.', $this->ipsclass->input['amount'] );
  9.  
  10. $lenght = strlen( $digits );
  11. switch ( $lenght )
  12. {
  13. case ( $lenght < 2 ):
  14. $digits *= 10;
  15. break;
  16. case ( $lenght > 2 ):
  17. $digits = substr( $digits, 0, 2 );
  18. break;
  19. case 0:
  20. $digits = '00';
  21. break;
  22. }
  23.  
  24. $this->ipsclass->input['amount'] = implode( '.', array( $integer, $digits ) );
  25. }
  26. else
  27. {
  28. $this->ipsclass->input['amount'] = implode( '.', array( $this->ipsclass->input['amount'], '00' ) );
  29. }
  30.  
  31. $this->ipsclass->input['amount'] = str_replace( ',', '', $this->ipsclass->input['amount'] );


Powinien podzielić kwotę na liczbę całkowitą i jedności. Jeżeli jedności jest mniejsza od 2 to mnoży razy 10, aby z 1 cyfry zrobić dziesiątki. A kiedy nie ma, po prostu dodaję string w postaci dwóch zer :-)

Pozdrawiam,
Largo
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.