:::: MENU ::::

WebDevExp

Meine Erfahrungen in der Webentwicklerwelt

Werteingabe (Geld) in gültiges Float umwandeln

php

Werteingabe (Geld) in gültiges Float umwandeln

Jeder hat seine eigene Art einen Geldbetrag einzugeben, der eine gibt 11,99 ein, der nächste 11.99. Weiter geht es mit den 1000er Trennzeichen, spätestens, wenn das System auch auf die amerikanische Schreibweise können soll, brauchen wir eine Methode, die jegliche Eingabe in einen gültigen Float-Wert umwandelt, am besten auch noch richtig.

Nach langem hin und her und viel Recherche habe ich mir aus diversen Codefragmenten das hier zusammengebaut und es scheint zu funktionieren:

	function price2float($string){
	    $string = trim($string);
		if(preg_match('/([0-9\.,-]+)/', $string, $matches)){
			// Zahl gefunden also können wir weitermachen
			$string = $matches[0];

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

Beispiele zum selbsttesten:
1234.456,78 => 123456.78
1234,456.78 => 123456.78
12.34 => 12.34
12,34 => 12.34
123.456.789 => 123456789
123,456,789 => 123456789

wie immer bin ich für Verbesserungsvorschläge offen!

5 Comments

  1. m1

    Sehr schön. Damit musste ich mich vor zwei Jahren auch rumärgern. Ich habe das ähnlich gelöst, habe damals aber ein paar Formen vernachlässigt.

    Antworten
  2. Michael

    ist aber auch Mist die ganze Geschichte, warum konnte man sich nicht auf EIN System einigen? Nein, jeder braucht seinen eigenen Standard.

    Antworten
  3. Christoph

    Hey Michael,

    super gut, ich drei Stunden rumprobiert aber nicht alles sauber auflösen können, deine Funktion funktioniert perferkt.

    Vielen Dank!

    Antworten

Leave a comment

Loading Facebook Comments ...