Frank Schönmann: Zahlen in Text umwandeln: Korrigierte Fassung

Beitrag lesen

hi!

Hier die korrigierte Version, die auch die von Boris gemeldeten Fehler beseitigt. Und sie ist immer noch kürzer als Cheatahs Metode ;-))

Das Problem mit der grundlosen Angabe der "tausend" trat übrigens auch bei Millionen und allen weiteren folgenden Werten auf, und zwar immer, wenn dieser Dreierblock eigentlich 000 war. Hm, verständlich? ;)

#!/usr/bin/perl

@einer = ("", "ein", "zwei", "drei", "vier", "fünf", "sech", "sieben", "acht", "neun");
@eeiner = ("", "eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun");
@zeiner = ("zehn", "elf", "zwölf", "dreizehn", "vierzehn", "fünfzehn", "sechzehn", "siebzehn", "achtzehn", "neunzehn");
@heiner = ("", "ein", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun");
@zehner = ("", "zehn", "zwanzig", "dreißig", "vierzig", "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig");
@namen = ("", "tausend ", " Millionen ", " Milliarden ", " Billionen ", " Billiarden ", " Trillionen ", " Trilliarden ",
  " Quadrillionen ", " Quadrilliarden ", " Quintillionen ", "Quintilliarden ");

for (reverse split /-/, &teilen3(shift))
{
  my $string;
  ($ein, $zehn, $hun) = reverse split /-/, &teilen1($_);

$string = $hun ? "$heiner[$hun]hundert" : "";
  if ($zehn > 1)
  {
    $string .= $ein ? "$einer[$ein]und$zehner[$zehn]" : "$zehner[$zehn]";
  }
  if ($zehn == 1)
  {
    $string .= "$zeiner[$ein]";
  }
  if ($zehn < 1)
  {
    $string .= "$eeiner[$ein]";
  }
  push @teile, $string;
}

for (@teile)
{
  if($_)
  {
    $string = $_ . $namen[$i] . $string;
  }
  $i++;
}

print $string;

sub teilen3
{
  my $text = reverse shift;
  $text =~ s/(\d\d\d)(?=\d)(?!\d*.)/$1-/g;
  return scalar reverse $text;
}

sub teilen1
{
  my $text = shift;
  $text =~ s/(\d)(\d)/$1-$2/g;
  $text =~ s/(\d)(\d)/$1-$2/g;
  return $text;
}