Frank Schönmann: Zahlen in Text umwandeln

Beitrag lesen

hi!

Irgendwo weiter unten hatten wir dieses Thema. Ich habe mal versucht, ein passendes Skript zu schreiben. Anscheinend funktioniert es, ich habe schon ein bisschen damit rumprobiert. 100%-ig sicher bin ich aber noch nicht. Also füttert es mit den abwegigsten Zahlen, um es zu testen (die Null habe ich nicht eingebaut!).

Zur Bedienung:
* Aufruf auf der Kommandozeile mit der Zahl als erstem Parameter: betrag.pl 123345

Eingabe der Zahl:
* keine führenden Nullen
* keine Kommazahlen
* nicht Null
* höchstens 36 Stellen

Ok, viel Spaß, ich hoffe es funktioniert.

=== cut ===
#!/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 = ("", "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)
{
  $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;
}
=== cut ===