String in Währung umwandeln (Thema: PHP Beispiele)

Wie aus Strings die verwendete Währung und der Geldbetrag extrahiert werden können

1. Einleitung

Für das Auslesen einer Währensangabe aus einem String wird von PHP keine Standardfunktion zur Verfügung gestellt. Entsprechend muss eine eigene entwickelt werden. Dabei gilt es einige mögliche Schreibweisen zu beachten:

  • Die Währung kann vor oder nach dem Geldbetrag stehen.
  • Die Währung kann als Symbol (zum Beispiel „$”) oder als Zeichenkette (zum Beispiel „USD”) definiert sein.
  • Zwischen der Währung und dem Betrag können beliebig viele Leerzeichen stehen, genauo wie am Anfang und Ende des gesamten Strings.
  • Der Betrag kann positiv oder negativ sein.
  • Der Betrag kann beliebig viele Nachkommastellen haben.
  • Die Nachkommastellen können per Komma oder Punkt vom Rest getrennt sein.
  • Eventuell sind die Tausenderstellen gekennzeichnet, was wiederum durch Komma oder Punkt erfolgt sein kann.

2. Eine einfache Funktion als Beispiel

Die nachfolgende Funktion strToCurrency($str, $validCurrencies) soll dazu dienen, einen String $str auf eine Währungsangabe hin zu untersuchen. An die Funktion können optional beliebig viele mögliche Währungen als Array übergeben werden. Das Array muss als Schlüssel die Ausgabewährung und als Wert wiederum ein Array mit alternativen Schreibweisen für diese Währung enthalten. Soll nur der US-Dollar erlaubt sein, dann könnte $validCurrencies etwa definiert sein über „array('USD', array('$', 'Dollar', 'USD'))”. Wann immer die Zeichenketten „$”, „Dollar” oder „USD” gefunden werden, wird angenommen, dass der String eine Währung mit der standardisierten Bezeichnung „USD” enthält. Es wird dann „USD” zurückgegeben — und nicht etwa „$” oder „Dollar”.

Das Vorgehen der Funktion lautet wie folgt:

  • Der übergebene String $str wird per trim() behandelt (Wegkürzen von Leerzeichen am Anfang/Ende) und in Kleinbuchstaben umgewandelt.
  • Anschließend wird über alle alternativen Schreibweisen aller Währungen iteriert und es wird geprüft, ob der String mit dieser Währung anfängt oder endet.
  • Sobald eine der Währungen ein Treffer ist, wird diese gespeichert, vom Anfang/Ende des Strings weggekürzt und der Rest als Geldbetrag interpretiert.
  • Der Geldbetrag wird mit einer Funktion in einen String umgewandelt, die im Artikel „String zu Float umwandeln” vorgestellt wurde.
  • Zuletzt wird das Ergebnis als Array mit Aufbau array(Währung, Betrag) zurückgegeben, wobei als Währung hier der standardisierte Name verwendet wird („$”, „Dollar” und „us-dollar” werden z.B. auf „USD” abgebildet).
PHP-Code
<?php
	function strToCurrency($str, $validCurrencies=null) {
		if ($validCurrencies === null) {
			return strToCurrency($str,
					array(
						'EUR' => array('€', 'eur', 'euro'),
						'USD' => array('$', 'usd', 'dollar', 'us-dollar', 'us dollar'),
						'JPY' => array('¥', 'jpy', 'yen'),
						'CHF' => array('chf')
					)
			);
		}
		
		$currs = array();
		foreach ($validCurrencies as $symbol => $alternatives) {
			foreach ($alternatives as $a) {
				$currs[$a] = $symbol;
			}
		}
		
		$str = mb_strtolower(trim($str));
		$resultFloat = null;
		$resultSymbol = null;
		
		foreach ($currs as $curr=>$symbol) {
			$len = strlen($curr);
			if (substr($str, 0, $len) === $curr) {
				$resultSymbol = $symbol;
				$resultFloat = substr($str, $len);
				break;
			} else if (substr($str, -$len, $len) === $curr) {
				$resultSymbol = $symbol;
				$resultFloat = substr($str, 0, -$len);
				break;
			}
		}
		
		if ($resultSymbol === null) {
			return false;
		} else {
			return array($resultSymbol, strToFloat($resultFloat));
		}
	}
	
	function strToFloat($str) {
		$pos = strrpos($str = strtr(trim(strval($str)), ',', '.'), '.');
		return ($pos===false ? floatval($str) : floatval(str_replace('.', '', substr($str, 0, $pos)) . substr($str, $pos)));
	}
	
	// Beispielfunktion zum Ausgaben des Ergebnisses von strToCurrency()
	function dumpStrToCurrency($str) {
		$r = strToCurrency($str);
		if ($r===false) {
			return 'CONVERSION ERROR';
		} else {
			list($symbol, $float) = $r;
			return "currency: $symbol, value: $float";
		}
	}
	
	echo "EUR1000:\n";
	echo dumpStrToCurrency("EUR1000")."\n\n";
	
	echo "€1000:\n";
	echo dumpStrToCurrency("€1000")."\n\n";
	
	echo "122,3$:\n";
	echo dumpStrToCurrency("122,3$")."\n\n";
	
	echo "US-Dollar 124.56:\n";
	echo dumpStrToCurrency("US-Dollar 124.56")."\n\n";
	
	echo "999.55     chf:\n";
	echo dumpStrToCurrency("999.55     chf")."\n\n";
	
	echo "usd 134,413.0:\n";
	echo dumpStrToCurrency("usd 134,413.0")."\n\n";
	
	// pound bzw. Pfund ist nicht Teil der voreingestellten Waehrungen und schlaegt daher fehl,
	// obwohl es die Waehrung eigentlich gibt
	echo "pound 65:\n";
	echo dumpStrToCurrency("pound 65")."\n\n";
	
	echo "dog:\n";
	echo dumpStrToCurrency("dog")."\n\n";
?>

HTML-Code: Ausgabe
EUR1000:
currency: EUR, value: 1000

€1000:
currency: EUR, value: 1000

122,3$:
currency: USD, value: 122.3

US-Dollar 124.56:
currency: USD, value: 124.56

999.55     chf:
currency: CHF, value: 999.55

usd 134,413.0:
currency: USD, value: 134413

pound 65:
CONVERSION ERROR

dog:
CONVERSION ERROR



Kommentare (1)

Von neu nach alt
warum nicht http://php.net/manual/de/function.money-format.php verwenden?
ArnoNuehm (Gast) #