Einzelnen Beitrag anzeigen

Dipl Phys Ernst Winter

Registriert seit: 14. Apr 2009
Ort: Jena
103 Beiträge
 
Delphi 3 Professional
 
#5

Re: Integer in String(in Worten) konvertieren

  Alt 9. Mai 2009, 12:12
"delphi10"
Zitat:
Ich wollte ... Integerwerte ... in ausgeschriebene Worte konvertieren.
Vielleicht schreibt mal jemand, wie blöd ich mich dabei angestellt habe.
Zuerst einige Anmerkungen zu deinem Code:
Du brauchst keine Variable inWorten, in der du das Ergebnis der Funktion zwischenspeichrst, du kanst Result:= an jeder Stelle im Code verwenden. Schreib dahinter ein Exit, um die Funktion zu verlassen.
ConvInttoTextWord(Anzahl : Integer): String" IntToText" genügt um die Funktion als Konvertierung zu kennzeichnen. Das "Conv" ist überflüssig, beim "Word" ist man geneigt an den Datentyp zu denken. "Anzahl" läßt mich Vermuten, dass da etwas gezählt wurde. Daher, wenn schon kein Symbolisches n, so doch wenigstens einfach Zahl.
Delphi-Quellcode:
case Anzahl of
  1: Insert(e,inWorten,length(inWorten)+1);//e ersetzen durch s, wenn "eins" angezeigt werden soll
Hier soll das Ergebnis der Funktion "eins" werden. Schreibs doch einfach hin!
Delphi-Quellcode:
case Anzahl of
  1: begin Result:= 'eins'; Exit end;
Das soll genug zu deinem Code sein. Hier wäre meiner:
Delphi-Quellcode:
function IntToText(n: integer): string;
const
  Einer: array[0..12] of string = ('', 'ein', 'zwei', 'drei', 'vier', 'fünf',
                    'sechs', 'sieben', 'acht', 'neun', 'zehn', 'elf', 'zwölf');
  Zehner: array[1..9] of string = ('zehn', 'zwanzig', 'dreißig', 'vierzig',
  'fünfzig', 'sechzig', 'siebzig', 'achtzig', 'neunzig');
var
  s: string;
begin
  case n of
  0: Result:= '';
  1: Result:= 'eins';
  2..12: Result:= Einer[n];
  13..15: Result:= Einer[n mod 10] + 'zehn';
  16: Result:= 'sechzehn';
  17: Result:= 'siebzehn';
  18..19: Result:= Einer[n mod 10] + 'zehn';
  20..99: begin s:= Einer[n mod 10]; if n Mod 10 > 0 then s:= s + 'und';
    Result:= s + Zehner[n div 10]
  end
end;
Wirklich interessant wird die Aufgabe, wenn man alle Integerzahlen als Argument zulassen will.
Die case-Anweisung ist dann zu ergänzen mit
Delphi-Quellcode:
  100..999: Result:= Einer[n div 100] + 'hundert' + IntToText(n mod 100);
  1000..999999:
    Result:= IntToText(n div 1000) + 'tausend' + IntToText(n mod 1000);
  1000000..1000999:
    Result:= 'einemillion' + IntToText(n mod 1000000);
  2000000..999999999:
    Result:= IntToText(n div 1000000) + 'millionen' + IntToText(n mod 1000000);
  1000000000..1999999999:
    Result:= 'einemilliarde' + IntToText(n mod 1000000000);
  else Result:= 'zweimilliarden' + IntToText(n mod 1000000000);
Damit wird die Funktion zu einem Musterbeispiel für die Mächtigkeit rekursiver Programmierung.

Wegen der recursiven Aufrufe kann sie jedoch kein 'Null' zurückgeben.
Angehängte Dateien
Dateityp: exe strtotext_762.exe (164,2 KB, 9x aufgerufen)
Autor: DP Ernst Winter
  Mit Zitat antworten Zitat