Mailinglisten-Archive |
Hi. Es ist zwar schon eine Weile her, aber vielleicht interessiert es den einen oder die andere doch. Am Mon, 18 Dez 2000 schrieb Roland Suehsmuth: > RF> Die Finanzbeamten machen mich echt fertig: Bei Spendenquittungen (heißen > RF> jetz Zuwendungsbestätigung!) muss jetzt der Betrag auch in Worten > RF> ausgewiesen werden!! > Ich brauche sowas fuer den noch vorhandenen Scheckdruck an unserem > Kassensystem. Allerdings funktioniert nachfolgendes nur unter ORACLE. > select decode(substr(123,1,1),1,'eins', > 2,'zwei', > 3,'drei', > 4,'vier', > 5,'fuenf', > 6,'sechs', > 7,'sieben', > 8,'acht', > 9,'neun', > 0,'null') || '*' || [...] > Die Funktion DECODE stellt eeine if-then-else Struktur dar. Ich hab die Sache oben als Anregung genommen und jetzt eine bzw. zwei Lösungen für MySQL gefunden. Zunächst einmal eine Umwandlung der Art 152 -> eins-fünf-zwei: select lpad(truncate(zahl,0),4,'0') as Betrag, concat( ifnull(elt(substring(lpad(truncate(zahl,0),4,'0'),1,1),'eins-','zwei-','drei-','vier-','fünf-','sechs-','sieben-','acht-','neun-'),if(zahl<1000,'','FEHLER!')), ifnull(elt(substring(lpad(truncate(zahl,0),4,'0'),2,1),'eins-','zwei-','drei-','vier-','fünf-','sechs-','sieben-','acht-','neun-'),if(zahl<100,'','null-')), ifnull(elt(substring(lpad(truncate(zahl,0),4,'0'),3,1),'eins-','zwei-','drei-','vier-','fünf-','sechs-','sieben-','acht-','neun-'),if(zahl<10,'','null-')), ifnull(elt(substring(lpad(truncate(zahl,0),4,'0'),4,1),'eins','zwei','drei','vier','fünf','sechs','sieben','acht','neun'),'null') ) as Worte from Tabelle; Und hier die Lösung für die Wandlung 152 -> einhundertzweiundfünfzig: select lpad(truncate(zahl,0),4,'0') as Betrag, concat( ifnull(elt(substring(lpad(truncate(zahl,0),4,'0'),1,1),'eintausend','zweitausend','dreitausend','viertausend','fünftausend','sechstausend','siebentausend','achttausend','neuntausend'),if(zahl<1000,'','FEHLER!')), ifnull(elt(substring(lpad(truncate(zahl,0),4,'0'),2,1),'einhundert','zweihundert','dreihundert','vierhundert','fünfhundert','sechshundert','siebenhundert','achthundert','neunhundert'),''), if(substring(lpad(truncate(zahl,0),4,'0'),3,2) >= 20, concat( ifnull(elt(substring(lpad(truncate(zahl,0),4,'0'),4,1),'einund','zweiund','dreiund','vierund','fünfund','sechsund','siebenund','achtund','neunund'),''), ifnull(elt(substring(lpad(truncate(zahl,0),4,'0'),3,1),'??eins??','zwanzig','dreißig','vierzig','fünfzig','sechzig','siebzig','achtzig','neunzig'),'??UPS??') ) , # else ifnull(elt(substring(lpad(truncate(zahl,0),4,'0'),3,2),'eins','zwei','drei','vier','fünf','sechs','sieben','acht','neun', 'zehn','elf','zwölf','dreizehn','vierzehn','fünfzehn','sechszehn','siebzehn','achtzehn','neunzehn'),'') ) ) as Wort from Zahl; Beide Abfragen sind für maximal vierstellige Zahlen ohne Komma (d.h. ein Komma-Betrag wir auf eine ganze Zahl gekürzt) ausgelegt. Es ist aber kein großes Problem, dies auf mehr Stellen abzuwandeln. Die Funktionsweise im Groben: Die Zahl wird mit "truncate" in eine Ganzzahl gekürzt, mit "lpad" auf 4 Stellen mit "0" aufgefüllt. Dann wird jeweils mit substring die entsprechende Stelle extrahiert und mit "elt" in einen passenden String gewandelt. Viel Spass damit, Rene -- --- *** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive