Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Numeros a Letras!! (https://www.clubdelphi.com/foros/showthread.php?t=16603)

jmedina 03-12-2004 17:30:37

Numeros a Letras!!
 
Buen dia Foro:

Tengo un pequeño problemilla, espero me puedan ayudar, me he documentado en la conversion de numero a letras , por ejemplo, $1235.00 (mil DosCientos treinta y cinco pesos 00/100 M.N.) asi mismo en la informacion que encontre no pude lograr que funcione esto, en realidad no supe como hacerlo, alguien tiene una ejemplo mas sencillo, y me pueda decir en que parte de mi codigo ponerlo para que funcione.

Saludos
Jmedina

roman 03-12-2004 17:37:05

¿Cómo podemos darte un ejemplo más sencillo si no sabemos cuál es el ejemplo que viste? ¿Y cómo podemos saber en qué parte de tu código se pone si no vemos tu código?

En todo caso, en la sección de componentes del Club está la componente ATexto que convierte números a letras. Mírala a ver si te sirve.

// Saludos

Neftali [Germán.Estévez] 03-12-2004 17:52:45

¿Has probado el componente que hay en la sección componentes del Club?

En la carpeta de Conversion.

lionsoft 05-12-2004 01:24:27

Necesito usar el componente ATexto en un reporte QuickReport, o sea, dp de poner $ 200, necesito que lo diga en palabras. Como lo uso sobre reportes?
Ahh.. ademas necesito pasar la fecha (por eje: 04/12/2004) a letras... como hago?
Muchas gracias
Lion

jmedina 13-12-2004 18:39:01

numero a letras
 
He visto el Atexto que esta en el Foro pero la verdad no entiendo como llamarlo como, usarlo.

Alguien me puede explicar,

Saludos

Jmedina

roman 13-12-2004 19:02:37

Cita:

Empezado por jmedina
Alguien me puede explicar,

En la propiedad Numero pones la cantidad que desees, por ejemplo:

Letras1.Numero := 1425.3;

Para obtener el número escrito en letras usas la propiedad AsString:

Edit1.Text := Letras1.AsString;

Con lo que obtendrás:

"mil cuatrocientos veinticinco con treinta"

Las propiedades Moneda y Centavos te sirven para indicar cómo quieres nombrar las unidades y los decimales. Por ejemplo, si pones

Letras1.Monedas := 'euros';
Letras1.Monedas.Centavos := 'centavos';

la propiedad AsString te dará:

"mil cuatrocientos veinticinco euros con treinta centavos"

La propiedad Masculino es para indicar su quieres que el texto esté en género masculino o femenino. Así, si pones

Letras1.Moneda := 'mujeres';
Letras1.Centavos := 'niñas';
Letras1.Numero := 3.04;
Letras1.Masculino := false;

La propiedad AsString te dará:

"tres mujeres con cuatro niñas"

Finalmente, la propiedad Separador me parece que es para indicar el separador decimal (punto, coma o el que uses).

// Saludos

llonigualker 14-12-2004 10:17:37

Mira, aqui tienes una funcion parecida y ademas te da la posibilidad de traducir los numeros al catalan.

(**************************************)
(* Conversión Número -> Letra *)
(* *)
(* Parámetros: *)
(* *)
(* mNum: Número a convertir *)
(* iIdioma: Idioma de conversión *)
(* 1 -> Castellano *)
(* 2 -> Catalán *)
(* iModo: Modo de conversión *)
(* 1 -> Masculino *)
(* 2 -> Femenino *)
(* *)
(* Restricciones: *)
(* *)
(* - Redondeo a dos decimales *)
(* - Rango: 0,00 a 999.999.999.999,99 *)
(* *)
(**************************************)

function NumLetra(const mNum: Currency; const iIdioma, iModo: Smallint): String;
const
iTopFil: Smallint = 6;
iTopCol: Smallint = 10;
aCastellano: array[0..5, 0..9] of PChar =
( ('UNA ','DOS ','TRES ','CUATRO ','CINCO ',
'SEIS ','SIETE ','OCHO ','NUEVE ','UN '),
('ONCE ','DOCE ','TRECE ','CATORCE ','QUINCE ',
'DIECISEIS ','DIECISIETE ','DIECIOCHO ','DIECINUEVE ',''),
('DIEZ ','VEINTE ','TREINTA ','CUARENTA ','CINCUENTA ',
'SESENTA ','SETENTA ','OCHENTA ','NOVENTA ','VEINTI'),
('CIEN ','DOSCIENTAS ','TRESCIENTAS ','CUATROCIENTAS ','QUINIENTAS ',
'SEISCIENTAS ','SETECIENTAS ','OCHOCIENTAS ','NOVECIENTAS ','CIENTO '),
('CIEN ','DOSCIENTOS ','TRESCIENTOS ','CUATROCIENTOS ','QUINIENTOS ',
'SEISCIENTOS ','SETECIENTOS ','OCHOCIENTOS ','NOVECIENTOS ','CIENTO '),
('MIL ','MILLON ','MILLONES ','CERO ','Y ',
'UNO ','DOS ','CON ','','') );
aCatalan: array[0..5, 0..9] of PChar =
( ( 'UNA ','DUES ','TRES ','QUATRE ','CINC ',
'SIS ','SET ','VUIT ','NOU ','UN '),
( 'ONZE ','DOTZE ','TRETZE ','CATORZE ','QUINZE ',
'SETZE ','DISSET ','DIVUIT ','DINOU ',''),
( 'DEU ','VINT ','TRENTA ','QUARANTA ','CINQUANTA ',
'SEIXANTA ','SETANTA ','VUITANTA ','NORANTA ','VINT-I-'),
( 'CENT ','DOS-CENTES ','TRES-CENTES ','QUATRE-CENTES ','CINC-CENTES ',
'SIS-CENTES ','SET-CENTES ','VUIT-CENTES ','NOU-CENTES ','CENT '),
( 'CENT ','DOS-CENTS ','TRES-CENTS ','QUATRE-CENTS ','CINC-CENTS ',
'SIS-CENTS ','SET-CENTS ','VUIT-CENTS ','NOU-CENTS ','CENT '),
( 'MIL ','MILIO ','MILIONS ','ZERO ','-',
'UN ','DOS ','AMB ','','') );
var
aTexto: array[0..5, 0..9] of PChar;
cTexto, cNumero: String;
iCentimos, iPos: Smallint;
bHayCentimos, bHaySigni: Boolean;

(*************************************)
(* Cargar Textos según Idioma / Modo *)
(*************************************)

procedure NumLetra_CarTxt;
var
i, j: Smallint;
begin
(* Asignación según Idioma *)

for i := 0 to iTopFil - 1 do
for j := 0 to iTopCol - 1 do
case iIdioma of
1: aTexto[i, j] := aCastellano[i, j];
2: aTexto[i, j] := aCatalan[i, j];
else
aTexto[i, j] := aCastellano[i, j];
end;

(* Asignación si Modo Masculino *)

if (iModo = 1) then
begin
for j := 0 to 1 do
aTexto[0, j] := aTexto[5, j + 5];

for j := 0 to 9 do
aTexto[3, j] := aTexto[4, j];
end;
end;

(****************************)
(* Traducir Dígito -Unidad- *)
(****************************)

procedure NumLetra_Unidad;
begin
if not( (cNumero[iPos] = '0') or (cNumero[iPos - 1] = '1')
or ((Copy(cNumero, iPos - 2, 3) = '001') and ((iPos = 3) or (iPos = 9))) ) then
if (cNumero[iPos] = '1') and (iPos <= 6) then
cTexto := cTexto + aTexto[0, 9]
else
cTexto := cTexto + aTexto[0, StrToInt(cNumero[iPos]) - 1];

if ((iPos = 3) or (iPos = 9)) and (Copy(cNumero, iPos - 2, 3) <> '000') then
cTexto := cTexto + aTexto[5, 0];

if (iPos = 6) then
if (Copy(cNumero, 1, 6) = '000001') then
cTexto := cTexto + aTexto[5, 1]
else
cTexto := cTexto + aTexto[5, 2];
end;

(****************************)
(* Traducir Dígito -Decena- *)
(****************************)

procedure NumLetra_Decena;
begin
if (cNumero[iPos] = '0') then
Exit
else if (cNumero[iPos + 1] = '0') then
cTexto := cTexto + aTexto[2, StrToInt(cNumero[iPos]) - 1]
else if (cNumero[iPos] = '1') then
cTexto := cTexto + aTexto[1, StrToInt(cNumero[iPos + 1]) - 1]
else if (cNumero[iPos] = '2') then
cTexto := cTexto + aTexto[2, 9]
else
cTexto := cTexto + aTexto[2, StrToInt(cNumero[iPos]) - 1]
+ aTexto[5, 4];
end;

(*****************************)
(* Traducir Dígito -Centena- *)
(*****************************)

procedure NumLetra_Centena;
var
iPos2: Smallint;
begin
if (cNumero[iPos] = '0') then
Exit;

iPos2 := 4 - Ord(iPos > 6);

if (cNumero[iPos] = '1') and (Copy(cNumero, iPos + 1, 2) <> '00') then
cTexto := cTexto + aTexto[iPos2, 9]
else
cTexto := cTexto + aTexto[iPos2, StrToInt(cNumero[iPos]) - 1];
end;

(**************************************)
(* Eliminar Blancos previos a guiones *)
(**************************************)

procedure NumLetra_BorBla;
var
i: Smallint;
begin
i := Pos(' -', cTexto);

while (i > 0) do
begin
Delete(cTexto, i, 1);
i := Pos(' -', cTexto);
end;
end;

begin
(* Control de Argumentos *)

if (mNum < 0.00) or (mNum > 999999999999.99) or (iIdioma < 1) or (iIdioma > 2)
or (iModo < 1) or (iModo > 2) then
begin
Result := 'ERROR EN ARGUMENTOS';
Abort;
end;

(* Cargar Textos según Idioma / Modo *)

NumLetra_CarTxt;

(* Bucle Exterior -Tratamiento Céntimos- *)
(* NOTA: Se redondea a dos dígitos decimales *)

cNumero := Trim(Format('%12.0f', [Int(mNum)]));
cNumero := StringOfChar('0', 12 - Length(cNumero)) + cNumero;
iCentimos := Trunc((Frac(mNum) * 100) + 0.5);

repeat
(* Detectar existencia de Céntimos *)

if (iCentimos <> 0) then
bHayCentimos := True
else
bHayCentimos := False;

(* Bucle Interior -Traducción- *)

bHaySigni := False;

for iPos := 1 to 12 do
begin
(* Control existencia Dígito significativo *)

if not(bHaySigni) and (cNumero[iPos] = '0') then
Continue
else
bHaySigni := True;

(* Detectar Tipo de Dígito *)

case ((iPos - 1) mod 3) of
0: NumLetra_Centena;
1: NumLetra_Decena;
2: NumLetra_Unidad;
end;
end;

(* Detectar caso 0 *)

if (cTexto = '') then
cTexto := aTexto[5, 3];

(* Traducir Céntimos -si procede- *)

if (iCentimos <> 0) then
begin
cTexto := cTexto + aTexto[5, 7];
cNumero := Trim(Format('%.12d', [iCentimos]));
iCentimos := 0;
end;
until not (bHayCentimos);

(* Eliminar Blancos innecesarios -sólo Catalán- *)

if (iIdioma = 2) then
NumLetra_BorBla;

(* Retornar Resultado *)

Result := Trim(cTexto);
end;

Saludos.

jmedina 14-12-2004 22:09:50

Cita:

Empezado por roman
En la propiedad Numero pones la cantidad que desees, por ejemplo:

Letras1.Numero := 1425.3;

Para obtener el número escrito en letras usas la propiedad AsString:

Edit1.Text := Letras1.AsString;

Con lo que obtendrás:

"mil cuatrocientos veinticinco con treinta"

Las propiedades Moneda y Centavos te sirven para indicar cómo quieres nombrar las unidades y los decimales. Por ejemplo, si pones

Letras1.Monedas := 'euros';
Letras1.Monedas.Centavos := 'centavos';

la propiedad AsString te dará:

"mil cuatrocientos veinticinco euros con treinta centavos"

La propiedad Masculino es para indicar su quieres que el texto esté en género masculino o femenino. Así, si pones

Letras1.Moneda := 'mujeres';
Letras1.Centavos := 'niñas';
Letras1.Numero := 3.04;
Letras1.Masculino := false;

La propiedad AsString te dará:

"tres mujeres con cuatro niñas"

Finalmente, la propiedad Separador me parece que es para indicar el separador decimal (punto, coma o el que uses).

// Saludos

Ok en este caso si le entiendo, pero por ejemplo esto lo puedo aplicar en el evento onclick de algun boton que yo inerte, o algo parecido, es decir no se si me puedan decir como es que ejecuto este codigo, por ejemplo se me ocurre que cuando salga de una caja de texto, en la cual contiene la cantidad a convertir ahi puedo hacer la conversion, o bien como la realizaria

Saludos
Y disculpen la lata es que soy un poco novato en esto
Jmedina

Lepe 15-12-2004 12:35:39

Si no sabes cuando lo necesitas, entonces es que NO lo necesitas :D

que tal en el evento OnExit de la cajita que tiene el número?
que tal en el OnKey Pressed ?

Saludos

lionsoft 17-12-2004 16:36:34

In en el form de impresion (QReport)... como lo uso??
Saludos!
Lion

Lepe 17-12-2004 19:14:01

Usa el evento BeforePrint del campo que quieres modificar.

lionsoft 18-01-2005 13:52:19

Intenté usar el componente ATexto en el reporte (QReport).

En el evento BeforePrint, intenté tomar la expresion que tengo como resultado de una suma y poner dicho valor en letras, en un label de reporte.

Pero no se puede. No se como levantar el resultado que arroja la expresion. Si utilizo la propiedad .value o .caption me da la expresion de sum (SUM bla bla bla).

Alguien me puede decir como imprimo esto?

Muchas gracias!

Lion

PD: como se instala el componente ATexto en Delphi 6 ?

Pablo Carlos 19-01-2005 00:46:00

Cita:

Empezado por lionsoft
Alguien me puede decir como imprimo esto?

Mira este código.....
Código Delphi [-]
procedure TfrmImprimirRecibo.FormCreate(Sender: TObject);
begin
{ ImporteRecibo es el nombre del componente aTexto
Numero propiedad de aTexto 
qRboProfesor es un query cuyo field rp_Importe es un campo de una tabla
Importe.Caption es qrLabel := importe recibido es el valor del campo pasado a texto--- espero que sea claro, fijate el evento que uso 
}
  ImporteRecibo.Numero := dmQuerys.qRboProfesor.FieldByName('RP_Importe').Value;
  Importe.Caption := ImporteRecibo.AsString;
end;

Saludos

lionsoft 08-03-2005 19:35:25

Estoy bastante cerca de entender como usar el componente.

El drama surge, en que yo ya tengo una expresion que tiene la sumatoria de otras expresiones.
Lo que necesito es poder levantar ese valor numerico. Si uso la propiedad "caption", obtendré el texto SUM(...) que no es lo que busco.

Como puedo hacer para obtener el valor numerico qued muestra la expresion en pantalla, para asi poder cargarselo al componente ATexto?

Saludos y muchas gracias!!
Lion

torito 08-03-2005 20:52:40

porque no lo guardas en una variable temporal y de ahi lo pasas al caption de tu etiqueta

lionsoft 17-03-2005 15:58:56

Esa es la idea... guardarlo en una variable temporal. Pero el problema es como obtener ese valor.. ese numero. Lo que obtengo es la expresion de sumatoria, la cual no me interesa.

torito 17-03-2005 17:10:15

ok, entonces como que no comprendo, yo te recomiendo que si es una suma, generes una variable global y tu formula de suma la pongas en el evento afterscroll de tu tabla y tu etiqueta la iguales a esa variable, asi al final te aparecerá el valor total de tu suma en el reporte

Lepe 18-03-2005 12:35:56

Seguro que no me explicado con claridad, aunque tampoco se dice
exactamente donde está el campo que suma, y donde quieres poner el texto
en letras.

En principio, puedes poner un QRExpr, o un QRlabel en el QuickReport y en el
evento BeforePrint de ese componente, acceder al valor de la suma con:

dbtSuma.Value o bien con
dbtSumaYSigue.Value.dblResult si el campo es de tipo double.

Debes tener en cuenta algo importante:
Si te devuelve el valor "sum(importe)" es que te estas apresurando a coger un
valor que todavia no se ha evaluado.

De lo anterior deduzco que necesitas conocer el texto en letras antes
que la suma del importe


La solución es crearte otra consulta independiente, que haga lo mismo que la
anterior, pero que solo sume el importe (o el campo que sea), así tienes el
valor justo cuando lo necesites.

un saludote

Lepe 18-03-2005 12:49:17

Aclaro un poco más:

suponemos que tienes una tabla TblDetalles donde tienes el campo Importe y quieres sacar la suma de todos los importes.

Pues bien, create una consulta llamada qryImporte que sea asi:
select sum(importe) from Detalles where codigoFactura = :Codigo

Ahora en el QuickReport pones un QRlabel, y en el evento beforePrint haces
esto:
Código Delphi [-]
var Suma:currency
begin
QryImporte.parambyname('Codigo').asinteger := 3  //hallamos la suma para
// el codigo 3 
qryImporte.open;
Suma := qryImporte.fields[0].ascurrency;
qryImporte.close; // ya no lo necesitamos mas
Letras1.Numero := Suma;
qrlabel1.caption := Letras1.AsString;

Espero haber ayudado.

lynx 20-10-2005 03:18:35

covertir a letras una cifra
 
Saludos, necesito convertir una cantidad a letras pero que me separe los centavos es decir 115.23 (Ciento Quince Pesos 23/100 MN) ya utilize el componente Atexto solo que no encuentro la manera de separar los centavos (23/100) ¿Alguien podria Ayudarme?


La franja horaria es GMT +2. Ahora son las 18:49:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi