phpbar.de logo

Mailinglisten-Archive

Re: Zahl in Worten
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Zahl in Worten



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 


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive