AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Sonstiges Delphi Zahlen in Wörter umwandeln
Thema durchsuchen
Ansicht
Themen-Optionen

Zahlen in Wörter umwandeln

Ein Thema von faux · begonnen am 23. Jul 2006
Antwort Antwort
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#1

Zahlen in Wörter umwandeln

  Alt 23. Jul 2006, 20:33
Mit dieser Unit kann man Zahlen (0 <= n < 10^240) in Wört umwandeln:

Delphi-Quellcode:
(***************************************************************************
*                                NumUnit.pas
*                            -------------------
*  begin                : Wednesday, July 19, 2006
*  copyright            : (C) 2006 Manuel Faux
*  email                : [email]faux@gmx.com[/email]
*  website              : [url]www.e-faux.com[/url]
*
*  This program is free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  about this file:
*  Wandelt Zahlen (0 <= n < 10^240) in deren deutsche Namen um.
*
***************************************************************************)

unit NumUnit;

interface

uses
  SysUtils, Classes;

type
  // Ziffer
  TDigit = 0..9;
  // Beliebig große Zahl
  TBigNum = array of TDigit;

const
  // Die kleinste Potenz, bei der ein Fehler auftreten würde, da der
  // Zahlennamenumfang (_Names) zu klein ist.
  // (Am besten mit <Eingabe> < Max überprüfen.)
  Max = 240;

function BuildList(Zahl: TBigNum; Full: Boolean = True;
  ShowEmpty: Boolean = True): TStrings;
function GetName(Index: Byte; Plural: Boolean = False): string;
function ConvertString(const Input: string): string;

implementation

const
  _Names: array [0..79] of string = (
    '', 'Tausend', 'Million', 'Milliarde', 'Billion', 'Billiarde', 'Trillion',
    'Trilliarde', 'Quadrillion', 'Quadrilliarde', 'Quintrillion',
    'Quintrilliarde', 'Sextillion', 'Sextilliarde', 'Septillion',
    'Septilliarde', 'Oktillion', 'Oktilliarde', 'Nonilion', 'Nonilliarde',
    'Dezillion', 'Dezilliarde', 'Undezillion', 'Undezilliarde',
    'Duodezillion', 'Duodezilliarde', 'Tredezillion', 'Tredezilliarde',
    'Quattourdezillion', 'Quattourdezilliarde', 'Quindezillion',
    'Quindezilliarde', 'Sexdezillion', 'Sexdezilliarde', 'Septendezillion',
    'Septendezilliarde', 'Octodezillion', 'Octodezilliarde', 'Novemdezillion',
    'Novemdezilliarde', 'Vingtillion', 'Vingtilliarde', 'Unvingtillion',
    'Unvingtilliarde', 'Duovingtillion', 'Duovingtilliarde', 'Trevingtillion',
    'Trevingtilliarde', 'Quattourvingtillion', 'Quattourvingtilliarde',
    'Quinvingtillion', 'Quinvingtilliarde', 'Sexvingtillion',
    'Sexvingtilliarde', 'Septenvingtillion', 'Septenvingtilliarde',
    'Octovingtillion', 'Octovingtilliarde', 'Novemvingtillion',
    'Novemvingtilliarde', 'Trigintillion', 'Trigintilliarde',
    'Untrigintillion', 'Untrigintilliarde', 'Duotrigintillion',
    'Duotrigintilliarde', 'Tretrigintillion', 'Tretrigintilliarde',
    'Quattourtrigintillion', 'Quattourtrigintilliarde', 'Quintrigintillion',
    'Quintrigintilliarde', 'Sextrigintillion', 'Sextrigintilliarde',
    'Septentrigingtillion', 'Septentrigingtilliarde', 'Octotrigintillion',
    'Octotrigintilliarde', 'Novemtrigintillion', 'Novemtrigintilliarde'
  );

(**
* Gibt den Zahlenname für durch 3 dividierbare Potenzen aus.
*
* Index - Ein drittel der Potenz deren Name ausgegeben werden soll.
*        1 würde 'Tausend' (1 * 3 = 3), 2 'Million' (2 * 3 = 6) und
*        7 'Trilliarde' (7 * 3 = 21) liefern.
* Plural - Wenn True, wird das Pluralwort zurückgegeben, wenn False,
*          das Singularwort (False: Million, True: Millionen).
*)

function GetName(Index: Byte; Plural: Boolean = False): string; // Public
begin
  // Überprüfung, ob Index die größte Zahlendarstellungsmöglichkeit nicht
  // überschreitet.
  if Index >= Max div 3 then
    Exit;
  Result := _Names[Index];
  if (Plural) and (Result <> '') then
    case Copy(Result, Length(Result), 1)[1] of
     'n': Result := Result + 'en';
      'e': Result := Result + 'n';
    end;
end;

(**
* Gibt den Zahlenname für Zahlen kleiner Tausend aus.
*
* Zahl - Die Zahl die konvertiert werden soll.
* Tousand - Wenn True, wird 1 als 'ein' ausgegeben, sonst als 'eine' (man
*          sagt "eine Million/Milliarde", aber "ein Tausend").
*)

function GetShortName(Zahl: Integer; Tousand: Boolean;
    Last: Boolean = False): string; // Private
  (**
  * Gibt den Zahlenname für Ziffern größer 1 zurück.
  *
  * AddAnd - Wenn True, wird ein 'und' am Ende angefügt.
  * Last - Gibt an, dass es sich um die letzte Ziffer eines Segments handelt.
  * Wenn True und Zahl = 1, dann wird 'eins' zurückgegeben, wenn False und
  * Zahl = 1, dann 'ein'.
   *)

  function Short(Zahl: TDigit; AddAnd: Boolean = False;
    Last: Boolean = False): string;
  begin
    case Zahl of
      1:
      begin
        if Last then
          Result := 'eins'
        else
          Result := 'ein';
      end;
      2: Result := 'zwei';
      3: Result := 'drei';
      4: Result := 'vier';
      5: Result := 'fünf';
      6: Result := 'sechs';
      7: Result := 'sieben';
      8: Result := 'acht';
      9: Result := 'neun';
    else
      Result := '';
    end;
    if (AddAnd) and (Zahl <> 0) then
      Result := Result + 'und';
  end;
var
  Temp: Byte;
begin
  Result := '';
  if Zahl >= 100 then
  begin
    case Zahl div 100 of
      1: Result := 'hundert';
    else
      Result := Short(Zahl div 100) + 'hundert';
    end;
  end;

  if Zahl >= 10 then
  begin
    Temp := Zahl - Zahl div 10 * 10;
    case (Zahl - Zahl div 100 * 100) div 10 of
      1:
      begin
        case Zahl - Zahl div 100 * 100 of
          11: Result := Result + 'elf';
          12: Result := Result + 'zwölf';
          else
            Result := Result + Short(Temp) + 'zehn';
        end;
      end;
      2: Result := Result + Short(Temp, True) + 'zwanzig';
      3: Result := Result + Short(Temp, True) + 'dreißig';
      4: Result := Result + Short(Temp, True) + 'vierzig';
      5: Result := Result + Short(Temp, True) + 'fünfzig';
      6: Result := Result + Short(Temp, True) + 'sechzig';
      7: Result := Result + Short(Temp, True) + 'siebzig';
      8: Result := Result + Short(Temp, True) + 'achzig';
      9: Result := Result + Short(Temp, True) + 'neunzig';
      0: Result := Result + Short(Temp, False, True);
    end;
  end
  else if Zahl > 0 then
  begin
    case Zahl of
      1:
      begin
        if Last then
          Result := 'eins'
        else if Tousand then
          Result := 'ein'
        else
          Result := 'eine';
      end;
    else
      Result := Short(Zahl);
    end;
  end
  else
  begin
    Result := 'null';
  end;
end;

(**
* Der eigentliche Konverierungsvorgang. Gibt den vollen Zahlenname als
* TStrings zurück.
*
* Zahl - Die Zahl als TBigNum.
* Full - Wenn True, wird die Anzahl der Potenzen die durch 3 teilbar sind
*        ausgeschrieben, wenn False, werden diese in Zahlen angeschrieben
*        (True: dreihundertsiebzehn Millionen; False: 317 Millionen)
* ShowEmpty - Wenn False, werden Potenzen die durch 3 teilbar sind nicht
*            ausgegeben.
*)

function BuildList(Zahl: TBigNum; Full: Boolean = True;
  ShowEmpty: Boolean = True): TStrings; // Public
var
  i, Max, iTemp: Integer;
  Temp: string;
begin
  Temp := '';
  Result := TStringList.Create;
  Max := Length(Zahl) - 1;
  for i := Max downto 0 do
  begin
    if ((Max - i + 1) mod 3 <> 0) and (i <> 0) then
    begin
      Temp := IntToStr(Zahl[i]) + Temp;
    end
    else
    begin
      Temp := IntToStr(Zahl[i]) + Temp;
      iTemp := StrToInt(Temp);
      if (ShowEmpty) or (iTemp <> 0) or (Result.Count = 0) then
      begin
        if Full then
           Result.Add(GetShortName(iTemp, (Max - i) div 3 = 1, i >= Max - 2) +
            ' ' + GetName((Max - i) div 3, Temp <> '1'))
        else
          Result.Add(IntToStr(iTemp) + ' ' + GetName((Max - i) div 3, Temp <> '1'))
      end;
      Temp := '';
    end;
  end;
  for i := Result.Count - 1 downto 1 do
    Result.Move(0, i);
end;

(**
* Konvertiert einen String mit der Zahl in Ziffern, in einen String mit der
* ausgeschrieben Zahl.
*
* Input - Die Zahl in Ziffern.
*)

function ConvertString(const Input: string): string; // Public
var
  Zahl: TBigNum;
  i, Temp, Code: Integer;
  List: TStrings;
begin
  SetLength(Zahl, Length(Input));
  for i := 0 to Length(Input) - 1 do
  begin
    Val(Input[i + 1], Temp, Code);
    if Code = 0 then
      Zahl[i] := Temp
    else
      Exit;
  end;
  List := BuildList(Zahl, True, False);
  Result := '';
  for i := 0 to List.Count - 1 do
    Result := Result + List[i] + ' ';
end;

end.
Anwendungsbeispiel:
Delphi-Quellcode:
ShowMessage(ConvertString('23491824379127364672512543234805794095738970387623156147056320465'));
//Gibt 'dreiundzwanzig Dezilliarden vierhunderteinundneunzig Dezillionen achthundertvierundzwanzig Nonilliarden dreihundertneunundsiebzig Nonilionen hundertsiebenundzwanzig Oktilliarden dreihundertvierundsechzig Oktillionen sechshundertzweiundsiebzig Septilliarden fünfhundertzwölf Septillionen fünfhundertdreiundvierzig Sextilliarden zweihundertvierunddreißig Sextillionen achthundert Quintrilliarden siebenhundertvierundneunzig Quintrillionen fünfundneunzig Quadrilliarden siebenhundertachtunddreißig Quadrillionen neunhundertsiebzig Trilliarden dreihundertsiebenundachzig Trillionen sechshundertdreiundzwanzig Billiarden hundertsechsundfünfzig Billionen hundertsiebenundvierzig Milliarden sechsundfünfzig Millionen dreihundertzwanzig Tausend vierhundertfünfundsechzig' aus.
Grüße
Faux
Angehängte Dateien
Dateityp: exe numname_138.exe (745,0 KB, 112x aufgerufen)
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 Uhr.
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