Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wymiana wartości cenowych frontend<->skrypt<->db
Forum PHP.pl > Forum > PHP
andrzejb
Próbuję odnaleźć najlepszy sposób wymiany wartości cenowych między skryptem a bazą danych

konwersja przecinka na kropkę podczas operacji zapisu oraz na odwrót podczas prezentacji, na dłuższa metę wydaje się być łopatologicznym podejściem do sprawy.

Czytałem kiedyś o inicjowaniu zmiennych regionalnych które wpływały na format daty nie mogę sobie przypomnieć czy wpływały także na interpretacje przecinka jako kropki

i stad moje pytanie czy istnieje jakiś prosty sposób aby peHap rozpoznał liczbę zmiennoprzecinkową rozdzieloną przecinkiem jako float ?

a jeżeli nie to jak sobie radzicie z w/w przypadkiem

  1. <?php
  2. $numbers = array(
  3.    '1,2',
  4.    '3.4',
  5.    5.6
  6. );
  7. var_dump($numbers);
  8. /*
  9. array(3) {
  10.   [0]=>
  11.   string(3) "1,2"
  12.   [1]=>
  13.   string(3) "3.4"
  14.   [2]=>
  15.   float(5.6)
  16. }
  17.  */
  18. var_dump(floatval($numbers[0]));
  19. //float(1)
  20. var_dump(floatval($numbers[1]));
  21. // float(3.4)
  22. var_dump(floatval($numbers[2]));
  23. // float(5.6)
  24. $suma = floatval('1,5') + floatval('1,5');
  25. var_dump($suma);
  26. // float(2)
  27. $suma = 1.5 + 1.5;
  28. var_dump($suma);
  29. // float(3)
  30. (float) $a = '1,5';
  31. (float) $b = '1,5';
  32. var_dump($a+$b);
  33. // int(2) - :)
  34. ?>
erix
Cytat
i stad moje pytanie czy istnieje jakiś prosty sposób aby peHap rozpoznał liczbę zmiennoprzecinkową rozdzieloną przecinkiem jako float ?

Nie. Musiałbyś cały programistyczny świat przewracać do góry nogami.
Prym
hm jeśli chodzi o przecinki to zawsze możesz zastosować funkcje number_format
number_format

osobiście kiedyś zastosowałem tą funkcję na stronie i działa do dziś (a działa zarówno przed wprowadzeniem do bazy jak i przy pobraniu z bazy)
Vengeance
Ja czasem używam:

  1. <?php
  2. function toFloat($price){
  3.    $price = trim($price);
  4.    if(preg_match("~^([0-9]+|(?:(?:[0-9]{1,3}([.,' ]))+[0-9]{3})+)(([.,])[0-9]{1,2})?$~", $price, $r)){
  5.        if(!empty($r['2'])){
  6.            $pre = preg_replace("~[".$r['2']."]~", "", $r['1']);
  7.        }else{
  8.            $pre = $r['1'];
  9.        }
  10.        if(!empty($r['4'])){
  11.            $post = ".".preg_replace("~[".$r['4']."]~", "", $r['3']);
  12.        }else{
  13.            $post = false;
  14.        }
  15.        $form_price = $pre.$post;
  16.        return $form_price;
  17.    }
  18.    return false;
  19. }
  20. ?>
sowiq
Pytanie tylko z czego wynikają te różnice w zapisie liczb. Bo rozumiem, że w bazie danych do przechowywania liczb używasz pola liczbowego, a nie varchar?
Po pobraniu z bazy możesz na tych danych wykonywać normalne operacje arytmetyczne.
Odebrane np. z formularza dane tak czy siak musisz przefiltrować, więc czy dasz jeden str_replace mniej czy więcej, to chyba bez większej różnicy?
Jedyny problem to wyświetlanie, ale tu przychodzi z pomocą wspomniany wcześniej number_format" title="Zobacz w manualu PHP" target="_manual.

@Vengeance,
czy rzeczywiście potrzeba tylu preg'ów do przekonwertowania zmiennej na float'a? smile.gif
Vengeance
Jeżeli ktoś wpisze Ci:
1000.00
1 000.00
1,000.00
100.000.000,00

i tam rozne takie inne glupie kombinacje... to tak biggrin.gif
andrzejb
Cytat(erix @ 3.06.2009, 14:00:39 ) *
Nie. Musiałbyś cały programistyczny świat przewracać do góry nogami.

Bardzo kolokwialnie jednak systemy operacyjne bardzo dobrze radzą sobie z tym w ramach ustawień regionalnych smile.gif
Cytat
Pytanie tylko z czego wynikają te różnice w zapisie liczb. Bo rozumiem, że w bazie danych do przechowywania liczb używasz pola liczbowego, a nie varchar?

trafiłeś, jednak dużo tłumaczenia z pewnych względów miałem liczby w bazie w postaci ###,## biggrin.gif
Cytat
hm jeśli chodzi o przecinki to zawsze możesz zastosować funkcje number_format
number_format

jest to bardzo pozytywna funkcja i przyjmuje ustawienia regionalne

jezeli juz zachodzi u mnie potrzeba konwersji na float to korzystam z biorąc pod uwagę maskę dla wejścia #,#
  1. <?php
  2. public function cToP($val){
  3.        return str_replace(',','.',$val);
  4.    }
  5. ?>


rozwiązaniem które istotnie ma sens w takim razie to ustalenie na warstwie beforeFilter,Save, przeszukanie data z POST,GET i wychwycenie kluczy np currency oraz ich dalsza konwersja w zależności od potrzeby
[edit]
nie mialem czasu aby rozwinac, wiec jezeli posiadamy aplikacje w MVC oraz posiadamy front controller i tablice z post wszystkie wartosci cenowe puszczamy w tablicy data[model][currency_cena_netto] lub wydajniej data[model][currency][cena_netto] i tak jezeli front controller chwyci w befor save index z currency poddaje takie wartosci konwersji ... moze komus sie przyda

dziękować za dyskusje i rozwianie wątpliwości
erix
Cytat
Bardzo kolokwialnie jednak systemy operacyjne

Systemy tak, ale nie kompilatory, które traktują w 90% przypadków kropki jako separatory części dziesiętnych liczb.
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.