phpbar.de logo

Mailinglisten-Archive

[php] Komma und Punkt erkennen

[php] Komma und Punkt erkennen

Ulf Wendel UW_(at)_NetUSE.DE
Wed, 12 Jan 2000 19:23:51 +0100


Rene Paschold wrote:
> Ich wollte dich eigentlich nur fragen ob du mir den unten stehenden Code
> etwas erläutern kannst, denn ich verstehe da nur Bahnhof :((

Sei mir nicht bös, aber Rückfragen gehören auf die Mailingliste.
Keine Frage ist zu einfach, daß sie nicht gestellt werden dürfte.
Ob es eine Antwort gibt, steht auf einem anderem Blatt...

> 
> Was passiert da?
> 
> Ich wäre dir sehr sehr dankbar wenn du das machen könntest.
> 
> Viele liebe Grüße
> Rene
> 
> $preis = "404.230,20";

Setze eine Variable $preis, um mit irgendetwas arbeiten zu können

> if (ereg("^([0-9]+),([0-9]{2})$", $preis)) {

Prüfe ob der Preis einem bestimmten Muster entspricht. 

Vor den Erklärungen eine Warnung. Alles was folgt ist nicht die
offizielle Doku zu regulären Ausdrücke. Es gibt diverse
Sonderregelungen, die nicht erwähnt werden. Auch verwende ich
nicht die offiziellen Termini. 

[0-9] ist eine character class, sieht steht für genau ein Zeichen
aus der Menge "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0". [0-9]+ ist ein
Suchmuster für mindestens ein Zeichen aus der angegebenen Menge.
Der Ausdruck findet also: 0, 12, 10101, 91 usw. 

([0-9]+) bildet einen "Block". In diesem sind nur Zahlen erlaubt.
Der Block wird in den Suchergebnissen gespeichert, sofern dies
erwünscht ist: ereg("([0-9]+),"192,3", $regs). $regs[1] = "192".

([0-9]{2}) sucht genau zwei Zahlen. 

^([0-9]+) bedeutet, es steht nichts mehr vor dem, was der
Ausdruck matcht. 191, 29292, 12, 8 werden gefunden. "a191" ist
jedoch ungültig, denn es beginnt nicht mit einer Zahl.

([0-9]{2})$ matcht Strings die mit genau zwei Zahlen enden. $ ist
in diesem Fall das Gegenstück zu ^. 

Jetzt alles zusammen: suche etwas, was mit einer beliebigen
Anzahl von Zahlen beginnt, gefolgt von genau einem Komma, gefolgt
von genau zwei Zahlen. Danach darf nichts mehr stehe. Das sollte
eine Preisangabe wie "99,95" matchen.
 
>   echo "Format: xxx,xx<br>\n";
>   $preis = (double)ereg_replace(",", ".", $preis);

$preis = ereg_replace(",", ".", $preis) ersetzt im Preis das
Komma durch einen Punkt. Anschließend wird der Variablentyp durch
einen "Typecast" gesetzt. $preis = (double)$preis - $preis ist
jetzt eine Zahl und zwar ein Double. 

>   printf("Preis: %s, Type: %s<hr>", $preis, gettype($preis));
> 
> } else if (ereg("([0-9]+),([0-9]+)\.([0-9]{2})$", $preis)) {

Das kannst Du jetzt schon selber lesen. Gesucht wird etwas, was
als Tausenderkennzeichen ein Komma und als Dezimalpunkt
verwendet. Da "." eine besondere Bedeutung in regulären
Ausdrücken hat (any character), muß es seiner Besonderheit
beraubt werden. Die Entwertung geschieht durch einen Backslah.
> 
>   echo "Format: xxx,xxx.xx<br>\n";
>   $preis = (double)ereg_replace(",", "", $preis);

Streiche das Komma, danach ist alles gut. 

> } else if (ereg("([0-9]+)\.([0-9]+),([0-9]{2})$", $preis))
> {

Punkt als Tausenderkennzeichen.

>   echo "Format: xxx.xxx,xx<br>\n";
>   $preis = ereg_replace("\.", "", $preis);
>   $preis = (double)ereg_replace(",", ".", $preis);

Wieder beachten, daß der Punkt eine besondere Bedeutung hat und
entwerten, sonst funktioniert das ereg_replace nicht.

>   printf("Preis: %s, Type: %s<hr>", $preis, gettype($preis));
> 
> } else {
> 
>   $preis = printf("%8.2d", $preis);

Unbekannter Typ. $preis wird als Double interpretiert und auf 8
Vorkomma- und 2 Nachkommastellen beschnitten. Das sollte für eine
Preisangabe genügen.

Ulf

-- 
Ulf Wendel
NetUSE Kommunikationstechnologie GmbH
Siemenswall, D-24107 Kiel, Germany
Fon: +49 431 386435 00  --  Fax: +49 431 386435 99


php::bar PHP Wiki   -   Listenarchive