JavaScript Funktion – Zahl in Worten / Zahlwort (v1)

Hin und wieder benötigt man eine ausgeschriebene Zahl. Für einige Sprachen gibt es dafür vorgefertigte Funktionen, die man nur aufrufen muss, für viele andere findet man passenden Code im Netz, aber für JavaScript hab ich auf die Schnelle nichts gefunden, was fehlerfrei arbeitet und ohne Unterfunktion auskommt. Daher hab ich mir selbst eine geschrieben, welche die Zahlen von 0 bis 999.999.999 verarbeiten kann.

Das geht sicher auch kürzer und eleganter, erfüllt aber erstmal seinen Zweck, daher v1. Werde mich aber nochmal dran setzen, und eine kürzere Version mit Schleife scheiben, die dann auch nach oben hin mehr oder weniger offen ist. Das wird dann v2 und bekommt nochmal einen neuen Beitrag.

function zahlwort(zahl) {

  var zahlinworten = "";
  
  var sonderzahlen = [];
  sonderzahlen[0] = 'null';
  sonderzahlen[1] = 'eins';
  sonderzahlen[11] = 'elf';
  sonderzahlen[12] = 'zwölf';
  sonderzahlen[16] = 'sechzehn';
  sonderzahlen[17] = 'siebzehn';

  var zahlen = [];
  zahlen[0] = 'null';
  zahlen[1] = 'ein';
  zahlen[2] = 'zwei';
  zahlen[3] = 'drei';
  zahlen[4] = 'vier';
  zahlen[5] = 'fünf';
  zahlen[6] = 'sechs';
  zahlen[7] = 'sieben';
  zahlen[8] = 'acht';
  zahlen[9] = 'neun';
  zahlen[10] = 'zehn';
  zahlen[20] = 'zwanzig';
  zahlen[30] = 'dreißig';
  zahlen[40] = 'vierzig';
  zahlen[50] = 'fünfzig';
  zahlen[60] = 'sechzig';
  zahlen[70] = 'siebzig';
  zahlen[80] = 'achtzig';
  zahlen[90] = 'neunzig';
  
  var million = ((zahl % 1000000000) - (zahl % 1000000)) / 1000000;
  var tausend = ((zahl % 1000000) - (zahl % 1000)) / 1000;
  var weniger = zahl % 1000;
  var hunderter;
  var zehn;
  var einer;

  if(zahl==0||zahl=="") {
    zahlinworten = "null";
    return zahlinworten;
  }

  if(zahl>=1000000000) {
    zahlinworten = "nicht unterstützt";
    return zahlinworten;
  }
  
  if(million>0) {
    hunderter = ((zahl % 1000000000) - (zahl % 100000000)) / 100000000;
    zehn = ((zahl % 100000000) - (zahl % 1000000)) / 1000000;
    einer = ((zahl % 10000000) - (zahl % 1000000)) / 1000000;
 
    if(hunderter>0)
      zahlinworten += zahlen[hunderter] + "hundert";
    if(zehn>0) {
      if(zehn==1)
        zahlinworten += "eine Million ";
      else if(sonderzahlen[zehn]) {
        zahlinworten += sonderzahlen[zehn];
        zahlinworten += " Millionen ";
      }
      else {
        if(einer>0)
          zahlinworten += zahlen[einer];
        if(zehn>20)
          zahlinworten += "und";
        if(zehn>9)
          zahlinworten += zahlen[zehn-einer];
        zahlinworten += " Millionen ";
      }
    }
  }

  if(tausend>0) {
    hunderter = ((zahl % 1000000) - (zahl % 100000)) / 100000;
    zehn = ((zahl % 100000) - (zahl % 1000)) / 1000;
    einer = ((zahl % 10000) - (zahl % 1000)) / 1000;
 
    if(hunderter>0)
      zahlinworten += zahlen[hunderter] + "hundert";
    if(zehn>0) {
      if(zehn==1)
        zahlinworten += "ein";
      else if(sonderzahlen[zehn])
        zahlinworten += sonderzahlen[zehn];
      else {
        if(einer>0)
          zahlinworten += zahlen[einer];
        if(zehn>20)
          zahlinworten += "und";
        if(zehn>9)
          zahlinworten += zahlen[zehn-einer];
      }
    }
    zahlinworten += "tausend";
  }

  if(weniger>0) {
    hunderter = ((zahl % 1000) - (zahl % 100)) / 100;
    zehn = zahl % 100;
    einer = zahl % 10;
    
    if(hunderter>0)
      zahlinworten += zahlen[hunderter] + "hundert";
    if(zehn>0) {
      if(sonderzahlen[zehn])
        zahlinworten += sonderzahlen[zehn];
      else {
        if(einer>0)
          zahlinworten += zahlen[einer];
        if(zehn>20)
          zahlinworten += "und";
        if(zehn>9)
          zahlinworten += zahlen[zehn-einer];
      }
    }
  }

  return zahlinworten;
}