Solved

Numerical to literal

Posted on 2002-06-27
8
458 Views
Last Modified: 2010-04-04
Guys I have this code that converts any amount or number
to his literal version (5 = five) The problem is that this code cannot work with FLOAT or REAL. Can anyone fix
it to work with FLOAT or REAL?

You can also practice your spanish with this one ;)

--
procedure TForm1.Button1Click(Sender: TObject);
 
function xIntToLletras(Numero:LongInt):String;
 
  function xxIntToLletras(Valor:LongInt):String;
  const
   aUnidad : array[1..15] of string =
     ('UN','DOS','TRES','CUATRO','CINCO','SEIS',
      'SIETE','OCHO','NUEVE','DIEZ','ONCE','DOCE',
      'TRECE','CATORCE','QUINCE');
   aCentena: array[1..9]  of string =
     ('CIENTO','DOSCIENTOS','TRESCIENTOS',
      'CUATROCIENTOS','QUINIENTOS','SEISCIENTOS',
      'SETECIENTOS','OCHOCIENTOS','NOVECIENTOS');
   aDecena : array[1..9]  of string =
    ('DIECI','VEINTI','TREINTA','CUARENTA','CINCUENTA',
     'SESENTA','SETENTA','OCHENTA','NOVENTA');
  var
   Centena, Decena, Unidad, Doble: LongInt;
   Linea: String;
  begin
   if valor=100 then Linea:=' CIEN '
   else begin
     Linea:='';
     Centena := Valor div 100;
     Doble   := Valor - (Centena*100);
     Decena  := (Valor div 10) - (Centena*10);
     Unidad  := Valor - (Decena*10) - (Centena*100);
 
     if Centena>0 then Linea := Linea + Acentena[centena]+' ';
 
     if Doble>0 then begin
       if Doble=20 then Linea := Linea +' VEINTE '
         else begin
          if doble<16 then Linea := Linea + aUnidad[Doble]
            else begin
                 Linea := Linea +' '+ Adecena[Decena];
                 if (Decena>2) and (Unidad<>0) then Linea := Linea+' Y ';
                 if Unidad>0 then Linea := Linea + aUnidad[Unidad];
            end;
         end;
     end;
   end;
   Result := Linea;
  end;
 
var
   Millones,Miles,Unidades: Longint;
   Linea : String;
begin
  {Inicializamos el string que contendrá las letras según el valor
  numérico}
  if numero=0 then Linea := 'CERO'
  else if numero<0 then Linea := 'MENOS '
       else if numero=1 then
            begin
              Linea := 'UN';
              xIntToLletras := Linea;
              exit
            end
            else if numero>1 then Linea := '';
 
  {Determinamos el Nº de millones, miles y unidades de numero en
  positivo}
  Numero   := Abs(Numero);
  Millones := numero div 1000000;
  Miles     := (numero - (Millones*1000000)) div 1000;
  Unidades  := numero - ((Millones*1000000)+(Miles*1000));
 
  {Vamos poniendo en el string las cadenas de los números(llamando
  a subfuncion)}
  if Millones=1 then Linea:= Linea + ' UN MILLON '
  else if Millones>1 then Linea := Linea + xxIntToLletras(Millones)
                                   + ' MILLONES ';
 
  if Miles =1 then Linea:= Linea + ' MIL '
  else if Miles>1 then Linea := Linea + xxIntToLletras(Miles)+
                                ' MIL ';
 
  if Unidades >0 then Linea := Linea + xxIntToLletras(Unidades);
 
  xIntToLletras := Linea;
end;
 
begin
  Label1.Caption:= xIntToLletras(StrToInt(Edit1.Text));
end;


 
procedure TForm1.Button1Click(Sender: TObject);
 
function xIntToLletras(Numero:LongInt):String;
 
  function xxIntToLletras(Valor:LongInt):String;
  const
   aUnidad : array[1..15] of string =
     ('UN','DOS','TRES','CUATRO','CINCO','SEIS',
      'SIETE','OCHO','NUEVE','DIEZ','ONCE','DOCE',
      'TRECE','CATORCE','QUINCE');
   aCentena: array[1..9]  of string =
     ('CIENTO','DOSCIENTOS','TRESCIENTOS',
      'CUATROCIENTOS','QUINIENTOS','SEISCIENTOS',
      'SETECIENTOS','OCHOCIENTOS','NOVECIENTOS');
   aDecena : array[1..9]  of string =
    ('DIECI','VEINTI','TREINTA','CUARENTA','CINCUENTA',
     'SESENTA','SETENTA','OCHENTA','NOVENTA');
  var
   Centena, Decena, Unidad, Doble: LongInt;
   Linea: String;
  begin
   if valor=100 then Linea:=' CIEN '
   else begin
     Linea:='';
     Centena := Valor div 100;
     Doble   := Valor - (Centena*100);
     Decena  := (Valor div 10) - (Centena*10);
     Unidad  := Valor - (Decena*10) - (Centena*100);
 
     if Centena>0 then Linea := Linea + Acentena[centena]+' ';
 
     if Doble>0 then begin
       if Doble=20 then Linea := Linea +' VEINTE '
         else begin
          if doble<16 then Linea := Linea + aUnidad[Doble]
            else begin
                 Linea := Linea +' '+ Adecena[Decena];
                 if (Decena>2) and (Unidad<>0) then Linea := Linea+' Y ';
                 if Unidad>0 then Linea := Linea + aUnidad[Unidad];
            end;
         end;
     end;
   end;
   Result := Linea;
  end;
 
var
   Millones,Miles,Unidades: Longint;
   Linea : String;
begin
  {Inicializamos el string que contendrá las letras según el valor
  numérico}
  if numero=0 then Linea := 'CERO'
  else if numero<0 then Linea := 'MENOS '
       else if numero=1 then
            begin
              Linea := 'UN';
              xIntToLletras := Linea;
              exit
            end
            else if numero>1 then Linea := '';
 
  {Determinamos el Nº de millones, miles y unidades de numero en
  positivo}
  Numero   := Abs(Numero);
  Millones := numero div 1000000;
  Miles     := (numero - (Millones*1000000)) div 1000;
  Unidades  := numero - ((Millones*1000000)+(Miles*1000));
 
  {Vamos poniendo en el string las cadenas de los números(llamando
  a subfuncion)}
  if Millones=1 then Linea:= Linea + ' UN MILLON '
  else if Millones>1 then Linea := Linea + xxIntToLletras(Millones)
                                   + ' MILLONES ';
 
  if Miles =1 then Linea:= Linea + ' MIL '
  else if Miles>1 then Linea := Linea + xxIntToLletras(Miles)+
                                ' MIL ';
 
  if Unidades >0 then Linea := Linea + xxIntToLletras(Unidades);
 
  xIntToLletras := Linea;
end;
 
begin
  Label1.Caption:= xIntToLletras(StrToInt(Edit1.Text));
end;
0
Comment
Question by:gsoldado
  • 3
  • 2
  • 2
  • +1
8 Comments
 
LVL 6

Accepted Solution

by:
DrDelphi earned 100 total points
ID: 7114723
Listo! Aunque, para mi se merece mas de 100 puntos...


procedure TForm1.Button1Click(Sender: TObject);
function xIntToLletras(Num:real):String;
var ParteUno,ParteDos,Numero:Longint;
 function xxIntToLletras(Valor:LongInt):String;
 const
  aUnidad : array[1..15] of string =
    ('UN','DOS','TRES','CUATRO','CINCO','SEIS',
     'SIETE','OCHO','NUEVE','DIEZ','ONCE','DOCE',
     'TRECE','CATORCE','QUINCE');
  aCentena: array[1..9]  of string =
    ('CIENTO','DOSCIENTOS','TRESCIENTOS',
     'CUATROCIENTOS','QUINIENTOS','SEISCIENTOS',
     'SETECIENTOS','OCHOCIENTOS','NOVECIENTOS');
  aDecena : array[1..9]  of string =
   ('DIECI','VEINTI','TREINTA','CUARENTA','CINCUENTA',
    'SESENTA','SETENTA','OCHENTA','NOVENTA');
 var
  Centena, Decena, Unidad, Doble: LongInt;
  Linea: String;
 begin
  if valor=100 then Linea:=' CIEN '
  else begin
    Linea:='';
    Centena := Valor div 100;
    Doble   := Valor - (Centena*100);
    Decena  := (Valor div 10) - (Centena*10);
    Unidad  := Valor - (Decena*10) - (Centena*100);

    if Centena>0 then Linea := Linea + Acentena[centena]+' ';

    if Doble>0 then begin
      if Doble=20 then Linea := Linea +' VEINTE '
        else begin
         if doble<16 then Linea := Linea + aUnidad[Doble]
           else begin
                Linea := Linea +' '+ Adecena[Decena];
                if (Decena>2) and (Unidad<>0) then Linea := Linea+' Y ';
                if Unidad>0 then Linea := Linea + aUnidad[Unidad];
           end;
        end;
    end;
  end;
  Result := Linea;
 end;
var
  Millones,Miles,Unidades: Longint;
  Linea : String;
begin
 if Pos('.',FloatToStr(Num))=0 then
 begin
  Numero:=Trunc(num);
  Result:=xxIntToLletras(numero);
  Exit;
 end
 Else
 begin
    ParteUno:=StrToInt(Copy(FloatToStr(num),1,Pos('.',FloatToStr(num))-1));
    ParteDos:=StrToInt(Copy(FloatToStr(num),Pos('.',FloatToStr(num))+1,length(FloatToStr(num))));
    Result:=xxIntToLletras(ParteUNo)+' punto '+ xxIntToLletras(ParteDos);
    exit;
 end;

 {Inicializamos el string que contendrá las letras según el valor
 numérico}
 if numero=0 then Linea := 'CERO'
 else if numero<0 then Linea := 'MENOS '
      else if numero=1 then
           begin
             Linea := 'UN';
             xIntToLletras := Linea;
             exit
           end
           else if numero>1 then Linea := '';

 {Determinamos el Nº de millones, miles y unidades de numero en
 positivo}
 Numero   := Abs(Numero);
 Millones := (numero div 1000000);
 Miles     := (numero - (Millones*1000000)) div 1000;
 Unidades  := numero - ((Millones*1000000)+(Miles*1000));

 {Vamos poniendo en el string las cadenas de los números(llamando
 a subfuncion)}
 if Millones=1 then Linea:= Linea + ' UN MILLON '
 else if Millones>1 then Linea := Linea + xxIntToLletras(Millones)
                                  + ' MILLONES ';

 if Miles =1 then Linea:= Linea + ' MIL '
 else if Miles>1 then Linea := Linea + xxIntToLletras(Miles)+
                               ' MIL ';

 if Unidades >0 then Linea := Linea + xxIntToLletras(Unidades);

 xIntToLletras := Linea;
end;

begin
 Label1.Caption:= xIntToLletras(StrToFloat(Edit1.Text));
end;

=============================

Suerte!

0
 
LVL 1

Expert Comment

by:Boomers
ID: 7114801
What if you parse your FLOAT or REAL seperator to do the following:

 if Pos('.',Edit1.Text) > 0 then
   Label1.Caption:= xIntToLletras(StrToInt(Copy(Edit1.Text,1,Pos('.',Edit1.Text) - 1))) + ' . ' + xIntToLletras(StrToInt(Copy(Edit1.Text,Pos('.',Edit1.Text) + 1,length(Edit1.text) - Pos('.',Edit1.Text))))
 else
   Label1.Caption:= xIntToLletras(StrToInt(Edit1.Text));
end;

I currently put a '.' between the 2 words but in english it should be ' and '.

EX: Forty-nine and eleven --> 49.11
0
 
LVL 3

Expert Comment

by:lopem
ID: 7115277
Hace tiempo escribm esta rutina. Quizas pueda servirte...
Saludos
Manuel Lopez (lopem)

Const
      Numeros   : array [0..30] of string[15] = ('','UN','DOS','TRES','CUATRO',
                  'CINCO','SEIS','SIETE','OCHO','NUEVE','DIEZ','ONCE','DOCE',
                  'TRECE','CATORCE','QUINCE','DIECISEIS','DIECISIETE','DIECIOCHO',
                  'DIECINUEVE','VEINTE','VEINTIUN','VEINTIDOS','VEINTITRES',
                  'VEINTICUATRO','VEINTICINCO','VEINTISEIS','VEINTISIETE',
                  'VEINTIOCHO','VEINTINUEVE','TREINTA');

     Cientos    : array [0..9] of string[15] = ('','CIENTO','DOSCIENTOS','TRESCIENTOS',
                  'CUATROCIENTOS','QUINIENTOS','SEISCIENTOS','SETECIENTOS',
                  'OCHOCIENTOS','NOVECIENTOS');

     Decenas    : array [0..9] of string[15] = ('','','','TREINTA','CUARENTA',
                  'CINCUENTA','SESENTA','SETENTA','OCHENTA','NOVENTA');

     Meses      : array [1..12] of string[10] = ('ENERO','FEBRERO','MARZO','ABRIL',
                  'MAYO','JUNIO','JULIO','AGOSTO','SEPTIEMBRE','OCTUBRE','NOVIEMBRE',
                  'DICIEMBRE');


procedure Traduce(Numero : Real); {Copyright La_Morsa Software Co.}

{Traduce un numero a palabras: ejemplo. 101 --> "ciento uno"}

Var
   Cadena       : String[9];
   Millones,
   Miles,
   Cienes       : String[3];
   Num1,
   Num2,
   Num3         : integer;
   Decen,
   D,
   U            : String[5];
   Codigo       : integer;
   Resultado    : String[255];
   j            : integer;
   Constante    : String[15];

begin
   Resultado:=''; Res:='';
   Str(Numero:9:0,Cadena);
   Millones:=Copy(Cadena,1,3);
   Miles:=Copy(Cadena,4,3);
   Cienes:=Copy(Cadena,7,3);

   {convierte espacios de cada cadena a 'ceros'}
   {(para evitar errores en la funcion VAL)    }

   for j:=1 to 3 do
   begin
     if Millones[j]=' ' then Millones[j]:='0';
     if Miles[j]=' ' then Miles[j]:='0';
     if Cienes[j]=' ' then Cienes[j]:='0';
   end;

   {Checa si ponemos 'MILLONES DE' o s"lo 'MILLONES'}

   Constante:= ' MILLONES ';
   Val(Millones,Num1,Codigo);
   Val(Miles,Num2,Codigo);
   Val(Cienes,Num3,Codigo);
   if ((Num1>1) and (Num2=0) and (Num3=0)) then Constante:=' MILLONES DE ';
   if ((Num1>1) and ((Num2<>0) or (Num3<>0))) then Constante:=' MILLONES ';
   if ((Num1=1) and ((Num2<>0) or (Num3<>0)))then Constante:=' MILLON ';
   if ((Num1=1) and (Num2=0) and (Num3=0)) then Constante:=' MILLON DE ';

   { Checamos para Millones }

   Val(Millones,Num1,Codigo);
   if Num1=100 then Resultado:='CIEN '+Constante
   else
   if ((Num1<>0) and (Num1<>100)) then
   begin
     Num1:=Num1 div 100;
     Resultado:=Cientos[Num1];
     Decen:=Copy(Millones,2,2);
     Val(Decen,Num1,Codigo);
     if Num1<31 then Resultado:=Resultado+' '+Numeros[Num1]+Constante
     else
     begin
       D:=Copy(Millones,2,1);
       Val(D,Num1,Codigo);
       Resultado:=Resultado+' '+Decenas[Num1];
       U:=Copy(Millones,3,1);
       Val(U,Num1,Codigo);
       if Num1>0 then Resultado:=Resultado+' Y '+Numeros[Num1]+Constante
       else Resultado:=Resultado+' '+Numeros[Num1]+Constante;
     end;
   end;

   { Checamos para Miles }

   Val(Miles,Num1,Codigo);
   if Num1=100 then Resultado:=Resultado+'CIEN MIL '
   else
   if Num1<>0 then
   begin
     Num1:=Num1 div 100;
     Resultado:=Resultado+Cientos[Num1];
     Decen:=Copy(Miles,2,2);
     Val(Decen,Num1,Codigo);
     if Num1<31 then Resultado:=Resultado+' '+Numeros[Num1]+ ' MIL '
     else
     begin
       D:=Copy(Miles,2,1);
       Val(D,Num1,Codigo);
       Resultado:=Resultado+' '+Decenas[Num1];
       U:=Copy(Miles,3,1);
       Val(U,Num1,Codigo);
       if Num1>0 then Resultado:=Resultado+' Y '+Numeros[Num1]+' MIL '
       else Resultado:=Resultado+' '+Numeros[Num1]+' MIL ';
     end;
   end;

   { Checamos para Cienes }

   Val(Cienes,Num1,Codigo);
   Constante:=' PESOS M.N.';
   if Num1=100 then Resultado:=Resultado+'CIEN '
   else
   if Num1<>0 then
   begin
     Num1:=Num1 div 100;
     Resultado:=Resultado+Cientos[Num1];
     Decen:=Copy(Cienes,2,2);
     Val(Decen,Num1,Codigo);
     if Num1<31 then Resultado:=Resultado+' '+Numeros[Num1]
     else
     begin
       D:=Copy(Cienes,2,1);
       Val(D,Num1,Codigo);
       Resultado:=Resultado+' '+Decenas[Num1];
       U:=Copy(Cienes,3,1);
       Val(U,Num1,Codigo);
       if Num1>0 then Resultado:=Resultado+' Y '+Numeros[Num1]
       else Resultado:=Resultado+' '+Numeros[Num1];
     end;
   end;
   Resultado:=Resultado+Constante;
   Resultado:=__CvtStr(Resultado,_REDUCE_WHITE_STR);
   writeln(Resultado); Res:=Resultado;
end; {Traduce}
0
Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 1

Author Comment

by:gsoldado
ID: 7115379
La verdad puede ser, pero como ves andamos ahorrativos por estos tiempos ;) el  código debo decir que esta execelente, si te apetece le cambias la palabra 'punto' por el signo '.' al separador decimal.

Gracias.

His code is perfect!!

I'm giving him an A

Anyways thanks to all of you guys, it was quite informative.

Alex
0
 
LVL 6

Expert Comment

by:DrDelphi
ID: 7116283
Bueno, estando los EEUU,uno se acostrumba a usar '.' en vez de ','. El codigo es tuyo, asi que no me sopresa nada que te gutste :-)... unicamente lo cambie un poquito para acceptar FLOAT. Suerte 'mano y gracias por los puntitos.

   


0
 
LVL 3

Expert Comment

by:lopem
ID: 7117324
Hola, DrDelphi... Saludos desde México

Manuel Lopez (lopem)
0
 
LVL 1

Author Comment

by:gsoldado
ID: 7117362
Yo soy de BoLiVia saludos a todos.
0
 
LVL 6

Expert Comment

by:DrDelphi
ID: 7117566
a ver... quien falta? Hay un Peruano por si acaso? Colombiche? <g>

0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
Microsoft Active Directory, the widely used IT infrastructure, is known for its high risk of credential theft. The best way to test your Active Directory’s vulnerabilities to pass-the-ticket, pass-the-hash, privilege escalation, and malware attacks …
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…

821 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question