Hallo zusammen,
ich habe mir eine kleine FUnktion geschrieben, die den Wert eines über ein Formular erhaltenen Eurobetrag auf Gültigkeit hin überprüfen soll. D.h. Zwei Nachkommastellen, korrekte Interpunktion (Tausender - Trennzeichen) etc. Darüber hinaus soll die Funktion den Betrag gleich richtig für den Eintrag in eine Datenbank (Double) formatieren. Ich denke auch, dass mir das soweit gelungen ist. Die Funktion würde ich gerne jedem zur freien Nutzung zur Verfügung stellen. Damit das aber auch wirklich Hand und Fuß hat und korrekt funktioniert, wollte ich Euch fragen ob Ihr Euch die Funktion mal anschauen und ggf. Schwachstellen, Fehler oder Verbesserungen aufdecken könntet. Würde mich über ein Feedback sehr freuen.
Hier nun die Funktion:
Viele Grüße
Christian
ich habe mir eine kleine FUnktion geschrieben, die den Wert eines über ein Formular erhaltenen Eurobetrag auf Gültigkeit hin überprüfen soll. D.h. Zwei Nachkommastellen, korrekte Interpunktion (Tausender - Trennzeichen) etc. Darüber hinaus soll die Funktion den Betrag gleich richtig für den Eintrag in eine Datenbank (Double) formatieren. Ich denke auch, dass mir das soweit gelungen ist. Die Funktion würde ich gerne jedem zur freien Nutzung zur Verfügung stellen. Damit das aber auch wirklich Hand und Fuß hat und korrekt funktioniert, wollte ich Euch fragen ob Ihr Euch die Funktion mal anschauen und ggf. Schwachstellen, Fehler oder Verbesserungen aufdecken könntet. Würde mich über ein Feedback sehr freuen.
Hier nun die Funktion:
PHP:
function konvertiereZahl($zahl)
{
$zahl = rtrim(ltrim($zahl)); // entferne Leerzeichen am Anfang und am Ende des Strings
$zahl = str_replace('€','',$zahl); // entferne das Euro Zeichen
$fehler = 0; // FehlerZähler
$anzahl_kommata = substr_count($zahl,','); // Wieviele Kommata sind im String enthalten
$anzahl_punkte = substr_count($zahl,'.'); // Wieviele Punkte sind im String enthalten
$letzterPunkt = strrchr($zahl, '.'); // Zeichenkette ab dem letzten Vorkommen eines Punkts (der Punkt wird mitgezählt)
$letztesKomma = strrchr($zahl, ','); // Zeichenkette ab dem letzten Vorkommen eines Kommatas (der Punkt wird Kommatas)
if($anzahl_kommata > 1) {$fehler++;} // Mehere Kommata sind nicht gestattet ==> Fehlerzähler eins hoch setzen
// Wenn es 1 Punkt im String gibt, ist es möglich dass es sich dabei um einen tausender Trenner oder um den Trenner für die Nachkommastellen handelt
// sofern es sich um einen tausender Trenner handelt, kann dieser entfernet werden. Zusätzlich wird ein Komma als Nachkommastellen - Trenner und 2 Nullen hinzugefügt
if($anzahl_punkte == 1 and strlen($letzterPunkt) == 4) {$zahl=str_replace('.','',$zahl); $zahl .= ",00"; }
if($anzahl_punkte == 1 and strlen($letzterPunkt) == 2) {$zahl .= "0"; }
if($anzahl_kommata == 1 and strlen($letztesKomma) == 2) {$zahl .= "0"; }
if($anzahl_punkte == 0 and $anzahl_kommata == 0) {$zahl .= ",00";}
$laenge = strlen($zahl); // Ermittle die Länge des bereinigten Strings
$delimiter = $laenge -3; // 3. letztes Zeichen ermitteln
$array = str_split($zahl); // Zerlege den String in ein Array
// Punkt und Komma als Nachkommatrenner ermitteln und ersetzen
if($array[$delimiter] != '.' )
{
if($array[$delimiter] != ',') {$fehler++;}
}
if($array[$delimiter] == ',') {$array[$delimiter] = '_';}
if($array[$delimiter] == '.') {$array[$delimiter] = '+';}
$neu = ''; // Leervariable für neue Zusammensetzung
foreach($array as $sub) {$neu .= $sub;} // String neu zusammensetzen
$neu = str_replace('.','',$neu); // Verbleibende Punkte entfernen
$neu = str_replace(',','',$neu); // Verbleibende Kommata entfernen
$neu = str_replace('_','.',$neu); // Punkt wiederherstellen
$neu = str_replace('+','.',$neu); // Punkt wiederherstellen
// Prüfen ob der neue String den Anforderungen entspricht
if(!preg_match('~^[0-9]+(?:\.[0-9]{1,2})?$~', $neu))
{
if(!preg_match('~^[0-9]+(?:\,[0-9]{1,2})?$~', $neu))
{
$fehler++;
}
}
// Status ausgeben
if($fehler==0){return $neu;} else {return false;}
}
// Zum Testen:
/*
$testarray = array("1.000.000.000,00€","1.000€","1.00€",100,"1.000.000.00€",0.5,"100,5","1.000,20€", 'foobar') ;
foreach($testarray as $test)
{
konvertiereZahl($test) ;
echo "<br />";
}
*/
Viele Grüße
Christian