Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Numerical to literal

Posted on 2002-06-27
8
Medium Priority
?
466 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 400 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
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
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: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying 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

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
This tutorial will teach you the special effect of super speed similar to the fictional character Wally West aka "The Flash" After Shake : http://www.videocopilot.net/presets/after_shake/ All lightning effects with instructions : http://www.mediaf…
How to fix incompatible JVM issue while installing Eclipse While installing Eclipse in windows, got one error like above and unable to proceed with the installation. This video describes how to successfully install Eclipse. How to solve incompa…
Suggested Courses

722 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