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