Der Dicki: Umwandlung von Zahlen in Text

Beitrag lesen

Hallihallo!

Ich habe mal vor einiger Zeit eine Routine geschrieben, die mir (fast) beliebig grosse Integerzahlen in einen String umwandeln. Vielleicht ist sie für Dich ja gebrauchbar:

  
function IntToString($integer) {  
   /* Wandelt alle arabischen Zahlen von "0" bis $limit in Text um */  
   include('numbers.php');  
   $index = strlen($integer)-3;  
   while ($index > 0) {  
    $integer = substr($integer,0,$index).'.'.substr($integer,$index).'';  
    $index = $index-3;  
   }  
   $blocks = explode('.',$integer);  
   $return = ''; $block_index = count($blocks)-1; $zeroes = 0;  
   if ($block_index < count($names)) {      // Nur, wenn die Zahl auch übersetzbar ist  
    foreach ($blocks as $block) {  
     $blockstring = '';  
     $hundreds = "0"; $tens = "0";  
     switch (strlen($block)) {  
      case "3" :  list($hundreds, $tens, $ones)=str_split($block);  
          break;  
      case "2" : list($tens, $ones) = str_split($block);  
          break;  
      case "1" : $ones = $block;  
          break;  
      default  :  break;  
     }  
     if ($hundreds!='' && $hundreds!='0') {  
      $blockstring .= $numerals[(int)$hundreds].$parts['after_hundreds'];  
     }  
     $blockstring .= $numerals[(int)$ones];  
     if ($tens != '' && $tens!='0') {  
      $blockstring .= $parts['before_tens'].$numerals[(int)$tens].$parts['after_tens'];  
     }  
     $blockstring .= ' ';  
     $blockstring .= $names[$block_index];  
     if ($block != "1" && $block != "01" && $block != "001" && $names[$block_index] != '' && $names[$block_index] != ' Tausend') {  
      if (substr($blockstring,-1) != 'e') $blockstring .= 'e';  
      $blockstring .= 'n';  
     }  
     $blockstring = ucfirst($blockstring);  
     $return .= $blockstring.' ';  
     $block_index--;  
    }  
    foreach ($specials as $bef => $aft) {  
     $return = str_ireplace($bef,$aft,$return);  
    }  
   } else {  
    $return = $integer;     // Die Zahl ist einfach zu groß  
   }  
   while ($integer/10 >= 1) { $zeroes++; $integer = $integer/10; }  
   $return = '<span class="number" title="Eine Zahl mit '.$zeroes.' Nullen">'.$return.'</span>';  
   return $return;  
  }  

Die Datei "numbers.php" sieht so aus:

  
 $numerals = array('null','ein','zwei','drei','vier','fünf','sechs','sieben','acht','neun');  
 $parts =  array( 'before_tens'  => 'und',  
      'after_tens'   => 'zig',  
      'after_hundreds'  => 'hundert'  
    );  
 $names = array( '',' Tausend',' Million',' Milliarde',' Billion',' Billiarde',' Trillion',' Trilliarde',' Quadrillion',' Quadrilliarde',' Quintillion',' Quintilliarde',' Sextillion',' Sextilliarde',' Septillion',' Septilliarde',' Oktillion',' Oktilliarde',' Nonillion',' Nonilliarde');  
 $specials = array( 'null ' => ' ',  
      'nullund'   => '',  
      'undeinzig'  => 'zehn',  
      'einzig'  => 'zehn',  
      'einzehn'  => 'elf',  
      'zweizehn'  => 'zwölf',  
      'sechszehn'  => 'sechzehn',  
      'siebenzehn' => 'siebzehn',  
      'zweizig'  => 'zwanzig',  
      'dreizig'  => 'dreißig',  
      'sechszig'  => 'sechzig',  
      'siebenzig'  => 'siebzig'  
 );  

Das hat für mich den Vorteil, daß ich mir um die Größe der Zahl keine Gedanken machen muss*, und daß sich das Ganze relativ leicht in andere Sprachen übersetzen lässt.

Ein grosser Nachteil ist auf der anderen Seite natürlich, daß hier wesentlich mehr Zeit verbraucht wird, als bei einem blossen Array- Auslesevorgang.

Ich fand, der Vollständigkeit halber musste ich diese Lösung einfach erwähnen.

Vielleicht habe ich an dieser Stelle ja sogar Glück, und Irgendjemand findet Möglichkeiten, wie sich die Funktion verbessern/ veredeln lässt.

Viele liebe Grüße,
Der Dicki

* Die Zahl wird dieser Funktion als String übergeben (also "1345674312" statt 1345674312), dadurch bin ich auch nicht mehr abhängig vom Wertebereich des Integertyps.