Hi,
Ich wuerde es wohl auch so machen. Ist sicher garnicht so schwer. Die Dreierbloecke kann kan ja mit einer Subroutine uebersetzen.
Allerdings ist das mit dem Unendlich auch nicht so dramatisch, denn irgendwann kannst DU eine Zahl nichtmehr mit Worten bezeichnen, oder weisst du was hinter der quadrilliarde kommt ?
das Thema hatten wir gerade erst in de.sci.mathematik... :-)
Teile die Zahl in sechser-Blöcke auf. Der nullte Block sind die Tausender etc., danach folgen:
Mill (ionen, iarden),
Bill*,
Trill*,
Quadrill*,
Quintill*,
Sextill*,
Septill*,
Octill*,
Nonill*,
Dezill*,
usw. (hoffe, ich habe jetzt keinen Fehler gemacht...). Wenn es noch höher gehen soll: Eine Dezillion sind 10^(6*10), wobei die 10 in der Klammer sich in "Dez" ausdrückt. 10^100 hat der Sohn (Enkel?) Eines Kindes mal benamst, und zwar als "gogool", was überraschend simpel ist für eine Zahl, die 20 Stellen mehr hat als die Zahl der Atome im bekannten Universum. Eine Zahl mit 10^100 Ziffern (also 10^(10^100)) heißt übrigens gogoolplex... :-)
Du kannst also in etwa folgendermaßen vorgehen:
$zahl = "123.456.789,12";
$block = 0; # aktueller 6er-Block
@bname = ('','Mill','Bill','Trill',...);
if ($zahl =~ /^(.*),(.*)$/) { $zahl = $1; $komma = $2; } # Ganzzahl herstellen, Nachkommastellen speichern
$zahl =~ s/.//g; # Punkte entfernen
$string = &num2string($zahl,$block);
Jetzt brauchst Du nur noch die rekursive sub num2string, die folgendes macht:
- Die Zahl aufspalten in /^(.*)(.{6})$/, falls mehr als 6 Ziffern.
- Die letzten 6 Ziffern "manuell" in ein Wort aufteilen (vielleicht mit zweimaligem Aufruf einer Funktion, die eine Zahl < 1000 in ein Wort umwandelt).
- Dabei muß $bname[$block] + 'ionen' bzw. 'iarden' addiert werden, bzw. 'tausend', falls $bname[$block] eq '' und die höherwertigen drei Ziffern bearbeitet werden.
- Nun muß nur noch "return &num2string(Restzahl,$block+1) . Ergebnis dieser Rekursion" ausgegeben werden.
Die Funktion num2string überlasse ich Dir ;-)
Cheatah