Discussion:
RegEx für Zahlen mit Tausendertrennzeichen und Nachkommateil
(zu alt für eine Antwort)
Gregor Kofler
2007-08-07 12:58:57 UTC
Permalink
Eine RegEx die eine Zahl mit 1000er Trennzeichen erkennt, habe ich
basteln können [1].
Wie lässt sich aber in einer einzigen RegEx das korrekte Erkennen eines
Nachkommateils durch das "Komplementärzeichen" des 1000er-Trenners
erledigen?

Also:
1,000,000.00
oder
1.000.000,00


Gruß, Gregor



[1]
/^[1-9]\d{0,2}(?:(,|\.)?\d{3})?(\1\d{3})*$/
--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum
Wolfgang Fellger
2007-08-07 13:29:15 UTC
Permalink
Eine RegEx die eine Zahl mit 1000er Trennzeichen erkennt, habe ich basteln
können [1]. Wie lässt sich aber in einer einzigen RegEx das korrekte
Erkennen eines Nachkommateils durch das "Komplementärzeichen" des
1000er-Trenners erledigen?
Ich würde einfach zwei Alternativausdrücke verwenden.

^(\d{0,3}(\.\d{3})*(,\d*)?|\d{0,3}(,\d{3})*(\.\d*)?)$
^
--
Wolfgang Fellger
Gregor Kofler
2007-08-07 13:42:22 UTC
Permalink
Post by Wolfgang Fellger
Eine RegEx die eine Zahl mit 1000er Trennzeichen erkennt, habe ich basteln
können [1]. Wie lässt sich aber in einer einzigen RegEx das korrekte
Erkennen eines Nachkommateils durch das "Komplementärzeichen" des
1000er-Trenners erledigen?
Ich würde einfach zwei Alternativausdrücke verwenden.
^(\d{0,3}(\.\d{3})*(,\d*)?|\d{0,3}(,\d{3})*(\.\d*)?)$
^
Sowas Witzloses... ;-) Aber darauf hätte ich schon selber kommen können.
Hmmm, dachte da an Lookaheads und Backreferences und Dings...

Gruß, Gregor
--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum
Christian Bieser
2007-09-13 06:59:54 UTC
Permalink
Post by Gregor Kofler
Post by Wolfgang Fellger
Eine RegEx die eine Zahl mit 1000er Trennzeichen erkennt, habe ich basteln
können [1]. Wie lässt sich aber in einer einzigen RegEx das korrekte
Erkennen eines Nachkommateils durch das "Komplementärzeichen" des
1000er-Trenners erledigen?
Ich würde einfach zwei Alternativausdrücke verwenden.
^(\d{0,3}(\.\d{3})*(,\d*)?|\d{0,3}(,\d{3})*(\.\d*)?)$
^
Sowas Witzloses... ;-) Aber darauf hätte ich schon selber kommen können.
Hmmm, dachte da an Lookaheads und Backreferences und Dings...
Gruß, Gregor
Ich habe vor geraumer Zeit eine noch etwas ausführlichere PHP-Funktion
geschrieben, da im Rahmen einer Internationalen Website der
Währungsbetrag immer korrekt ermittelt werden musste. Dabei wird die
Eingabe MySQL-Konform umgewandelt.

Hier das Ergebnis:

[code]
/**
* Gibt einen für MySQL gültigen float zurück
*
* @param string $str_zahl
* @return float
*/
function float($str_zahl)
{
if(preg_match('/([0-9\.,-]+)/', $str_zahl, $array_treffer))
{
// Zahl gefunden also können wir weitermachen
$str_zahl = $array_treffer[0];

if(preg_match('/^[0-9.-\s]*[\,]{1}[0-9-]{0,2}$/', $str_zahl))
{
// Komma als Dezimal Separator
// Alle Punkte entfernen und anschließend das Komma in einen
Punkt umwandeln
$str_zahl = str_replace(' ', , $str_zahl);
$str_zahl = str_replace('.', , $str_zahl);
$str_zahl = str_replace(',', '.', $str_zahl);
return floatval($str_zahl);
}
elseif(preg_match('/^[0-9,-\s]*[\.]{1}[0-9-]{0,2}$/', $str_zahl))
{
// Punkt als Dezimal Separator
// Alle Kommata entfernen
$str_zahl = str_replace(' ', , $str_zahl);
$str_zahl = str_replace(',', , $str_zahl);
return floatval($str_zahl);
}
elseif (preg_match('/^[0-9.-\s]*[\.]{1}[0-9-]{0,3}$/', $str_zahl))
{
// Es gibt nur Tausender Separatoren
// Alle Punkte enfernen
$str_zahl = str_replace(' ', , $str_zahl);
$str_zahl = str_replace('.', , $str_zahl);
return floatval($str_zahl);
}
elseif (preg_match('/^[0-9,-\s]*[\,]{1}[0-9-]{0,3}$/', $str_zahl))
{
// Es gibt nur Tausender Separatoren
// Alle Kommata enfernen
$str_zahl = str_replace(' ', , $str_zahl);
$str_zahl = str_replace(',', , $str_zahl);
return floatval($str_zahl);
}
else
return floatval($str_zahl);
}
else
{
return 0;
}
}
[/code]

Gruß Christian

Loading...