JavaScript Funktion – Zahl in Worten / Zahlwort (v2)

So, hier nun Version 2. Etwas schlanker und wie angekündigt nach oben offen, zumindest theoretisch. JavaScript verarbeitet Zahlen als 64 Bit Gleitkommazahl, womit die maximale Größe bei 253 = 9.007.199.254.740.992 liegt.

Das Array einheiten ist daher nur bis Billion gepflegt, sofern größere Zahlen ausgeschrieben werden sollen, muss das Array entsprechend erweitert und eine Möglichkeit geschaffen werden, diese größeren Zahlen auch korrekt verarbeiten bzw. speichern zu lassen. Tipps dazu gibt es u.a. bei stackoverflow.

Eine Live-Version habe ich bei CodePen eingestellt.

function zahlwort(zahl) {
  
  var sonderzahlen = [];
  sonderzahlen[11] = 'elf';
  sonderzahlen[12] = 'zwölf';
  sonderzahlen[16] = 'sechzehn';
  sonderzahlen[17] = 'siebzehn';

  var zahlen = [];
  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 einheiten = ['','tausend','Million','Milliarde','Billion']
  var trennschritte = 1000;
  var zahlinworten = "";

  if(zahl==0) 
    zahlinworten = "null";
  for(var i=0;i<Math.ceil(zahl.length / 3);i++) {
    if(i>einheiten.length-1)
      return "Zahl nicht unterstützt";
    if(i==0)
      zahlenblock = zahl % trennschritte;
    else
      zahlenblock = ((zahl % trennschritte) - (zahl % (trennschritte / 1000))) / (trennschritte / 1000);
    einer = zahlenblock % 10;
    zehn = zahlenblock % 100;
    hunderter = (zahlenblock - (zahlenblock % 100)) / 100;
    einheitenendung = einheiten[i].substr(einheiten[i].length-1,1);

    if(zahlenblock>0) {
      if(zahlenblock>1 && einheitenendung == "n")
        zahlinworten = " " + einheiten[i] + "en " + zahlinworten;
      else if(zahlenblock>1 && einheitenendung == "e")
        zahlinworten = " " + einheiten[i] + "n " + zahlinworten;
      else if(zahlenblock>0 && i==1)
        zahlinworten = einheiten[i] + zahlinworten;
      else
        zahlinworten = " " + einheiten[i] + " " + zahlinworten;
    }
   
    if(zehn>0) {
      if(zehn==1 && i==0)
        zahlinworten = "eins" + zahlinworten;
      else if(zehn==1 && i==1)
        zahlinworten = "ein" + zahlinworten;
      else if(zehn==1 && i>1)
        zahlinworten = "eine" + zahlinworten;
      else if(sonderzahlen[zehn])
        zahlinworten = sonderzahlen[zehn] + zahlinworten;
      else {
        if(zehn>9)
          zahlinworten = zahlen[zehn-einer] + zahlinworten;
        if(zehn>20 && einer>0)
          zahlinworten = "und" + zahlinworten;
        if(einer>0)
          zahlinworten = zahlen[einer] + zahlinworten;
      }
    }

    if(hunderter>0)
      zahlinworten = zahlen[hunderter] + "hundert" + zahlinworten;

    trennschritte *= 1000;
  }
  return zahlinworten;
}