Währung validieren

Chris

Mitglied
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:

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
 
Es gibt auch noch andere Tausendertrennzeichen.
Bei uns ist das folgende üblich:
Code:
1'000'000.00€
Negativwerte
Code:
-1'000'000€
und LEerzeichen zwieschen Zahl und Währung wird gern geschrieben
Code:
1'000'000.00 €
 
Hi,

ok die beiden Probleme könnte man lösen, in dem man

1. Das Euro Zeichen zuerst entfernt und danach erst die Leerzeichen am Anfang und Ende des Strings trimt.
2. Die Tausende Trennzeichen ' durch . ersetzen lässt.

Für meinen Fall ist das zwar nicht nötig aber evtl. benötigt ja der ein oder andere diese Änderungen...
 
Mach doch ne Klasse draus. Also richtig mit Konstrukor, Getter und Setter für den Value und eine toString()-Methode für ein einfaches echo. Man könnte da dann auch noch Methoden für die Grundrechenarten einbauen, die als Argument ein weiteres Objekt der Klasse unterstützt.
 
Hi,

klar kann man das noch weiter ausbauen. Zuvor sollte aber erst mal die Basis hier auf Herz und Nieren getestet werden. Da bislang keine große Kritik kam, denke ich aber mal dass die Funktion ihren Zweck voll und Ganz erfüllt oder?
 
Naja, die erste Anweisung ist hässlich, funktioniert zwar, aber ich würde trim() nehmen. Das €-Zeichen kann unter umständen auch als HTML-Entity kommen (&euro;).

Was passiert, wenn der Betrag so aussieht: 1.000.40€ ?

Ergebnis: 1000.40

Desweiteren muss man das Rad nicht neu erfinden. Es gibt schließlich money_format(). Um das ganze etwas zu abstrahieren, verwendet man dann ein Framework wie Zend.

Sorry, wenn ich das alles jetzt etwas relativiert habe.
 
Zurück