Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Numerical to literal

Posted on 2002-06-27
8
Medium Priority
?
467 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 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
Independent Software Vendors: 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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

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.

Question has a verified solution.

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

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
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…
Are you ready to place your question in front of subject-matter experts for more timely responses? With the release of Priority Question, Premium Members, Team Accounts and Qualified Experts can now identify the emergent level of their issue, signal…
Look below the covers at a subform control , and the form that is inside it. Explore properties and see how easy it is to aggregate, get statistics, and synchronize results for your data. A Microsoft Access subform is used to show relevant calcul…

782 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