Stefan Muenz: Übersetzungsroutine

Beitrag lesen

Hallo Boris,

das ist mal wieder so ein Thread - klare Aufgabenstellung, keine klaren Antworten. Weil mich das Thema interessiert hat, hab ich mal eine Routine geschrieben, die so was macht. Leider hat sie bei Zahlen ueber 100000 noch einen Fehler, deshalb bin ich da noch nicht weitergekommen. Auch ist sie ziemlich umstaendlich programmiert - aber im Gegensatz zu den bisherigen Antworten wenigstens eine Diskussionsgrundlage <g>. Also:

#!/usr/bin/perl

Scriptname: betrag.pl

Scriptaufruf in URL-Zeile (Beispiel): http://127.0.0.1/cgi-bin/betrag.pl?71234,00

$Zahl = $ENV{'QUERY_STRING'};
$x = &Ganzzahl_in_Worten($Zahl);

Test (HTML-Output / CGI)

print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<font size=5>$Zahl = $x</font>\n";
print "</body></html>\n";

sub Ganzzahl_in_Worten
{
  @EElems = ("","eins","zwei","drei","vier","fünf","sechs","sieben","acht","neun","zehn","elf","zwölf","dreizehn","vierzehn","fünfzehn","sechzehn","siebzehn","achtzehn","neunzehn","null");
  @ZElems = ("und","ein","zwanzig","dreißig","vierzig","fünfzig","sechzig","siebzig","achtzig","neunzig","hundert");
  @PElems = ("ein","hundert","tausend","millionen");
  $Input = $_[0];
  $Input =~ s/.//g;
  ($Zahl,$Rest) = split(/,/,$Input);
  if($Zahl < 10) {
    if($Zahl == 0) {
      $Output = $EElems[-1];
      return($Output);
}
else {
      $Output = $EElems[$Zahl];
      return($Output);
}
  }
  $Output = &Zehner($Zahl);
  if($Zahl < 100) {
    return($Output);
  }
  $Hunderter = substr($Zahl,length($Zahl)-3,1);
  if($Hunderter == 1) {
    $Output = $PElems[0].$PElems[1].$Output;
  }
  else {
    $Output = $EElems[$Hunderter].$PElems[1].$Output;
  }
  if($Zahl < 1000) {
    return($Output);
  }
  if($Zahl % 1000 == 0) {
$Output = "";
  }
  if($Zahl < 10000) {
    $Tausender = substr($Zahl,length($Zahl)-4,1);
    if($Tausender == 1) {
      $Output = $PElems[0].$PElems[2].$Output;
      return($Output);
    }
    else {
      $Output = $EElems[$Tausender].$PElems[2].$Output;
      return($Output);
    }
  }
  $ZTausender = substr($Zahl,length($Zahl)-5,2);
  $Zehntausender = &Zehner($ZTausender);
  if($Zahl < 100000) {
    $Output = $Zehntausender.$PElems[2].$Output;
    return($Output);
  }
  if($Zahl < 1000000) {
    $HTausender = substr($Zahl,length($Zahl)-6,1);
    if($HTausender == 1) {
   # HIER FOLGT DER FEHLER: $Zehntausender WIRD PLOETZLICH FALSCH INTERPRETIERT
   $Output = $PElems[0].$PElems[1].$Zehntausender.$PElems[2].$Output;
      return($Output);
    }
    else {
      $Output = $EElems[$HTausender].$PElems[1].$Zehntausender.$PElems[2].$Output;
      return($Output);
    }
  }
  return($Output);
}

sub Zehner {
  $ZInput = $_[0];
  if($ZInput > 9 && $ZInput < 20) {
    $Result = $EElems[$ZInput];
return($Result);
  }
  else {
    $Einer = substr($Input,length($ZInput)-1,1);
    $Zehner = substr($Input,length($ZInput)-2,1);
    if($Einer == 1) {
      $Result = $ZElems[1].$ZElems[0].$ZElems[$Zehner];
}
    elsif($Zehner == 0) {
      $Result = $EElems[$Einer];
}
    else {
      $Result = $EElems[$Einer].$ZElems[0].$ZElems[$Zehner];
}
  }
  return($Result);
}

END

Probier das mal mit Betraegen unter 100000 - dann sollte es prima funktionieren. Bei Betraegen zwischen 100000 und 1000000 verheddert er sich ploetzlich mit den Zehntausendern - obwohl die vorher bereits rechtzeitig in einer Variablen gespeichert wurden. Ich kam da einfach nicht weiter - vielleicht ist es ein Integer-Ueberlaufproblem oder so was.

viele Gruesse
  Stefan Muenz