[php] Wyrażenie regularne na kwotę (cena, zapis walutowy)

Witam,

piszę sobie od jakiegoś czasu skrypt - taki jakby sklepik internetowy oparty na plikach tekstowych. Doszedłem do momentu, w którym dodaje się do oferty przedmiot i chciałbym aby wpisywana cena była validowana. Napisałem do tego wyrażenie regularne - pierwsze w mojej karierze :smiley:

Chciałbym wiedzieć, czy jest ono poprawnie skonstruowane, czy można je jakoś ulepszyć?

<?php

$matryca = "/^[0-9]{1,2}(\.|,)[0-9]{2}$/";

$input = '0,30';


if(preg_match($matryca, $input)==TRUE) print 'ok 
'.$input;

else print 'dupa a nie ok
'.$input;

?>

Ogólna specyfikacja: - input jest traktowany jako string - zmusza mnie do tego tekstowa baza danych - wpisywana liczba musi posiadać separator dziesiętnych w postaci kropki lub przecinka (później będzie to ustandaryzowane to jednego znaku) - liczba musi być dodatnia (i tu pojawia się problem) - jeśli pierwsza cyfra jest zerem a druga cyfra jest różna od zera (np. 04,50) to pierwszą cyfrę należy usunąć (aby było 4,50) Problem: - mój regexp akceptuje kwotę 0,00 oraz 00,00 a więc niedodatnią - aby poradzić sobie z tą pierwszą cyfrą, wydaje mi się że warunek będzie brzmiał:

<?php

if ($input[0]==0 and $input[1]!=0)

?>

ale co dalej…? Jak usuwać pierwszą cyfrę?

jak usunąć pierwsze zero jeśli w ogóle jest ?

if ($input[0]==0 and $input[1]!=0){

 $input=preg_replace('#0([1-9]{1}),([0-9]+)#s', '\\1,\\2', $input);

}

Z tym zerem wczoraj wpadłem na taki pomysł:

<?php

if (strlen($input)>1 and $input[0]==0 and $input[1]!=',') {

	print 'ucinam pierwszy znak: '.$input[0].'
';

	$input = substr($input, 1);

}

?>[/code]


ale też nie jest on doskonały bo reaguje na input [b]a2,08[/b] - czyli taki, gdzie pierwszy znak nie jest liczbą... 



Twój kod działa jak najbardziej dobrze :) Tylko że warunek jest jednak zły... Dla inputa [b]00,08[/b] warunek nie jest spełniony a przecież tutaj pierwsze zero też powinno być usunięte.



-- edit --

Zmodyfikowałem lekko Twój kod:

[code]if (strlen($input)>1 and $input[0]==0 and $input[1]!=’,’) { $input = preg_replace(’#0([0-9]{1})(,|.)([0-9].)#s’, ‘\1,\3’, $input); }

i teraz działa doskonale :slight_smile: