![]() |
Integer in String(in Worten) konvertieren
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
Ich wollte mal die Integerwerte 0-99 in ausgeschriebene Worte konvertieren. Es gibt zwar die eine oder andere Lösung zu finden, aber das war mir alles zu aufwändig. Wer sich dafür interessiert, guckt mal hier: ![]() Eine Erweiterung bis 999 habe ich mir gespart, weil nicht benötigt. Sollte aber leicht zu implementieren sein. Vielleicht schreibt mal jemand, wie blöd ich mich dabei angestellt habe. Gruß delphi10 |
Re: Integer in String(in Worten) konvertieren
Das war eine Aufgabe des Informatik-Bundeswettbewerbs von 1996 oder 97. (allerdings IMHO 6stellig) :mrgreen:
|
Re: Integer in String(in Worten) konvertieren
Problem für die Codelib dürfte sein das es extern liegt. Wenn es also von dem extern Platz verschwindet ist der Codelibeintrag nutzlos. Um es hier direkt rein zu stellen müsste man die Rechte dafür haben :gruebel:
|
Re: Integer in String(in Worten) konvertieren
Zitat:
Diese Procedure verstehe ich auch nicht als ausgereifte, fertige Lösung. Mir schwebte da eher ein Denkanstoß vor. Auch weil ich meine, dass der Sourcecode ziemlich komprimiert ist. Geht aber siche noch besser.. |
Re: Integer in String(in Worten) konvertieren
Liste der Anhänge anzeigen (Anzahl: 1)
"delphi10"
Zitat:
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.
Delphi-Quellcode:
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.
ConvInttoTextWord(Anzahl : Integer): String"
Delphi-Quellcode:
Hier soll das Ergebnis der Funktion "eins" werden. Schreibs doch einfach hin!
case Anzahl of
1: Insert(e,inWorten,length(inWorten)+1);//e ersetzen durch s, wenn "eins" angezeigt werden soll
Delphi-Quellcode:
Das soll genug zu deinem Code sein. Hier wäre meiner:
case Anzahl of
1: begin Result:= 'eins'; Exit end;
Delphi-Quellcode:
Wirklich interessant wird die Aufgabe, wenn man alle Integerzahlen als Argument zulassen will.
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; Die case-Anweisung ist dann zu ergänzen mit
Delphi-Quellcode:
Damit wird die Funktion zu einem Musterbeispiel für die Mächtigkeit rekursiver Programmierung.
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); Wegen der recursiven Aufrufe kann sie jedoch kein 'Null' zurückgeben. |
Re: Integer in String(in Worten) konvertieren
Hallo,
wieso schreibst du bei Integer 0 nicht einfach "Null" in den String:
Delphi-Quellcode:
case n of
0: Result:= '';
Delphi-Quellcode:
case n of
0: Result:= 'Null'; |
Re: Integer in String(in Worten) konvertieren
"Helmi" schreibt:
Zitat:
Wer auf der Null besteht, kann sie direkt (ohne IntToText zu bemühe direkt einfügen:
Delphi-Quellcode:
if k>0 then lblOut.Caption:= IntToText(k) else if k=0 then lblOut.Caption:= 'Null';
|
Re: Integer in String(in Worten) konvertieren
Hallo,
der Routine fehlte noch ein "end", damit der Compiler sie ohne Fehlermeldung akzeptiert. Weiterhin muss die Zahl 16 als Ausnahme behandelt werden: "sechzehn" statt sechszehn. Gruß Hawkeye |
Re: Integer in String(in Worten) konvertieren
War mal so frei die Änderungswünsche einzubauen und Zahlen unter Null zu unterstützen.
Delphi-Quellcode:
MfG,
function IntToText(n: integer; firstCall: boolean {$IFDEF DELPHI4_UP} = true {$ENDIF}): 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 low(integer)..-1: Result := 'minus ' + IntToText(-n, true); 0: if firstCall then Result := 'null' else 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; 100..999: Result:= Einer[n div 100] + 'hundert' + IntToText(n mod 100, false); 1000..999999: Result:= IntToText(n div 1000, false) + 'tausend' + IntToText(n mod 1000, false); 1000000..1000999: Result:= 'einemillion' + IntToText(n mod 1000000, false); 2000000..999999999: Result:= IntToText(n div 1000000, false) + 'millionen' + IntToText(n mod 1000000, false); 1000000000..1999999999: Result:= 'einemilliarde' + IntToText(n mod 1000000000, false); else Result:= 'zweimilliarden' + IntToText(n mod 1000000000, false); end; end; Bug EDIT1: (meinen) Fehler berichtigt EDIT2: Hab "sechszehn" im Code dringehabt :wall: |
Re: Integer in String(in Worten) konvertieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz