Newsgroup: it.comp.lang.delphi
Titolo: Conversione lettere - cifre

Salve a tutti,
Ho bisogno di convertire le cifre italiane (anche con la virgola per l'euro)
nel formato carattere per la stampa di bollettini.
Ovvero la cifra 1.245.000 diventa "unmilioneduecentoquarantacinquemila".
Qualcuno ha già del codice pronto ?? Io intanto inizio ...
Grazie, Luca

 Ovvero la cifra 1.245.000 diventa "unmilioneduecentoquarantacinquemila".
= euro 642,99
Ho visto che alcune banche ci mettono nella documentazione in carta le
scritte in cifra :
sei*quattro*due,nove*nove
non so se è una cosa di legge come le modifiche dell'assegno, dove ora ha
più importanza la cifra in numero di quella scritta in lettere, i decimali
con la barra... boh
ciao
Matteo

 Ovvero la cifra 1.245.000 diventa "unmilioneduecentoquarantacinquemila".
Scritto al volo, dovrebbe funzionare:
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;
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie, per l'euro ed i centesimi lo implemento..
Luca

>la cifra 1245000 diventa "unmilioneduecentoquarantacinquemila".
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;