RegEx für Zahlen mit Tausendertrennzeichen und Nachkommateil
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
Re: RegEx für Zahlen mit Tausendertrennzeichen und Nachkommateil
Gregor Kofler schrieb:
>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
Re: RegEx für Zahlen mit Tausendertrennzeichen und Nachkommateil
Wolfgang Fellger meinte:
> Gregor Kofler schrieb:
>
>> 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
Re: RegEx für Zahlen mit Tausendertrennzeichen und Nachkommateil
Gregor Kofler schrieb:
> Wolfgang Fellger meinte:
>> Gregor Kofler schrieb:
>>
>>> 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
*
* [at] param string $str_zahl
* [at] 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