[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 468
  • Last Modified:

Numerical to literal

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
gsoldado
Asked:
gsoldado
  • 3
  • 2
  • 2
  • +1
1 Solution
 
DrDelphiCommented:
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
 
BoomersCommented:
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
 
lopemCommented:
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: 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.

 
gsoldadoAuthor Commented:
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
 
DrDelphiCommented:
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
 
lopemCommented:
Hola, DrDelphi... Saludos desde México

Manuel Lopez (lopem)
0
 
gsoldadoAuthor Commented:
Yo soy de BoLiVia saludos a todos.
0
 
DrDelphiCommented:
a ver... quien falta? Hay un Peruano por si acaso? Colombiche? <g>

0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

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

  • 3
  • 2
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now