Boris Hoeller: Ü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:

Hallo Stefan, hallo an dieser Programmierung Interessierte,

danke erstmal für die Grundlage auf meine Frage hin :).
Hintergrund ist der Versuch, die automatische Generierung eines Wechselformulars zu programmieren.
Der Wechsel wird im kaufmännischen Verkehr verwendet, aber ist sehr formstreng (verliert daher an Bedeutung, wegen der Angst einen Fehler zu machen ...) - ist aber aus kaufmännischer Sicht ein gutes Instrumetarium.  Die (rechtssichere ;) Erstellung eines
Wechsels über HTML/P.E.R.L. könnte zu einer kleinen
Wiedergeburt führen, da auch so im Zweifel z.B. kleine GmbH's über ihre Haftungssumme hinaus beliefert werden können, wenn der Bezogene eine natürliche, damit prinzipiell nicht haftungsbeschränkte Person ist.
Nach der Formstrenge ist die Wechselsumme in Ziffern und Buchstaben anzugeben. Das zum Hintergrund.

Auf der anderen Seite sind unter "modularen" Gesichtspunkten andere Anwendungsfelder für die 'Übersetzung' nicht ausgeschlossen.
Auf jeden Fall interessant ;)

Ich versuche jetzt mal das script zu verstehen, was mir aber bislang auffällt ist:

Bislang 'packt' das Script auch unter 100.000,00 die 11-20er nicht richtig. Mehr dazu im nächsten posting ...

Bis dann
CU
Bo

#!/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