Camping_RIDER: Preise in DB speichern, Datentyp

Beitrag lesen

Aloha ;)

Jetzt mal angenommen man würde diese Preise als Integer speichern.
Das bedeutet dann man muss jede Eingabe mal 100 nehmen bzw. bei Komma als Cent Trennzeichen das Komma entfernen? Bei Eingabe mit Tausender Trennpunkt wie 1.500,00 müsste man zudem noch den Punkt entfernen bzw. berücksichtigen. Wenn man dann hinterher die Preise für den Anwender "richtig" anzeigen will, müsste man wieder durch 100 teilen und das Komma als Trennzeichen wieder einfügen.

Das wäre dann aber schon etwas mehr Aufwand, als wenn man es mit Decimal speichert oder?

Du vermischst hier Ausgabe und Speicherung mit Verarbeitung. Bei der Erkennung von Nutzereingaben musst du vorsichtig sein, egal ob du die Beträge als Euro (decimal) oder als Cent (integer) speicherst. Der Nutzer gibt ja einen String ein, interpretieren, damit ne Zahl bei rumkommt, musst du das dann. Genauso musst du auch den String, der aus der Datenbank kommt (oder in welchem PHP-eigenen Format auch immer der aus der Datenbank kommt) zunächst wieder interpretieren. Aufwand hast du also so oder so.

Imho sind Integer aus der Datenbank einfacher zu interpretieren, zumal du im Idealfall das Rechnen / die Verarbeitung nur mit Integern vornimmst. Dann musst du in deinem Quellcode nicht drauf achten und kannst gezielt immer nur dann, wenn der User damit in Berührung kommt (I/O), in float umwandeln (geteilt durch 100) und wieder zurück. Du hast dann genauere Klarheit, wo Integer und wo float ankommt. Wenn du decimal in der Datenbank gespeichert hast wird das beim Abrufen (zumindest in PHP) zu float und du hast Misch-Masch. Meine Meinung. Wenn du lieber mit float rechnest und die Probleme der Fließkommaarithmetik ignorieren willst, darfst du das natürlich auch gern machen.

Interessant ist noch die Frage der Interpretation der Nutzereingaben. Weil man sowohl deutsche als auch englische Dezimaltrennung berücksichtigen muss.

Beispiele für mögliche Nutzereingaben und ihre sinnvolle Entsprechung:

1500.02    -> 1 500 02 ct
1500,02    -> 1 500 02 ct
1.500,02   -> 1 500 02 ct
1,500,02   -> 1 500 02 ct
1,500      -> 1 500 00 ct
1.500      -> 1 500 00 ct
1,50       ->     1 50 ct
1.50       ->     1 50 ct
1.5        ->     1 50 ct
1,5        ->     1 50 ct

Da ich immer noch nicht weiß, womit du serverseitig in der Verarbeitung arbeitest kriegst du den Algorithmus, den ich anwenden würde, in Prosa:

1.: Suche letztes Vorkommen von "," oder "." im Input-String (am besten mit regulärem Ausdruck, dann kannst du gleich die Korrektheit des Eingabeformats sicherstellen. Also sowas wie 1.50,20 gleich wegen falscher 1000er Trennung als Fehleingabe identifizieren)
2.: Falls kein Fund, Input-String um "00" erweitern, zu Integer umwandeln, fertig.
3.: Falls Fund: Gefundenes letztes Trennzeichen muss entweder einziges verwendetes Trennzeichen sein oder darf nur einmal vorkommen
4.: Falls einziges verwendetes Trennzeichen und exakt drei Stellen danach: Hänge "00" an Input-String an, entferne alle Nicht-Zahlen, zu Integer umwandeln, fertig
5.: Falls nur einmal verwendet und maximal zwei Stellen, mindestens eine Stelle danach: Hänge je nachdem "0" oder nichts an, entferne Nicht-Zahlen, zu Integer umwandeln, fertig
6.: Ansonsten: Fehleingabe.

PHP und andere konkrete Fälle kennen dafür u.U. native Funktionen.

Grüße,

RIDER

--
Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[