Wettbewerb: 10.000 Zahlen ausschreiben
Heute kam mir eine nette kleine Programmieraufgabe zu Ohren, und da dachte ich gleich an euch. Das könnte eine interessante Aufgabe sein um zu zeigen wie mit unterschiedlichen Vorgehensweisen das Problem gelöst werden kann.
Die Aufgabe: Die Zahlen 1 bis 10.000 sollen der Reihe nach ausgeschrieben werden, getrennt durch einen Umbruch. So sieht die Ausgabe dann aus:
eins zwei drei vier fünf ...... eintausendzweihundertdreizehn eintausendzweihundertvierzehn .... zehntausend
Ich hoffe die Aufgabe ist verständlich. Mich würde vor allem die Codelänge interessieren, ich glaube die Laufzeit oder Speicherverbrauch sind relativ uninteressant bzw. sehr ähnlich.
Programmiersprachen: Natürlich PHP, aber auch gern andere Sprachen zum Vergleich.
Edit: Eine sehr schöne Zusammenfassung der Ergebnisse hat Rodney Rehm geschrieben, Danke!



Klingt echt sehr cool. werde ich mich heute Abend mal dran machen.
Sascha
21 Dez 10 at 16:26
Kommt mir doch bekannt vor…
http://projecteuler.net/index.php?section=problems&id=17
David Thalmann
21 Dez 10 at 17:19
65 Zeilen
<?php
function getNumberInWrittenWord($zahl)
{
$wert="";
if ($zahl==1) {$wert="ein";}
elseif ($zahl==2) {$wert="zwei";}
elseif ($zahl==3) {$wert="drei";}
elseif ($zahl==4) {$wert="vier";}
elseif ($zahl==5) {$wert="fünf";}
elseif ($zahl==6) {$wert="sechs";}
elseif ($zahl==7) {$wert="sieben";}
elseif ($zahl==8) {$wert="acht";}
elseif ($zahl==9) {$wert="neun";}
elseif ($zahl==10) {$wert="zehn";}
elseif ($zahl==11) {$wert="elf";}
elseif ($zahl==12) {$wert="zwölf";}
elseif ($zahl==20) {$wert="zwanzig";}
elseif ($zahl==30) {$wert="dreißig";}
elseif ($zahl==40) {$wert="vierzig";}
elseif ($zahl==50) {$wert="fünfzig";}
elseif ($zahl==60) {$wert="sechzig";}
elseif ($zahl==70) {$wert="siebzig";}
elseif ($zahl==80) {$wert="achtzig";}
elseif ($zahl==90) {$wert="neunzig";}
return $wert;
}
for ($i=1; $i12)
{
$zehner_zahl=intval($zahl / 10)*10;
$zehner=getNumberInWrittenWord($zehner_zahl);
$zahl=$zahl – intval($zahl / 10)*10;
$einer_zahl=$zahl;
$einer=getNumberInWrittenWord($einer_zahl);
}
else
{
$einer=getNumberInWrittenWord($zahl);
$zehner_zahl=0;
$zehner=”";
$einer_zahl=$zahl;
}
$ausgabe=”";
if ($tausend!=”") {$ausgabe.=$tausend.”tausend”;}
if ($hundert!=”") {$ausgabe.=$hundert.”hundert”;}
if ($einer!=”")
{
$ausgabe.=$einer;
if ($einer_zahl==1 AND $zehner_zahl==0) {$ausgabe.=”s”;}
if ($zehner_zahl>=20) {$ausgabe.=”und”;}
}
if ($zehner!=”") {$ausgabe.=$zehner;}
echo $ausgabe.”";
}
?>
Blubber
21 Dez 10 at 17:34
1. Versuch: 31 Zeilen
<?php
$einer = array('', 'eins', 'zwei', 'drei', 'vier', 'fünf', 'sechs', 'sieben', 'acht', 'neun', 'zehn');
for($i = 1; $i = 1000){
$str = $einer[floor($z / 1000)].'tausend';
$z %= 1000;
}
if($z >= 100){
$str.= str_replace('eins', 'ein', $einer[floor($z / 100)]).'hundert';
$z %= 100;
}
if($z >= 10){
if($z < 20){
echo $str.str_replace(array('einszehn', 'zweizehn', 'sieben'), array('elf', 'zwölf', 'sieb'), $einer[floor($z % 10)].'zehn')."";
continue;
}
$tmp = str_replace(array('einszig', 'zwei', 'dreizig', 'sieben'), array('zehn', 'zwan', 'dreißig', 'sieb'), $einer[floor($z / 10)].'zig');
if(($z %= 10) > 0){
echo $str.str_replace('eins', 'ein', $einer[$z])."und".$tmp."";
continue;
}
$str.= $tmp;
}
if($z > 0){
$str.= $einer[$z];
}
echo $str."";
}
?>
Philip
21 Dez 10 at 18:10
arg, gibts hier nen code-tag? Damit keine Zeichen verschluckt werden?
Philip
21 Dez 10 at 18:12
Blubber hat vergessen die siebzehn (nicht siebenzehn) zu beachten.
Anfangs hatte ich es mir einfacher vorgestellt.
Hat dann doch 10 Minuten gedauert.
19 Zeilen:
$_e = array(”, ‘ein’, ‘zwei’, ‘drei’, ‘vier’, ‘fünf’, ‘sechs’, ‘sieben’, ‘acht’, ‘neun’);
$_z = array(”, ‘zehn’, ‘zwanzig’, ‘dreißig’, ‘vierzig’, ‘fünfzig’, ‘sechsig’, ‘siebzig’, ‘achzig’, ‘neunzig’);
for ( $i=1; $i<=9999; $i++ ) {
list($t,$h,$z,$e) = explode('.', sprintf("%d.%d.%d.%d",$i/1000%10,$i/100%10,$i/10%10,$i/1%10));
if ($t) $x .= $_e[$t].'tausend';
if ($h) $x .= $_e[$h].'hundert';
if ($z1 : $x .= $_e[$e].’und’;
case $z>1 : $x .= $_z[$z]; break;
case $e==1 : $x .= ‘elf’; break;
case $e==2 : $x .= ‘zwölf’; break;
case $e==7 : $x .= ‘siebzehn’; break;
default : $x .= $_e[$e].’zehn’; break;
}
echo “$x\n”; $x=”;
}
echo ‘zehntausend’; #;)
Eric
21 Dez 10 at 18:24
@Philip: Normalerweise ist es <code>…</code>
Michael Kliewe
21 Dez 10 at 18:25
Die Aufgabenstellung geht ja tendenziell in Richtung Codegolf . Leider ist die Seite aktuell meist down.
Benjamin Zikarsky
21 Dez 10 at 18:25
Schön ist anders aber 37 Zeilen:
“.toWord($number).”\n”;
}
function toWord($number, $zehnerstelle = false) {
var_dump($number);
if($number > 999) {
return toWord((int)($number / 1000)).”tausend”.toWord($number % 1000);
}
if($number > 99) {
return toWord((int)($number / 100)).”hundert”.toWord($number % 100);
}
if($number > 19) {
if($number % 10) {
return toWord($number % 10).”und”.toWord((int)($number / 10), true).”zig”;
}
return toWord((int)($number / 10), true).”zig”;
}
switch($number) {
case 0: return “”;
case 1: return “ein”;
case 2: return $zehnerstelle ? “zwan” : “zwei”;
case 3: return $zehnerstelle ? “dreiß” : “drei”;
case 4: return “vier”;
case 5: return “fünf”;
case 6: return “sechs”;
case 7: return “sieben”;
case 8: return “acht”;
case 9: return “neun”;
case 10: return “zehn”;
case 11: return “elf”;
case 12: return “zwoelf”;
default: return toWord($number – 10).”zehn”;
}
}
Edo
21 Dez 10 at 18:26
Gemeines Blog mag die spitze klammer nicht. Die ersten 5 zeilen nochmal
SPITZE-KLAMMER?php
foreach(range(1,10000) as $number) {
echo “$number: “.toWord($number).”\n”;
}
Edo
21 Dez 10 at 18:27
Hier noch einmal ohne Zeichenverschluckmonster.
http://triff-chemnitz.de/10000.txt
Eric
21 Dez 10 at 18:29
Wo Eric recht hat. Warum past ich das auch hier rein
d’oh
http://pastebin.com/mbf2agCi
Edo
21 Dez 10 at 18:36
Hier nochmal in schön:
http://sabel.bluegfx.de/nopaste/fd3d3396167f9e097265b13401ab834f/
Philip
21 Dez 10 at 18:48
60 Zeilen in einer Klasse und 10 Minuten Arbeit
http://sandbox.benedict-etzel.de/numbers/source.txt
Live unter http://sandbox.benedict-etzel.de/numbers/
B_E
21 Dez 10 at 18:48
Knapp 200 Zeilen bei großzügiger Formatierung, ein paar Kommentaren, nem Codeheader und dem Beispiel.
Bekommt man mit Gewalt aber sicher noch wesentlich kleiner.
Hab die Ausgabe mal grob überflogen, sah im großen und ganzen richtig aus.
Code + Ausgabe:
http://s-db.de/num_to_text.php
Dominik Bonsch
21 Dez 10 at 19:16
class Zahl {
private static $einer = array(”, ‘ein’, ‘zwei’, ‘drei’, ‘vier’, ‘fünf’, ‘sechs’, ‘sieben’, ‘acht’, ‘neun’);
private static $zehner = array(1=>’zehn’, ‘zwanzig’, ‘dreissig’, ‘vierzig’, ‘fünfzig’, ‘sechzig’, ‘siebzig’, ‘achtzig’, ‘neunzig’);
private static $sonderfaelle = array(10=>’zehn’, ‘elf’, ‘zwölf’, ‘dreizehn’, ‘vierzehn’, ‘fünfzehn’, ‘sechzehn’, ‘siebzehn’, ‘achtzehn’, ‘neunzehn’);
public static function alsZahl($zahl, $zehner = false) {
if($zahl > 10000 || $zahl 999) {
return self::$einer[floor($zahl/1000)].’tausend’.self::alsZahl($zahl % 1000);
}
elseif($zahl > 99) {
return self::$einer[floor($zahl/100)].’hundert’.self::alsZahl($zahl % 100);
}
elseif($zahl > 19) {
return self::alsZahl($zahl%10, true).($zahl%10?’und’:”).self::$zehner[floor($zahl/10)];
}
elseif($zahl > 9) {
return self::$sonderfaelle[$zahl];
}
elseif($zahl == 1) {
return ‘ein’.($zehner?”:’s');
}
else {
return self::$einer[$zahl];
}
}
}
echo ”;
for($i=1; $i<10001; ++$i) printf("% 5d : %s\n", $i, Zahl::alsZahl($i));
echo '’;
ChrisB
21 Dez 10 at 19:27
@Michael: Für solche Wettbewerbe solltest du vielleicht nächstes Mal im voraus sicherstellen, dass man Code posten kann, ohne dass dieser von WordPress verunstaltet wird …
ChrisB
21 Dez 10 at 19:30
So, hier meine Version auch noch mal auf http://pastebin.com/7Nz5fFb9
ChrisB
21 Dez 10 at 19:34
Oder man nimmt einfach einen Gist. Dann können auch andere herumexperimentieren.
Benjamin Zikarsky
21 Dez 10 at 19:45
Oder man nutzt direkt einen pasteservice. Gist würde sich da sogar relativ gut für machen, da kann man noch nachträglich korrigieren.^^
Flyingmana
21 Dez 10 at 19:58
Sehr schön. Solche Aufgaben sollten eindeutig häufiger gestellt werden.
Meine deklarative Lösung findet ihr auf http://pastebin.com/k31ANGdn.
Andre
21 Dez 10 at 20:10
Whao, so viele schon, muss ich gleich erstmal ein paar durchprobieren.
@B_E: Bei deiner Lösung sind Fehler drin, siehe
sechundzwanzig
siebundzwanzig
Michael Kliewe
21 Dez 10 at 20:44
Auch mal eine Lösung von mir, die vollkommen auf Kürze getrimmt ist, und das der Lesbarkeit und deprecated Fehlern opfert. Umlaute sind aktuell durch [uoa]e und ß durch sz maskiert, wobei ich zweiteres nicht explizit ausnutze um noch ein paar Zeichen zu sparen. (dreiSZIG wäre sonst (zwan-, vier-, fünfZIG usw kompatibel
)
Spezialfälle sollten alle berücksichtigt werden, also elf, zwoelf undein/eins, sech/sechs, sieb/sieben und.
Funktionieren sollte es bis auschließlich 999’999’999.
Benjamin Zikarsky
21 Dez 10 at 21:51
Glatt den Link vergessen: https://gist.github.com/750568
Benjamin Zikarsky
21 Dez 10 at 21:51
Schönes Thema. So etwas habe ich vor einiger Zeit mal benötigt. Die Größe der Klasse ist nicht zu vergleichen mit den bisher gezeigten Lösungen
Lang ists her.
http://pastebin.com/XyXJ8VK9
um die 10000 anzeigen zu lassen müsste man bei mir eine Schleife ausgeben, da die Klasse nur für Einzelausgaben ausgelegt war. In etwa
$n2w = new NumberToWord;
echo '';
for($i = 1; $i setNumber($i);
echo $n2w->getWord() . '';
}
echo '';
André
21 Dez 10 at 23:06
Örks.. Code zerissen.
http://pastebin.com/La5gLKVd (für die Nutzung der Klasse)
André
21 Dez 10 at 23:07
Habt ihr Tipps für mich was ich in WordPress einstellen muss damit hier vernünftig Code gepostet werden kann in den Kommentaren?
Michael Kliewe
21 Dez 10 at 23:11
Jetzt mal noch den unleserlich-kurzen Algorithmus in einer OO-Version: https://gist.github.com/750787
Benjamin Zikarsky
22 Dez 10 at 00:17
So,
habe mich auf der Heimfahrt auch mal probiert und danach die Ergebnisse mit den anderen Lösungen hier verglichen.
Lösung 1: Fortlaufende Sequenz
https://github.com/rodneyrehm/counting/blob/master/codes/globe.php
Lösung 2: Random Access
https://github.com/rodneyrehm/counting/blob/master/codes/globe2.php
Test der bisherigen Lösungen:
https://github.com/rodneyrehm/counting#readme
Grüße,
Rod
Rodney Rehm
22 Dez 10 at 01:10
Ich glaube, jetzt habe ich alle Fehler raus…
Hier meine Lösung: https://github.com/MKuckert/wordednumbers/blob/master/wordednumbers.php
Ich habe versucht, die eigentliche Logik so zu abstrahieren, dass die Namen der Ziffern über verschiedene Locales angepasst werden können. Als Beispiel liegt das deutsche und englische Locale bei.
Martin Kuckert
22 Dez 10 at 09:44
@ Martin: Interessante Idee, auch an die Lokalisierung zu denken!
…kam schon jemand auf die Idee seinen Code auch noch testbar zu gestalten?
Igor
22 Dez 10 at 10:09
Hier mal meine Lösung in Javscript.
Sollte aber genausogut auf PHP anwendbar sein …
https://gist.github.com/751313
Markus Gutbrod
22 Dez 10 at 10:36
Ich habe mal noch die Fehler entfernt, die Performance leicht erhöht und ein paar Zeichen weniger genutzt.
https://gist.github.com/751336
Das Ergebnis ist:
http://www.triff-chemnitz.de/10000.php
Eric
22 Dez 10 at 11:19
@Rodney: Wegen deines Hinweises bzgl split und explode. Das ist mir schon bewusst, aber split (5) hat weniger Buchstaben als explode (7).
Wobei man das erste split() durch ein array(0,0,2=>’zwan’,3=>’dreißig’) ersetzen kann, das ist genauso lang, und performanter.
Du scheinst mir aber ohnehin eine falsche (die initiale) Version erwischt zu haben, die aktuelle ist noch ein paar Zeichen kürzer, und macht auch die Fehler nicht mehr.
Benjamin Zikarsky
22 Dez 10 at 12:03
ich hab auch nochmal ein Fehler ausgebessert und den Code um 50% gekürzt:
https://gist.github.com/751394
Blubber
22 Dez 10 at 12:10
Eine letzte Variante:
https://github.com/bzikarsky/counting/blob/master/codes/benjamin3.php
Laut Rodneys Test die aktuell schnellste Implementierung, und relativ kurz gehalten.
Benjamin Zikarsky
22 Dez 10 at 14:54
Da bin ich ja noch richtig lang mit meinen 57 Zeilen und 23 Minuten o.O
http://pastebin.com/xaLU0Vck
Nick
23 Dez 10 at 11:51
Die Auswerung wurde nun auch um Nicks Lösung ergänzt.
Michael: Werden die verschiedenen Lösungen noch irgendwie analysiert?
Rodney Rehm
26 Dez 10 at 12:17
@Rodney: ich finde deine Analyse schon sehr gut und ausreichend, hatte nicht vor da noch was hinzuzufügen, ich versuche lieber neue Artikel zu schreiben wenn es die Zeit erlaubt
Michael Kliewe
27 Dez 10 at 09:22
Ich denke, man könnte schon noch den einen oder anderen Absatz dazu schreiben. Evtl. auch auf “falsche” Aussagen des ursprünglichen Artikels eingehen, denn z.B. haben wir sehr wohl relativ große Laufzeit- und Speicher-Unterschiede, die von der Implementierung abhängen. Beispielsweise tauscht Rodneys “globe” Speicher gegen Geschwindigkeit ein, wenn er die Ergebnisse zwischenspeichert.
Das Thema taugt fast als Einstieg in ein paar PHP Performance-Eigenheiten im Micro-Optimierungsbereich, wie echo “.” vs “,”, bzw. das langsame String-Zusammenfügen, oder auch der langsame Array-Aufbau.
Ich habe mal testweise “benjamin3″ als Funktion umgeformt (allerdings ohne Rekursion wie in “benjamin”), da geht der Löwenanteil an den Array-Aufbau verloren. Wenn man das herausnimmt, und beispielsweise als Funktionsparameter übergibt, wird die Geschichte signifikantt schneller.
Benjamin Zikarsky
27 Dez 10 at 12:10
Ich sehe das so wie Benjamin. Die meisten der eingereichten Lösungen haben (teilweise signifikante) Probleme. Mit dem enormen Speicherverbrauch meiner Lösungen schließe ich mich da gerne mit ein…
Benjamin bekommt ein (für Initiative).
Rodney Rehm
27 Dez 10 at 12:18
67 Zeilen, aber lesbar:
“eins”,
10 => “zehn”,
11 => “elf”,
12 => “zwölf”,
16 => “sechzehn”,
17 => “siebzehn”,
20 => “zwanzig”,
30 => “dreißig”,
60 => “sechzig”,
70 => “siebzig”,
);
$digits = array(
1 => “ein”,
2 => “zwei”,
3 => “drei”,
4 => “vier”,
5 => “fünf”,
6 => “sechs”,
7 => “sieben”,
8 => “acht”,
9 => “neun”,
);
for ($i=1; $i 0; $iSixDigits = floor($iSixDigits / 1000))
{
$iThreeDigits = $iSixDigits % 1000;
$iTwoDigits = $iThreeDigits % 100;
$lastDigit = $iTwoDigits % 10;
$sThreeDigits = “”;
if ($lastDigit > 0 && !array_key_exists($iTwoDigits, $specials))
{
$sThreeDigits = $digits[$lastDigit];
$iTwoDigits -= $lastDigit;
if ($iTwoDigits >= 20)
{
$sThreeDigits .= “und”;
}
}
if (array_key_exists($iTwoDigits, $specials))
{
$sThreeDigits .= $specials[$iTwoDigits];
}
elseif ($iTwoDigits > 0)
{
$sThreeDigits .= $digits[$iTwoDigits / 10] . “zig”;
}
$hundreds = floor($iThreeDigits / 100);
if ($hundreds > 0)
{
$sThreeDigits = $digits[$hundreds] . “hundert” . $sThreeDigits;
}
array_unshift($sSixDigits, $sThreeDigits);
}
echo implode(“tausend”, $sSixDigits) . “\n”;
}
?>
Carsten Milkau
31 Dez 10 at 15:51
hopefully more readable:
<?php
$specials = array(
1 => "eins",
10 => "zehn",
11 => "elf",
12 => "zwölf",
16 => "sechzehn",
17 => "siebzehn",
20 => "zwanzig",
30 => "dreißig",
60 => "sechzig",
70 => "siebzig",
);
$digits = array(
1 => "ein",
2 => "zwei",
3 => "drei",
4 => "vier",
5 => "fünf",
6 => "sechs",
7 => "sieben",
8 => "acht",
9 => "neun",
);
for ($i=1; $i<=10000; $i++)
{
$sSixDigits = array();
for ($iSixDigits = $i % 1000000; $iSixDigits > 0; $iSixDigits = floor($iSixDigits / 1000))
{
$iThreeDigits = $iSixDigits % 1000;
$iTwoDigits = $iThreeDigits % 100;
$lastDigit = $iTwoDigits % 10;
$sThreeDigits = "";
if ($lastDigit > 0 && !array_key_exists($iTwoDigits, $specials))
{
$sThreeDigits = $digits[$lastDigit];
$iTwoDigits -= $lastDigit;
if ($iTwoDigits >= 20)
{
$sThreeDigits .= "und";
}
}
if (array_key_exists($iTwoDigits, $specials))
{
$sThreeDigits .= $specials[$iTwoDigits];
}
elseif ($iTwoDigits > 0)
{
$sThreeDigits .= $digits[$iTwoDigits / 10] . "zig";
}
$hundreds = floor($iThreeDigits / 100);
if ($hundreds > 0)
{
$sThreeDigits = $digits[$hundreds] . "hundert" . $sThreeDigits;
}
array_unshift($sSixDigits, $sThreeDigits);
}
echo implode("tausend", $sSixDigits) . "\n";
}
?>
Carsten Milkau
31 Dez 10 at 15:59
17 lines, a lot less readable: (how do I get it correctly formatted in this blog??)
<?php$fx="explode";
$T=$fx(" "," ein zwei drei vier fünf sechs sieben acht neun zehn elf zwölf zig hundert tausend sech sieb ßig und zwan \n s");
$S=$fx(" ",'19,0,13,/ 0,1[49],/ 1,13/10 19,10/10 1,10/11 2,10/12 ([67]),(1[03])/1\1,\2 2,13/20,13 3,13/3,18 1,21/1,22,21 0,15,/');
for($i=1;$i<=10000;$i++)
{
$N=str_split(sprintf("%05d",$i));
$N="0,{$N[1]},19,{$N[0]},13,15,{$N[2]},14,{$N[4]},19,{$N[3]},13,21";
foreach ($S as $R)
{
list($P,$Q)=$fx("/",$R);
$N=preg_replace("/\b$P\b/",$Q,$N);
}
foreach($fx(",",$N) as $D)
echo $T[$D];
}
?>
Carsten Milkau
31 Dez 10 at 16:03
$ php test.php carsten run
carsten
0.3112
332.73
1021.32
1171
1000, 1001, 1016
Deine Implementierung macht noch Fehler bei “eintausend”. Aktuell kommt noch “einstausend” heraus
Benjamin Zikarsky
31 Dez 10 at 16:05
@Carsten: Am besten gist, pastie oder sowas benutzen, ich habe keine Ahnung wie ich WordPress beibringe Code in Kommentaren korrekt anzuzeigen.
Michael Kliewe
31 Dez 10 at 16:09
Deine 2. Implementierung (die kurze) läuft fehlerfrei ist dafür aber danke RegExp auch sehr langsam. Ergebnisse laut Rodneys Test:
approach | time | memory | peak | characters | errors
———|——–|——–|———|————|——–
carsten2 | 1.2738 | 332.96 | 1022.95 | 535 | -
carsten | 0.3123 | 332.73 | 1021.44 | 1171 | 1000, 1001, 1016
Benjamin Zikarsky
31 Dez 10 at 16:11
echo ‘eins’;
echo ‘zwei’;
echo ‘drei’;
echo ‘vier’;
echo ‘sechs’;
echo ‘sieben’;
echo ‘acht’;
echo ‘neun’;
echo ‘zehn’;
echo ‘elf’;
…
Chris
2 Jan 11 at 07:54
[...] Kliewe hatte vor einiger Zeit erneut zu einem Wettbewerb aufgerufen. Diesmal galt es die Zahlen von 1 bis 10.000 als Zahlworte auszugeben. Relativ schnell kamen dann [...]
Zahlen-Zahlen-Zahlen – Yoda Condition
7 Jan 11 at 01:07
Auf vielfachen Wunsch
und sehr verspätet hier noch ein Lösungsansatz. Die Klasse kann Zahlen bis zu 999 Quindezilliarden (999 gefolgt von 93 Stellen) umwandeln.
Ich habe einfach ohne Konzept oder Planung angefangen, erstes Ziel war halt das es funktioniert. Der Kern sind die beiden Methoden _toWord() und _numGroups(). Da steckt mit Sicherheit noch viel Optimierungspotenzial drin.
Nächstes Ziel soll sein, dass man die Klasse für beliebige Sprachen (Englisch, Französisch, Spanisch, usw) anpassen kann. Dazu müsste man lediglich die Methoden _toWord() und _numGroups(), sowie halt die Zahlennamen austauschen.
http://pastebin.com/R9vZB8cQ
Ralf
15 Jan 11 at 10:24
[...] Fahrradschloss hebt Drahtesel in luftige und sichere Höhe am Laternenpfahl – Engadget German Wettbewerb: 10.000 Zahlen ausschreiben | PHP Gangsta – Der PHP Blog WordPress: Mit PHP und XML-RPC bloggen | felixtriller.de Weiße Flecken auf Schloss Montabaur [...]
Linkliste 21 at Random People
30 Jan 11 at 06:05
<?php
$namen = array('null','ein','zwei','drei','vier',utf8_decode('fünf'),'sechs','sieben','acht','neun','zehn','elf',utf8_decode('zwölf'));
for ($i=1; $i=1000) $myNumber.= $namen[intval(substr($number,0,-3))].'tausend';
if(intval($number) >=100 && intval(substr($number,-3)) > 0)$myNumber.= $namen[intval(substr($number,-3,1))].'hundert';
while (strlen($number) >2) $number=substr($number,1);
$myNumber .= (intval($number) <= 12)?($namen[intval($number)]):(($number<20)?(substr($namen[intval(substr($number,1,1))],0,4).'zehn'):(($number == 20)?('zwanzig'):(($number < 30)?($namen[intval(substr($number,1,1))].'undzwanzig'):(($number 29)?((intval($number)<40)?('ssig'):('zig')):('');
if(substr($myNumber,-4) == "null") $myNumber = substr($myNumber,0,-4);
if(substr($myNumber,-3) == "ein") $myNumber.= 's';
echo ''.ucfirst(utf8_encode($myNumber));
}
?>
maybe
12 Jan 12 at 16:19
15 Zeilen mit “”. Vergessen hinzuschreiben
maybe
12 Jan 12 at 16:20