Newsgroup: it.comp.lang.delphi
Titolo: conversione numero -> lettere

Sapete dove posso trovare una procedura per trasformare un numero nel suo
corrispondente in lettere (es.: 500.000 in cinquecentomila ) ?
Grazie
Val

Mi sa che de lo devi proprio fare tu..
io avevo fatto qualcosa in cpp ma chissa dov'è..
ti serve per la compilazione dei c/c giusto???

 wrote in message
news:lJxs8.62062$pT1.1...@news1.tin.it...

beh allora che programmi a fare? un programmatore deve anche faticare
non
usare sempre e solo la fatica degli altri...
un po' di uso del cervello non guasta :)
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

function Num2Word(Numero:integer):string;
const
   {init var}
   UNITA     = 'UNO    DUE    TRE    QUATTROCINQUE SEI    SETTE  OTTO
NOVE ';
   DECINA1   = 'DIECI      UNDICI     DODICI     TREDICI
QUATTORDICI'+
               'QUINDICI   SEDICI     DICIASSETTEDICIOTTO   DICIANNOVE
';
   DECINE    = 'DIECI    VENTI    TRENTA   QUARANTA CINQUANTASESSANTA
'+
               'SETTANTA OTTANTA  NOVANTA  ';
   ATTRIBUTI = ' MILIARDI MILIONI MILA     ';
var
   stringa,tre_cifre,cifre:string;
   cifra,gruppo:integer;
begin
   {casi particolari (valori 0 e 1)}
   if Numero=0 then
      result:='ZERO'
   else if abs(Numero)=1 then
      result:='UNA'
   {conversione generalizzata del numero}
   else
   begin
      {conversione da numero a caratteri}
      Cifre:=IntToStr(abs(Numero));
      while length(Cifre)<12 do
         Cifre:=' '+Cifre;
      result:='';
      {ciclo di analisi dei 4 gruppi di 3 cifre ciascuno, da destra
verso}
      {sinistra; il Gruppo 1 quello dei miliardi}
      for Gruppo:=4 downto 0 do
      begin
         {estrazione delle tre cifre del Gruppo}
         Tre_cifre:=Copy(Cifre,(Gruppo-1)*3+1,3);
         Stringa:= '';
         {verifica della condizione di fine ciclo prematura}
         if length(trim(Tre_cifre))=0 then
            exit;
         {filtrazione del caso anomalo di valore del Gruppo uguale a}
         if StrToInt(Tre_cifre)=1 then
         begin
            if Gruppo=4 then
               Stringa:='UNO'
            else if Gruppo=3 then
               Stringa:= 'MILLE'
            else if Gruppo=2 then
               Stringa:='UN MILIONE'
            else if Gruppo=1 then
               Stringa:= 'UN MILIARDO';
           {conversione generalizzata del valore del Gruppo diverso
da}
         end
         else if StrToInt(Tre_cifre)>1 then
         begin
            {analisi della prima cifra a sinistra (centinaia)}
            if Copy(Tre_cifre,1,1)<>' ' then
            begin
               Cifra:=StrToInt(Copy(Tre_cifre,1,1));
               if Cifra<>0 then
               begin
                  if Cifra>1 then
                     Stringa:=trim(Copy(Unita,(Cifra-1)*7+1,7));
                  Stringa:= Stringa+'CENTO';
                  {controllo dell'eccezione 'CENTOOTTANTA'}
                  if Copy(Tre_cifre,2,1)='8' then
                     Stringa:=Copy(Stringa,1,length(Stringa)-1);
               end;
            end;
            {analisi della cifra centrale (decine)}
            Cifra:= StrToInt(Copy(Tre_cifre,2,1));
            if Cifra=1 then
            begin
               {caso della prima decina}
               Cifra:= StrToInt(Copy(Tre_cifre,3,1));
               Stringa:= Stringa+trim(Copy(Decina1,Cifra*11+1,11));
            end
            else
            begin
               {caso della decine successive alla prima}
               if Cifra>1 then
               begin
                  Stringa:=Stringa+trim(Copy(Decine,(Cifra-1)*9+1,9));
                  {controllo delle eccezioni del tipo 'VENTIUNO' e
'VENTIOTTO'}
                  if Pos(Copy(Tre_cifre,3,1),'18')>0 then
                     Stringa:= Copy(Stringa,1,length(Stringa)-1);
               end;
               {analisi dell'ultima cifra a destra)}
               Cifra:= StrToInt(Copy(Tre_cifre,3,1));
               if Cifra>0 then
                  Stringa:=Stringa+trim(Copy(Unita,(Cifra-1)*7+1,7));
            end;
            {aggiunta dell'attributo del Gruppo (miliardi, milioni,}
            {mila); il primo a destra deve essere escluso}
            if Gruppo<>4 then
Stringa:=Stringa+trim(Copy(Attributi,(Gruppo-1)*9+1,9));
         end;
         {composizione dei gruppi convertiti, con esclusione del
valore}
         if length(Stringa)<>0 then
         begin
            {aggiunta di uno spazio per separare le parole}
(*            if length(result)<>0 then
               Stringa:=Stringa+' ';*)
            result:=Stringa+result;
         end;
      end;
   end;
end;

 corrispondente in lettere (es.: 500.000 in cinquecentomila ) ?
L'ho postato su questo gruppo il 22/02/2002:
function TraduciNumeroInStringa(ABC4_ABC3_ABC2_ABC1: String): String;
var
  ABC1, ABC2, ABC3, ABC4: String;
function TrasformaGruppo(ABC: String): String;
const
  Cifre: array [0..9] of String =
      ('', 'uno', 'due', 'tre', 'quattro', 'cinque',
       'sei', 'sette', 'otto', 'nove');
  DecUni10: array [1..9] of String =
      ('undici', 'dodici', 'tredici', 'quattordici',
       'quindici', 'sedici', 'diciassette',
       'diciotto', 'diciannove');
  Decine: array [2..9] of String =
      ('venti', 'trenta', 'quaranta', 'cinquanta',
       'sessanta', 'settanta', 'ottanta', 'novanta');
var
  iA: Integer;
  iB: Integer;
  iC: Integer;
  iBC: Integer;
begin
  iA := StrToInt(Copy(ABC, 1, 1));
  iB := StrToInt(Copy(ABC, 2, 1));
  iC := StrToInt(Copy(ABC, 3, 1));
  iBC := StrToInt(Copy(ABC, 2, 2));
  if (iA = 1) then
    Result := 'cento'
  else
  if (iA <> 0) then
    Result := Cifre[iA] + 'cento';
  if (iBC > 10) and (iBC < 20) then
    Result := Result + DecUni10[iBC]
  else
  begin
    if iB <> 0 then
    begin
      Result := Result + Decine[iB];
      if iC in [1, 8] then
        Delete(Result, Length(Result), 1);
    end;
    if iC <> 0 then
      Result := Result + Cifre[iC];
  end;
end;
begin
  ABC4_ABC3_ABC2_ABC1 := Copy(StringOfChar('0', 12),
                              1,
                              12-Length(ABC4_ABC3_ABC2_ABC1)) +
                         ABC4_ABC3_ABC2_ABC1;
  ABC1 := Copy(ABC4_ABC3_ABC2_ABC1, 10, 3);
  ABC2 := Copy(ABC4_ABC3_ABC2_ABC1,  7, 3);
  ABC3 := Copy(ABC4_ABC3_ABC2_ABC1,  4, 3);
  ABC4 := Copy(ABC4_ABC3_ABC2_ABC1,  1, 3);
  ABC4 := TrasformaGruppo(ABC4);
  if ABC4 <> '' then
  begin
    if ABC4 = 'uno' then
      Result := 'unmiliardo'
    else
      Result := ABC4 + 'miliardi';
  end;
  ABC3 := TrasformaGruppo(ABC3);
  if ABC3 <> '' then
  begin
    if ABC3 = 'uno' then
      Result := 'unmilione'
    else
      Result := Result + ABC3 + 'milioni';
  end;
  ABC2 := TrasformaGruppo(ABC2);
  if ABC2 <> '' then Result := Result + ABC2 + 'mila';
  Result := Result + TrasformaGruppo(ABC1);
  if Result = '' then Result := 'zero';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(TraduciNumeroInStringa('2121212121'));
end;


   ShowMessage(TraduciNumeroInStringa('2121212121'));
duemiliardicentoventunomilioniduecentoquarantamilacentoventuno
                                      ^^^^^^^^^^^^
????????
Jax

 L'ho postato su questo gruppo il 22/02/2002:
Mi sembra che la tua funzione abbia un po' di bachi, l'ho modificata evidenziando i
presunti bug e mi sembra perfetta adesso:
function TraduciNumeroInStringa(ABC4_ABC3_ABC2_ABC1: String): String;
var
 ABC1, ABC2, ABC3, ABC4: String;
function TrasformaGruppo(ABC: String): String;
const
 Cifre: array [0..9] of String =
   ('', 'uno', 'due', 'tre', 'quattro', 'cinque',
    'sei', 'sette', 'otto', 'nove');
 DecUni10: array [1..9] of String =
   ('undici', 'dodici', 'tredici', 'quattordici',
    'quindici', 'sedici', 'diciassette',
    'diciotto', 'diciannove');
// BUG: e il dieci poverino???
 Decine: array [1..9] of String =
   ('dieci', 'venti', 'trenta', 'quaranta', 'cinquanta',
    'sessanta', 'settanta', 'ottanta', 'novanta');
var
 iA: Integer;
 iB: Integer;
 iC: Integer;
 iBC: Integer;
begin
 iA := StrToInt(Copy(ABC, 1, 1));
 iB := StrToInt(Copy(ABC, 2, 1));
 iC := StrToInt(Copy(ABC, 3, 1));
 iBC := StrToInt(Copy(ABC, 2, 2));
 if (iA = 1) then
  Result := 'cento'
 else
 if (iA <> 0) then
  Result := Cifre[iA] + 'cento';
 if (iBC > 10) and (iBC < 20) then
// BUG: o testi DecUni10[iBC-10] oppure dichiari DecUni10: array [11..19]
  Result := Result + DecUni10[iBC-10]






 begin
// BUG: e il mille poverino? o forse è giusto dire "unomila"? :)
  if ABC2 = 'uno' then
   Result := 'mille'
  else
   Result := Result + ABC2 + 'mila';
 end;
 Result := Result + TrasformaGruppo(ABC1);
 if Result = '' then Result := 'zero';
end;
--
Jax

                                      ^^^^^^^^^^^^
Gulp ! non me n'ero accorto... 
In realta' basta correggere la riga:
 if (iBC > 10) and (iBC < 20) then
    Result := Result + DecUni10[iBC]
in 
 if (iBC > 10) and (iBC < 20) then
    Result := Result + DecUni10[iBC-10]
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

// BUG: e il mille poverino? o forse è giusto dire "unomila"? :)
Giuste le osservazioni e le correzioni.
Grazie per il beta-testing ;) 


 Grazie per il beta-testing ;)
Figurati, erano solo sbadataggini, come peraltro si capisce dalla finezza del
   if iC in [1, 8] then
    Delete(Result, Length(Result), 1);
:)
Se permetti, posto la tua funzione modificata (vai di open source :)) con la traduzione
facoltativa dei decimali (massimo 3), che può essere utile per gli euro.
Uso:
bTraduciDecimali = False --> 126,45 = centoventiquattro/45
bTraduciDecimali = True ---> 126,45 = centoventiquattro/quarantacinque
Ciao!
Jax
//*****************************************************************
function TraduciNumeroInStringa(sNumero: String; bTraduciDecimali: Boolean): String;
var
 ABC4_ABC3_ABC2_ABC1, sDecimali: String;
 ABC1, ABC2, ABC3, ABC4: String;
 iVirgola: SmallInt;
 function TrasformaGruppo(ABC: String): String;
 const
  Cifre: array [0..9] of String =
    ('', 'uno', 'due', 'tre', 'quattro', 'cinque',
     'sei', 'sette', 'otto', 'nove');
  DecUni10: array [1..9] of String =
    ('undici', 'dodici', 'tredici', 'quattordici',
     'quindici', 'sedici', 'diciassette',
     'diciotto', 'diciannove');
  Decine: array [1..9] of String =
    ('dieci', 'venti', 'trenta', 'quaranta', 'cinquanta',
     'sessanta', 'settanta', 'ottanta', 'novanta');
 var
  iA: Integer;
  iB: Integer;
  iC: Integer;
  iBC: Integer;
 begin
  iA := StrToInt(Copy(ABC, 1, 1));
  iB := StrToInt(Copy(ABC, 2, 1));
  iC := StrToInt(Copy(ABC, 3, 1));
  iBC := StrToInt(Copy(ABC, 2, 2));
  if (iA = 1) then
   Result := 'cento'
  else
  if (iA <> 0) then
   Result := Cifre[iA] + 'cento';
  if (iBC > 10) and (iBC < 20) then
   Result := Result + DecUni10[iBC-10]
  else
  begin
   if iB <> 0 then
   begin
    Result := Result + Decine[iB];
    if iC in [1, 8] then
     Delete(Result, Length(Result), 1);
   end;
   if iC <> 0 then
    Result := Result + Cifre[iC];
  end;
 end;
begin
 iVirgola := Pos(',', sNumero);
 if iVirgola <= 0 then
  ABC4_ABC3_ABC2_ABC1 := sNumero
 else
 begin
  ABC4_ABC3_ABC2_ABC1 := Copy(sNumero, 1, iVirgola - 1);
  sDecimali := Copy(sNumero, iVirgola + 1, Length(sNumero) - iVirgola);
  if bTraduciDecimali then
   sDecimali := Copy(StringOfChar('0', 3), 1, 3-Length(sDecimali)) + sDecimali;
 end;





  if ABC2 = 'uno' then
   Result := 'mille'
  else
   Result := Result + ABC2 + 'mila';
 end;
 Result := Result + TrasformaGruppo(ABC1);
 if Result = '' then Result := 'zero';
 if sDecimali <> '' then
  if bTraduciDecimali then
   Result := Result + '/' + TrasformaGruppo(sDecimali)
  else
   Result := Result + '/' + sDecimali;
end;