Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eine Zahl in Aussprache umwandeln... (https://www.delphipraxis.net/94222-eine-zahl-aussprache-umwandeln.html)

moonwhaler 18. Jun 2007 14:10


Eine Zahl in Aussprache umwandeln...
 
Hallo zusammen...

okay der Titel klingt ein wenig komisch, aber ich kenne leider nicht den Fachbegriff für eine derartige Operation: Zahlen (Integer, Real) in Sprache umzusetzen. Für alle denen das immer noch zu schwammig ist:

Ich habe eine Zahl 188, was ich, möchte ist eine Umwandlung in die natürliche Aussprache, also "einhundertachtundachzig". Weiß jemand rat, hat so etwas vielleicht schon programmiert - oder kennt eine entsprechende Komponente?

Vielen Dank für die Hilfe!

Meflin 18. Jun 2007 14:17

Re: Eine Zahl in Aussprache umwandeln...
 
Eins ist mir noch nicht ganz klar: möchtest du eine Ausgabe als Text oder eine echte Sprachausgabe (zum anhören)?

Für letzteres wäre das Microsoft SpeechSDK geeignet ( http://www.microsoft.com/speech/download/sdk51/ ), wenn du eine Textausgabe willst, durchstöbere mal die CodeLibrary der DP, ich bin mir fast sicher dass sich da ein entsprechender Codeschnipsel finden lässt ;)


moonwhaler 18. Jun 2007 14:20

Re: Eine Zahl in Aussprache umwandeln...
 
Vielen Dank für die schnelle Antwort.

Nein die Umwandlung soll in Textform erfolgen - nicht als Sprachausgabe.

Hawkeye219 18. Jun 2007 14:24

Re: Eine Zahl in Aussprache umwandeln...
 
Hallo,

das, was du meinst, nennt sich "Zahlwort". In der Delphi-Fundgrube befindet sich ein Code zur Umwandlung.

Gruß Hawkeye

moonwhaler 19. Jun 2007 09:44

Re: Eine Zahl in Aussprache umwandeln...
 
Super. Genau das, was ich gesucht habe! Danke. Ich habe das Beispiel in der Fundgrube nochmal erweitert (geht jetzt bis Billiarden (wers braucht) und neu formatiert - zum Spaß. :)

Delphi-Quellcode:
// Original code by Georg W. Seefried
// Modified by Christian Petersen
function ZahlInString( n: Int64 ): String;
const
  Zahlen1: array[0..9] of String =
    ( '', 'zehn', 'zwan', 'drei', 'vier', 'fünf', 'sech', 'sieb', 'ach', 'neun' );
  Zahlen: array[0..9] of String =
    ( '', 'ein', 'zwei', 'drei', 'vier', 'fünf', 'sechs', 'sieben', 'acht', 'neun' );
var
  n100, n10, n1: integer;
  s: String;

  function ZehnerUndEiner( n10, n1: byte ): String;
  var
    n: Int64;
  begin
    n := n10 * 10 + n1;
    Result := '';

    if ( n10 = 0 ) then
    begin
      if ( n1 > 0 ) then
        result := result + zahlen[n1];

      if ( n1 = 1 ) then
        result := result + 's';
    end else
    begin
      if ( n10 = 1 ) then
      begin
        if ( n = 11 ) then
          result := result + 'elf'
        else if ( n = 12 ) then
          result := result + 'zwölf'
        else
          result := result + Zahlen1[n1] + 'zehn';
      end else
      begin
        result := result + Zahlen[n1];

        if ( n1 > 0 ) then
          result := result + 'und';

        result := result + Zahlen1[n10];

        if ( n10 <> 3 ) then
          result := result + 'zig'
        else
          result := result + 'ßig';
      end;
    end;
  end; {ZehnerUndEiner}

begin
  result := '';

  if ( n = 0 ) then
  begin
    result := 'null';
    exit;
  end;

  if ( n >= 1000000000000000 ) then
  begin
    s := ZahlInString( n DIV 1000000000000000 );

    if ( s = 'eins' ) then
      result := result + 'einebilliarde'
    else
      result := result + s + 'billiarden';

    n := n MOD 1000000000;
  end;

  if ( n >= 1000000000000 ) then
  begin
    s := ZahlInString( n DIV 1000000000000 );

    if ( s = 'eins' ) then
      result := result + 'einebillion'
    else
      result := result + s + 'billionen';

    n := n MOD 1000000000;
  end;

  if ( n >= 1000000000 ) then
  begin
    s := ZahlInString( n DIV 1000000000 );

    if ( s = 'eins' ) then
      result := result + 'einemilliarde'
    else
      result := result + s + 'milliarden';

    n := n MOD 1000000000;
  end;

  if ( n >= 1000000 ) then
  begin
    s := ZahlInString( n DIV 1000000 );

    if ( s = 'eins' ) then
      result := result + 'einemillion'
    else
      result := result + s + 'millionen';

    n := n MOD 1000000;
  end;

  if ( n >= 1000 ) then
  begin
    s := ZahlInString( n DIV 1000 );

    if ( s = 'eins' ) then
      s := 'ein';

    result := result + s + 'tausend';
    n := n MOD 1000;
  end;

  n100 := n DIV 100;
  n := n MOD 100;
  n10 := n DIV 10;
  n1 := n MOD 10;

  if ( n100 <> 0 ) then
    result := result + Zahlen[n100] + 'hundert';

  result := result + ZehnerUndEiner( n10, n1 );
end;
Viele Grüße!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 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