Archiv verlassen und diese Seite im Standarddesign anzeigen : Geldbetrag umformatieren
Hi. Ich hab da eine Art Artikelverwaltung.
Da jeder den Geldbetraganders eingibt muss ich den umformatieren.
Ich zerbrech mir gerade den Kopf mit ereg und replace und was weiss ich noch alles und versuch alle Eventualitäten so optimal wie möglich abzufangen.
Jetzt wollt ich mal fragen ob jemand sowas schon mal gemacht hat - bestimmt doch - und mir den Code vlt. zukommen lassen würde ... oder mir zumindest mal nen konkreteren Tipp geben könnt.
Es sollten alle 1000er-Trennzeichen (Punkt bei uns und auch Komma für U.S.) herausgefiltert werden.
Zudem sollte 2 Stellen nach dem Dezimal-Komma alles weggeschnitten werden um Währungszeichen zu entfernen
Der Fall das kein Dezimal-Komma (oder Punkt bei U.S.) sollte aber auch berücksichtigt werden
Auch der Fall, dass das Währungssymbol vorne steht.
Im Resultat sollte dann ein String wie dieser "1234,56" bzw. ohne Dezimalstellen "1234,00" rauskommen.
Hoffe jemand hat was für mich.
Thx
MelloPie 22-06-2004, 15:59 print_f() ?
öhhh ... geil ... kannte ich noch nicht.
asusprobiert und als super empfunden :))
hmm ... hast noch ne idee wie ich verschiedenste Währungszeichen (EUR, €, ...) vor und dahinter abfangen kann ohne alle möglichkeiten abzufragen?
Also eigentl alles vor der ersten und hinter der letzten Zahl abschneiden
z.B. mit preg_match (http://de.php.net/preg_match)
öhhh also mit dem print_f kann ich nix anfangen. das soll nicht ausgegeben sondern in die DB
das number_format war schon richtig.
Das Problem damit ist nur, wenn es schon "richtig" formatiert ist 1,99 dann macht er 1,00 draus.
Syntax: $temp=number_format($zahl, 2, ',', '');
Da muss ich dann wieder abfangen ob es mit dem Dezimalzeichen "," oder "." formatiert ist.
Also wieder zurück zu meiner ersten Bitte. Ist schließlich was wo immer wieder gebraucht wird sobald irgendwo was mit einheitlichen Geldbeträgen gemacht wird und ist sicherlich schon ein paar mal realisiert worden.
öhhh also mit dem print_f kann ich nix anfangen. dann lies das manual und setz ein s davor ;)
dann sollst du schon bei der Eingabe sowas abfangen. Schau mal in Codes Schnippseln vorbei, dort habe ich was mit Datum gepostet, mit einer kleinem Modifizierung könntest du dann einsetzen. ;)
@asp2php
preg_match iss ja net verkehrt. dacht ich auch schon dran. aber wiedermal ist da das problem, dass ich alle eventualitäten wie so ein wicht seinen betrag einträgt abfangen muss. lieber wärs mir von hinten an die sache ran zu gehen, also nur das zu nehmen was auch eine zahl ist, incl. Punkt und Komma.
@TobiaZ
ich meinte net dass ich net weiss was print_f macht sondern dass mir das hier gar nix bringt
Original geschrieben von Krysis
das soll nicht ausgegeben sondern in die DB das number_format war schon richtig.wenn es in die DB soll, ist number_format() nicht wirklich sinnvoll. in der DB wird nur die zahl gespeichert. nf() nimmst du dann nur bei der ausgabe.
wenn du einen string in eine zahl wanden willst, kannst du das z.b. so machen ....<?php
$zahl = '22.3354 EUR';
// $zahl = 'a 22.3354 EUR'; // sowas ist böse. ;-)
echo $zahl.'<br />';
$zahl = (float)$zahl;
echo $zahl;
?>
Jo. aber genau um das 'Böse' gehts mir.
Mit float wird mir dann aber auch die nachkommastellen abgeschnitten.
@asp2php JS wollt ich eigentl vermeiden
na hilft wohl alles nix. werd mir dann halt doch den kopf zermatern und selber mal nen script zusammenprügeln. schön wirds net aber funzen wirds - irgendwann :((
du kannst mit sprintf wunderbar formatieren. ggf besser als mit nf().
warum lässt du die leute überhaupt € / EUR oder so eingeben? Naja, egal. aber du kannst doch einfach den teil rausziehen, den du brauchst, formatierst ggf. um und gut.
das problem ist, dass die nicht nur von hand eingeben sondern noch ne variante mit txt und csv oder cvs ... welches auch immer ... dazu kommt. das können dann recht viele artikel sein die die leut möglichst ohne umformatieren zu müssen hochschieben können. Da das von aller Herren Länder ist, wo ich null plan hab was die für Sonderglumb machen wollt ich eigentl was wo alles abgedeckt ist.
Meine Hoffnung war halt, dass es sowas vlt. schon gibt.
Aber wie gesagt, mach ichs halt selber. Werds dann auch braf in die Code-Schnipsel stecken
thx nochmal an alle
wenn du davon ausgehen kannst, dass alles euro ist, ist ja kein problem. wenn nicht, musste halt noch die einheit parsen...
sollte alles mit preg_match zu machen sein...
Mal ein Lösungsansatz
Zuerst alles rauswerfen, was keine Miete zahlt, sprich Dollarsymbole, "EUR", "DEM" etc., davon ausgehend, daß in der Variable $cur_string die Benutzereingabe steht:
$cur_string = preg_replace("/[a-zA-Z $]/","",$cur_string);
Dann suchen wir uns die Bestandteile des Preises heraus, davon ausgehend, daß ein Komma oder Punkt max. 2 Zeichen vor Ende die Dezimaltrennung darstellt und der Rest der Hauptbetrag vor dem Komma ist:
preg_match("/^([0-9.,]+)[.,]{1}(\d{0,2})/",$cur_string,$m);
Nun fischen wir uns noch die einzelnen Bestandteile heraus und eliminieren eventuelle Formatierungen im Hauptbetrag.
$vorkomma = preg_replace("/[.,]/","",$m[1]);
$nachkomma = $m[2];
Für weitere Berechnungen fügen wir die Schnipsel wieder zusammen:
$summe = floatval($vorkomma.".".$nachkomma);
Das dürfte malso als Anregung genügen, denke ich. Weitere Umrechnungen und Anpassungen bitte mit Hilfe von http://www.php.net (vor allem num_format() ) entsprechend vornehmen. ;)
mrhappiness 22-06-2004, 21:53 if (preg_match('%\\.(.*)+,%', $zahl))
$zahl = str_replace(array('.', ','), array('', '.'), $zahl);
elseif (preg_match('%,(.*)+\\.%', $zahl))
$zahl = str_replace(',', '', $zahl);
else
$zahl = preg_replace('%[^0-9]%', '', $zahl);
echo floatval($zahl);könnte auch klappen, is aber ungetestet
so sollten aber rein theoretisch auch mehr als zwei nachkommastellen eingegeben werden können, du kannst ja danach runden
|
-
- |