![]() |
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 |
¿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 |
|
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 |
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 |
Cita:
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 |
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. |
Cita:
Saludos Y disculpen la lata es que soy un poco novato en esto Jmedina |
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 |
In en el form de impresion (QReport)... como lo uso??
Saludos! Lion |
Usa el evento BeforePrint del campo que quieres modificar.
|
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 ? |
Cita:
Saludos |
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 |
porque no lo guardas en una variable temporal y de ahi lo pasas al caption de tu etiqueta
|
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.
|
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
|
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 |
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:
Espero haber ayudado. |
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 22:11:13. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi