www

ein Webangebot von rotering-net.de

PHP-Skript: Zahl in Zahlwort umwandeln

Mit Hilfe der hier vorgestellten Funktion kann eine beliebige Ganzzahl (positiv oder negativ) in ein Zahlwort deutscher Sprache umgewandelt werden.

Syntax

string num2text (int $pNumber)

$pNumber
Eine Ganzzahl (positiv oder negativ), die in ein Zahlwort umgewandelt werden soll.

Skript

define('NUMERAL_SIGN', 'minus'); define('NUMERAL_HUNDREDS_SUFFIX', 'hundert'); define('NUMERAL_TENNER_SUFFIX', 'zig'); define('NUMERAL_INFIX', 'und'); $numeral = array('null', 'ein', 'zwei', 'drei', 'vier', 'fünf', 'sechs', 'sieben', 'acht', 'neun', 'zehn', 'elf', 'zwölf', 'drei~', 'vier~', 'fünf~', 'sech~', 'sieb~', 'acht~', 'neun~'); $tenner = array('', '', 'zwan~', 'dreißig', 'vier~', 'fünf~', 'sech~', 'sieb~', 'acht~', 'neun~'); $group_suffix[0][0] = ''; $group_suffix[0][1] = ''; $group_suffix[1][0] = 'tausend '; $group_suffix[1][1] = 'tausend '; $group_suffix[2][0] = 'e Million '; $group_suffix[2][1] = ' Millionen '; $group_suffix[3][0] = 'e Milliarde '; $group_suffix[3][1] = ' Milliarden '; function num2text ($number) { global $numeral; $prefix = ''; if ($number == 0) return $numeral[0]; // null if ($number < 0) $prefix = NUMERAL_SIGN . ' '; // minus … return $prefix . num2text_group(abs($number)); } function num2text_group ($number, $group_level = 0) { global $numeral, $tenner, $group_suffix; // Ende der Rekursion erreicht, wenn Zahl gleich Null if ($number == 0) return ''; // Zahlengruppe dieser Runde bestimmen $group_number = $number % 1000; if ($group_number == 1) { // Zahl der Gruppe ist Eins $res = $numeral[1] . $group_suffix[$group_level][0]; // eine Milliarde } elseif ($group_number > 1) { // Zahlwort der Hunderter $fst_digit = floor($group_number / 100); if ($fst_digit) $res = $numeral[$fst_digit] . NUMERAL_HUNDREDS_SUFFIX; // fünfhundert else $res = ''; // Zahlwort der Zehner und Einer $lst_digits = $group_number % 100; $snd_digit = floor($lst_digits / 10); $trd_digit = $lst_digits % 10; if ($lst_digits == 0) $res .= ''; // null elseif ($lst_digits == 1) $res .= $numeral[1] . 's'; // eins elseif ($lst_digits <= 19) $res .= str_replace('~', $numeral[10], $numeral[$lst_digits]); // dreizehn else { if ($trd_digit) $res .= $numeral[$trd_digit] . NUMERAL_INFIX; // sechsund… $res .= str_replace('~', NUMERAL_TENNER_SUFFIX, $tenner[$snd_digit]); // (…)achtzig } // Suffix anhängen $res .= $group_suffix[$group_level][1]; // Millionen } // Nächste Gruppe auswerten und Zahlwort zurückgeben $number = floor($number / 1000); $group_level++; return num2text_group($number, $group_level) . $res; }

Erläuterungen

In der eigentlichen Funktion num2text() leisten wir erstmal nur einige Vorarbeit. Ist die Zahl 0, so können wir unmittelbar „null“ zurückgeben und sind bereits fertig. Ist die Zahl negativ, so setzen wir „minus“ vor die Zahl und fahren dann mit dem Betrag der Zahl fort. Nun rufen wir die Funktion num2text_group auf, welche mittels einer Rekursion die Umwandlung einer positiven Zahl in ein Zahlwort vornimmt.

Nun müssen wir uns darüber Gedanken machen, wie ein Zahlwort im Deutschen aufgebaut ist. Neben allen Unregelmäßigkeiten finden wir doch einige grundlegende Regeln. So wie wir eine Zahl mit Punkten oder Abständen in Dreiergruppen unterteilen, so wird auch beim Zahlwort jede Dreiergruppe separat gesprochen und mit einem Suffix versehen, welches angibt, um welche Dreiergruppe es sich handelt: einhundertfünfzehn-Millionen | siebenhundertfünfundvierzig-tausend | zweihundertdreizehn. Unsere Rekursion wird daher von hinten jede Dreiergruppe durchlaufen und getrennt bearbeiten. Damit wir wissen, in welcher Dreiergruppe wir uns gerade befinden, wird die Variable $group_level bei jedem Durchlauf eins hochgezählt.

Wir beginnen unsere Funktion num2text damit, indem wir prüfen, ob die übergebene Zahl gleich 0 ist. Da wir nach jeder Abarbeitung einer Dreiergruppe diese aus der Zahl entfernen, ist die komplette Zahl abgearbeitet, wenn 0 zurückbleibt. Dadurch haben wir eine geeignete Abbruchbedingung für unsere Rekursion. Sind dagegen noch Stellen abzuarbeiten, extrahieren wir die letzten drei aus der Zahl, was wir mit einer Modulo-1000-Rechnung erreichen.

Nun gibt es drei Fälle. Fall 1: Die komplette Dreiergruppe enthält nur Nullen, ist also gleich 0. In diesem Fall brauchen wir in diesem Schritt gar nichts tun, da diese Dreiergruppe überhaupt nicht gesprochen wird. Fall 2: Die Dreiergruppe ist genau 1. Diesen Fall müssen wir getrennt betrachten, da unter Umständen die grammatikalische Form von Zahlwort und Suffix angepasst werden muss. Daher gibt es auch in den obigen Defintionen eine getrennte Angabe für diesen Fall. Es heißt beispielsweise „eintausend“ oder „zweitausend“, aber „eine Million“ oder „zwei Millionen“. Fall 3 umfasst dann alle Zahlen größer 1, die sich nun regelmäßig ergeben.

Die Sprechabfolge der Ziffern jeder Dreiergruppe ist im Deutschen nun: 1. Ziffer, 3. Ziffer, 2. Ziffer. Die erste Ziffer erhalten wir mittels Teilen durch 100 und anschließendem abrunden. Wir wählen das entsprechende Zahlwort für die Ziffer und hängen das Suffix „hundert“ an. Bei der 2. und 3. Ziffer gibt es nun wiederum diverse Sonderfälle zu betrachten. Daher bestimmen wir neben den einzelnen Ziffern die zusammengesetzte Zahl beider ($lst_digits), mit der wir eine Fallunterscheidung führen.

Fall 1: Die Zahl ist gleich 0. Hier müssen wir wieder nichts ausgeben. Fall 2: Die Zahl ist gleich 1. In diesem Fall muss nur die grammatikalische Form durch Anhängen eines „s“ angepasst werden. Fall 3: Die Zahl ist kleiner 19. In diesem Zahlbereich gibt es so viele Unregelmäßigkeiten, dass wir bereits oben alle Ziffernpaare vordefiniert haben. Ob man das „zehn“-Suffix direkt anhängt oder wie hier generiert, bleibt dem eigenen Geschmack überlassen. Fall 4: Bei allen übrigen Zahlen wird zunächst die 3. Ziffer ausgegeben, sofern diese vorhanden ist, und ein „und“-Infix angefügt. Anschließend wird die Zehnerstelle wegen erneuter Unregelmäßigkeiten aus einer separaten Definitionstabelle abgelesen.

Abschließend hängen wir das reguläre Dreiergruppen-Suffix an. Nun entfernen wir aus der Originalzahl die letzten drei Ziffern indem wir durch 1000 teilen und abrunden. Das fertige Zahlwort ist nun das Zahlwort aus den verbleibenen Ziffern und dem eben bestimmten Zahlwort dieser Dreiergruppe. Der Rest ergibt sich nun über Rekursion.