Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Integer in String(in Worten) konvertieren (https://www.delphipraxis.net/124719-integer-string-worten-konvertieren.html)

delphi10 24. Nov 2008 08:39


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

sirius 24. Nov 2008 08:49

Re: Integer in String(in Worten) konvertieren
 
Das war eine Aufgabe des Informatik-Bundeswettbewerbs von 1996 oder 97. (allerdings IMHO 6stellig) :mrgreen:

SirThornberry 24. Nov 2008 08:53

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:

delphi10 24. Nov 2008 09:21

Re: Integer in String(in Worten) konvertieren
 
Zitat:

Zitat von sirius
Das war eine Aufgabe des Informatik-Bundeswettbewerbs von 1996 oder 97. (allerdings IMHO 6stellig) :mrgreen:

Ja, mag sein. Kannte ich nicht. Wenn es Ähnlichkeiten im Source gibt, dann nur deshalb, weil gleiche Probleme meistens auch zu gleichen/ähnlichen Lösungen führen.
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..

Dipl Phys Ernst Winter 9. Mai 2009 12:12

Re: Integer in String(in Worten) konvertieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
"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.
Delphi-Quellcode:
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.

Helmi 9. Mai 2009 12:44

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';

Dipl Phys Ernst Winter 9. Mai 2009 18:49

Re: Integer in String(in Worten) konvertieren
 
"Helmi" schreibt:
Zitat:

wieso schreibst du bei Integer 0 nicht einfach "Null" in den String:
Weil dann der rekursive Aufruf nicht mehr funktioniert!
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';

Hawkeye219 9. Mai 2009 19:21

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

BUG 9. Mai 2009 20:07

Re: Integer in String(in Worten) konvertieren
 
War mal so frei die Änderungswünsche einzubauen und Zahlen unter Null zu unterstützen.

Delphi-Quellcode:
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;
MfG,
Bug

EDIT1: (meinen) Fehler berichtigt
EDIT2: Hab "sechszehn" im Code dringehabt :wall:

DeddyH 9. Mai 2009 21:48

Re: Integer in String(in Worten) konvertieren
 
Zitat:

Zitat von Hawkeye219
Weiterhin muss die Zahl 16 als Ausnahme behandelt werden

17 übrigens auch, das heißt ja nicht "siebenzehn" :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz