Solved

Numerical to literal

Posted on 2002-06-27
8
460 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

Enroll in May's Course of the Month

May’s Course of the Month is now available! Experts Exchange’s Premium Members and Team Accounts have access to a complimentary course each month as part of their membership—an extra way to increase training and boost professional development.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Delphi - replicating a form 8 112
Intraweb download file link ? 1 184
Twebbrowser add css to the header 3 53
Firemonkey how to swip panel with finger tap 1 41
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…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…
Finding and deleting duplicate (picture) files can be a time consuming task. My wife and I, our three kids and their families all share one dilemma: Managing our pictures. Between desktops, laptops, phones, tablets, and cameras; over the last decade…

739 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