![]() Mailinglisten-Archive |
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