PDA

Ver la Versión Completa : Convierte de Numeros a Letras mas Decimales


Arturo_
13-07-2007, 19:02:14
// **** SPLASH ****
// Por: Arturo Vidal Gómez
// Versión: 1.000.000
// Copyright © 1980, 2007
// Derechos - Reservados
// Arequipa, Perú
// PASCAL - DELPHI (Client Server Suite)
// Ingeniería de Software

unit Splash;

interface

uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, jpeg, Gauges, DateUtils;

// For NumbersToLetters
const
// Table Unidades 0 - 9
LIBRARY_Table_0001 : packed array[0..9] of string =
('CERO', 'UNO', 'DOS', 'TRES', 'CUATRO', 'CINCO',
'SEIS', 'SIETE', 'OCHO', 'NUEVE');
// Table Decenas 10 - 19
LIBRARY_Table_0002 : packed array[0..9] of string =
('DIEZ', 'ONCE', 'DOCE', 'TRECE', 'CATORCE', 'QUINCE',
'DIECISEIS', 'DIECISIETE', 'DIECIOCHO', 'DIECINUEVE');
// Table Decenas 20 - 90
LIBRARY_Table_0003 : packed array[2..9] of string =
('VEINTE', 'TREINTA', 'CUARENTA', 'CINCUENTA',
'SESENTA', 'SETENTA', 'OCHENTA', 'NOVENTA');
// Table Centenas 100 - 900
LIBRARY_Table_0004 : packed array[0..9] of string =
('', 'CIEN', 'DOSCIENTOS', 'TRESCIENTOS', 'CUATROCIENTOS',
'QUINIENTOS', 'SEISCIENTOS', 'SETENCIENTOS',
'OCHOCIENTOS', 'NOVECIENTOS');

const
SubChar_ON : Boolean = True; // Enabled Reemplazar UNO por UN
SubChar_OFF : Boolean = False; // Disabled Reemplazar UNO por UN
Sep_NULL : Integer = 0; // Value NULL
Sep_MIL : Integer = 1; // Separador de Miles
Sep_MILLON : Integer = 2; // Separador de Millones

const
asm_POINT : string = '.';
asm_COMET : string = ',';
asm_DECIMALS : string = '0000000000';
asm_VALID : set of char = ['0'..'9', '.', ','];

var
lib_RESULT_CNA : string;
lib_DIGITS_ALF : string;
lib_DIGITS_INT : string;
lib_DIGITS_DEC : string;
lib_TYPE : string;

// INTERFACE Procedimientos para Conversiones

function NumbersToLetters(pmt_NUMBER, pmt_TYPE: string; pmt_DEC: Integer): string; export;
implementation

{$R *.DFM}
// IMPLEMENTATION Procedimientos para Conversiones

// NumbersToLetters Numeros a Letras
function NumbersToLetters(pmt_NUMBER, pmt_TYPE: string; pmt_DEC: Integer): string; export;
var
Loop : Integer;
// Seleccionar TIPO 1 2 ó 3
// TIPO 1 = 0 para las Unidades
// TIPO 2 = 00 para las Decenas
// TIPO 3 = 000 para las Centenas
// 12 Digitos y n Decimales
// 999,000,000,000.00
function Select_TYPE(pmt_DIGITS_INT: string; Flag_SUB: Boolean;
Flag_SEP: Integer): string;
// Seleccionar Separador MIL MILLON...
procedure Select_SEP(pmt_DIGITS_INT: string; Flag_SUB: Boolean;
Flag_SEP: Integer);
begin
if (Flag_SUB) and
(Length(lib_DIGITS_INT) >= 4) and
(Length(lib_DIGITS_INT) <= 12) then
begin
if Flag_SEP = sep_MIL then
lib_DIGITS_ALF := lib_DIGITS_ALF + ' MIL '
else
if Flag_SEP = sep_MILLON then
begin
lib_DIGITS_ALF := lib_DIGITS_ALF + ' MILLONES ';
// Elimina 'ES' de 'MILLONES' si Primer Digito es 1
if (Length(lib_DIGITS_INT) = 7) and
(Copy(pmt_DIGITS_INT, 1, 1) = '1') then
SYSTEM.Delete(lib_DIGITS_ALF, 10, 2);
end;
end;
end;
begin
(* DIGITS = 1 *)
if (Length(pmt_DIGITS_INT) = 1) then
begin
lib_DIGITS_ALF := LIBRARY_Table_0001[StrToInt(pmt_DIGITS_INT)];
// Remplaza UNO por UN
if (Flag_SUB) and
(Copy(pmt_DIGITS_INT, 1, 1) = '1') then
SYSTEM.Delete(lib_DIGITS_ALF, Length(lib_DIGITS_ALF), 1);
Select_SEP(pmt_DIGITS_INT, Flag_SUB, Flag_SEP);
end;
(* DIGITS = 2 *)
if (Length(pmt_DIGITS_INT) = 2) then
begin
// Asigna de 10 - 19
if (Copy(pmt_DIGITS_INT, 1, 1) = '1') then
lib_DIGITS_ALF := LIBRARY_Table_0002[StrToInt(Copy(pmt_DIGITS_INT, 2, 1))]
// Asigna de 20 a 99
else
begin
// Asigna de 20 a 90 Decenas
lib_DIGITS_ALF := LIBRARY_Table_0003[StrToInt(Copy(pmt_DIGITS_INT, 1, 1))];
// Asigna de 20 a 90 Decenas y 21 a 99 Unidades
if (Copy(pmt_DIGITS_INT, 2, 1) <> '0') then
begin
lib_DIGITS_ALF := Copy(lib_DIGITS_ALF, 1, Length(lib_DIGITS_ALF) - 2)
+ 'TI' + LIBRARY_Table_0001[StrToInt(Copy(pmt_DIGITS_INT, 2, 1))];
// Remplaza UNO por UN
if (Flag_SUB) and
(Copy(pmt_DIGITS_INT, 2, 1) = '1') then
SYSTEM.Delete(lib_DIGITS_ALF, Length(lib_DIGITS_ALF), 1);
end;
end;
Select_SEP(pmt_DIGITS_INT, Flag_SUB, Flag_SEP);
end;
(* DIGITS = 3 *)
if (Length(pmt_DIGITS_INT) = 3) then
begin
// Salir si los tres Digitos son cero
if (Copy(pmt_DIGITS_INT, 1, 1) = '0') and
(Copy(pmt_DIGITS_INT, 2, 1) = '0') and
(Copy(pmt_DIGITS_INT, 3, 1) = '0') then
begin
Select_TYPE := '';
Exit;
end;
// Asignar Centenas
lib_DIGITS_ALF := LIBRARY_Table_0004[StrToInt(Copy(pmt_DIGITS_INT, 1, 1))];
// Si el Primer Digito es 1 de 100 a 199 Agregar 'TO'
if (Copy(pmt_DIGITS_INT, 1, 1) = '1') and
((Copy(pmt_DIGITS_INT, 2, 1) <> '0') or
(Copy(pmt_DIGITS_INT, 3, 1) <> '0')) then
lib_DIGITS_ALF := lib_DIGITS_ALF + 'TO '
// Si no Agregar Espacio en Blanco si Primer
// Digito de la Centena no es 0
else
if (Copy(pmt_DIGITS_INT, 1, 1) <> '0') then
lib_DIGITS_ALF := lib_DIGITS_ALF + ' ';
// Si son Centenas Asignar y Salir
if (Copy(pmt_DIGITS_INT, 2, 1) = '0') and
(Copy(pmt_DIGITS_INT, 3, 1) = '0') then
begin
Select_SEP(pmt_DIGITS_INT, Flag_SUB, Flag_SEP);
Select_TYPE := lib_DIGITS_ALF;
Exit;
end;
// Asignar Unidades en Base a Decenas y
// Asignar Decenas en Base a Centenas
// Unidades
if (Copy(pmt_DIGITS_INT, 2, 1) = '0') then
begin
lib_DIGITS_ALF := lib_DIGITS_ALF
+ LIBRARY_Table_0001[StrToInt(Copy(pmt_DIGITS_INT, 3, 1))];
// Remplaza UNO por UN
if (Flag_SUB) and
(Copy(pmt_DIGITS_INT, 2, 1) = '0') and
(Copy(pmt_DIGITS_INT, 3, 1) = '1') then
SYSTEM.Delete(lib_DIGITS_ALF, Length(lib_DIGITS_ALF), 1);
end
// Decenas 10 - 19
else
if (Copy(pmt_DIGITS_INT, 2, 1) = '1') then
lib_DIGITS_ALF := lib_DIGITS_ALF
+ LIBRARY_Table_0002[StrToInt(Copy(pmt_DIGITS_INT, 3, 1))];
// Decenas 20 - 99
if (Copy(pmt_DIGITS_INT, 2, 1) >= '2') then
begin
lib_DIGITS_ALF := lib_DIGITS_ALF
+ LIBRARY_Table_0003[StrToInt(Copy(pmt_DIGITS_INT, 2, 1))];
if (Copy(pmt_DIGITS_INT, 3, 1) <> '0') then
begin
lib_DIGITS_ALF := Copy(lib_DIGITS_ALF, 1, Length(lib_DIGITS_ALF) - 2)
+ 'TI' + LIBRARY_Table_0001[StrToInt(Copy(pmt_DIGITS_INT, 3, 1))];
// Remplaza UNO por UN
if (Flag_SUB) and
(Copy(pmt_DIGITS_INT, 3, 1) = '1') then
SYSTEM.Delete(lib_DIGITS_ALF, Length(lib_DIGITS_ALF), 1);
end;
end;
Select_SEP(pmt_DIGITS_INT, Flag_SUB, Flag_SEP);
end;
Select_TYPE := lib_DIGITS_ALF;
end;
// Main
begin
// Validación Entrada
if (pmt_NUMBER = '') then
begin
NumbersToLetters := '';
Exit;
end;
// Validación de Digitos
for Loop := 1 to Length(pmt_NUMBER) do
begin
if not (pmt_NUMBER[Loop] in asm_VALID) then
begin
NumbersToLetters := 'ERROR: No se Permiten Caracteres Alfabeticos.';
Exit;
end;
end;
// Longitud Permitida en Digitos
if (Pos(asm_POINT, pmt_NUMBER) - 1 > 12) or
(Pos(asm_COMET, pmt_NUMBER) - 1 > 12) then
begin
NumbersToLetters := 'Solo se Permiten Hasta (12) Enteros y (02) Decimales';
Exit;
end;
// Inicializar
lib_RESULT_CNA := '';
lib_DIGITS_ALF := '';
lib_DIGITS_INT := '';
lib_DIGITS_DEC := '';
lib_TYPE := '';
// Seleccionar Tipo de Moneda
if (pmt_TYPE = vk_SOLES) then lib_TYPE := vk_SOLES
else if (pmt_TYPE = vk_DOLAR) then lib_TYPE := vk_DOLAR;
// Extraer Numero Entero y Decimales
if (Pos(asm_POINT, pmt_NUMBER) <> 0) then
begin
lib_DIGITS_INT := Copy(pmt_NUMBER, 1, Pos(asm_POINT, pmt_NUMBER) - 1);
lib_DIGITS_DEC := Copy(pmt_NUMBER, Pos(asm_POINT, pmt_NUMBER) + 1, pmt_DEC);
end
else
if (Pos(asm_COMET, pmt_NUMBER) <> 0) then
begin
lib_DIGITS_INT := Copy(pmt_NUMBER, 1, Pos(asm_COMET, pmt_NUMBER) - 1);
lib_DIGITS_DEC := Copy(pmt_NUMBER, Pos(asm_COMET, pmt_NUMBER) + 1, pmt_DEC);
end
else
begin
lib_DIGITS_INT := pmt_NUMBER;
lib_DIGITS_DEC := Copy(asm_DECIMALS, 1, pmt_DEC);
end;
// Execute_NOW ****
// Length = 1 Format: 9
if Length(lib_DIGITS_INT) = 1 then
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 1), SubChar_OFF, Sep_NULL)
// Length = 2 Format: 99
else
if Length(lib_DIGITS_INT) = 2 then
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 2), SubChar_OFF, Sep_NULL)
// Length = 3 Format: 999
else
if Length(lib_DIGITS_INT) = 3 then
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 3), SubChar_OFF, Sep_NULL)
// Length = 4 Format: 9 999
else
if Length(lib_DIGITS_INT) = 4 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 1), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 2, 3), SubChar_OFF, Sep_NULL);
end
// Length = 5 Format: 99 999
else
if Length(lib_DIGITS_INT) = 5 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 2), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 3, 3), SubChar_OFF, Sep_NULL);
end
// Length = 6 Format: 999 999
else
if Length(lib_DIGITS_INT) = 6 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 4, 3), SubChar_OFF, Sep_NULL);
end
// Length = 7 Format: 9 999 999
else
if Length(lib_DIGITS_INT) = 7 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 1), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 2, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 5, 3), SubChar_OFF, Sep_NULL);
end
// Length = 8 Format: 99 999 999
else
if Length(lib_DIGITS_INT) = 8 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 2), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 3, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 6, 3), SubChar_OFF, Sep_NULL);
end
// Length = 9 Format: 999 999 999
else
if Length(lib_DIGITS_INT) = 9 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 3), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 4, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 7, 3), SubChar_OFF, Sep_NULL);
end
// Length = 10 Format: 9 999 999 999
else
if Length(lib_DIGITS_INT) = 10 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 1), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 2, 3), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 5, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 8, 3), SubChar_OFF, Sep_NULL);
end
// Length = 11 Format: 99 999 999 999
else
if Length(lib_DIGITS_INT) = 11 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 2), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 3, 3), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 6, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 9, 3), SubChar_OFF, Sep_NULL);
end
// Length = 12 Format: 999 999 999 999
else
if Length(lib_DIGITS_INT) = 12 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 4, 3), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 7, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 10, 3), SubChar_OFF, Sep_NULL);
end;
// Asignar Resultado
SYSTEM.Insert('SON: ', lib_RESULT_CNA, 1);
lib_RESULT_CNA := lib_RESULT_CNA + ' Y ' + lib_DIGITS_DEC + '/100' + lib_TYPE;
NumbersToLetters := lib_RESULT_CNA;
end;

end.

//Edite: Para colocar etiquetas DELPHI.

jhonny
13-07-2007, 19:11:26
Por favor, usa las etiquetas DELPHI, para que podamos apreciar mejor dicho codigo... Además, si quieres compartir tus tips de codigo con nosotros, sería muy interesante si lo colocaras en la sección de trucos (http://www.clubdelphi.com/trucos/) del club.

ContraVeneno
13-07-2007, 19:25:58
En la sección de trucos ya existe uno:

http://www.clubdelphi.com/trucos/index.php?id=208&scroll=0&scrollb=0

De hecho, el que se puso originalmente, tiene una que otra falla.

Por eso decidí colocar mi propuesta, pero nadie la ha comentado, la cuál es más compacta y con menos ciclos. :D
pero bueno, yo no soy el experto.

------edito

Arturo, ¿para que son estas unidades: Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, jpeg, Gauges, DateUtils ?

No veo la definición de pmt_Type... :(
Ni tampoco nada de lo que tienes como asm_*

jhonny
13-07-2007, 19:33:34
:D
pero bueno, yo no soy el experto.


Mmmmmhhhh, ¿Se delicó? :D :D :D

Arturo_
13-07-2007, 20:05:42
Las unidades incluidas son para otro tipo de trabajo lo que he hecho es extraer parte del codigo de un modulo de mis sistemas y la variable pmt_TYPE tiene su función estudialo y te daras cuenta

Arturo_
13-07-2007, 20:10:45
Otra cosa en que parte de la sección trucos puedo insertar m codigo ha compartir ó lo pongo en foros.
http://www.clubdelphi.com/foros/images/icons/icon10.gif

ContraVeneno
13-07-2007, 22:58:49
¿o sea que pmt_type y todo lo que tienes como asm_* lo tengo que declarar yo ?

Arturo_
13-07-2007, 23:10:09
Mi estimado veneno esas variables eran de una versión anterior no tienes que declararlas si deseas las eliminas, y las unidades extras de la cabecera pertenecen a otras rutinas que no se encuentas en el Modulo SPLASH.

Claro esta que esta rutina de Converción funciona a la perfección la tengo instalada en varias empresas.

egostar
13-07-2007, 23:13:07
Amigo ContraVeneno pmt_TYPE si está declarada como parte de una función.


function NumbersToLetters(pmt_NUMBER, pmt_TYPE: string; pmt_DEC: Integer): string; export;


Lo que no veo por ningún lado son los asm_* seguro están declarados en otra de las unidades.

Salud OS.

Arturo_
13-07-2007, 23:17:23
ya te puse los asm me los olvide disculpa ok.........

ContraVeneno
13-07-2007, 23:32:15
Estoy tratando de probarlo, pero me marca error al querer compilarlo:

[Pascal Error] E1026 File not found: 'splash.DFM'

en delphi 2006

Seguro esto no tiene nada que ver con el código y me esta faltanto habilitar alguna otra cosa, pero me declaro ignorante en este aspecto.

¿alguna idea?

Arturo_
13-07-2007, 23:35:47
Ese error se debe a que yo cree un modulo con una form, y esta rutina, la agregue al la form, lo que tienes que hacer es extraer el procedimiento y todas sus constantes y variables y copiarlo en uno tuyo y asi podras compilarlo sin errores.

ContraVeneno
13-07-2007, 23:59:29
listo, ya quedó :D sí funciona.

Aunque me quedo con la versión que tengo porque en México sería
"sesenta y cinco", no "sesenticinco".

Saludos :)

Arturo_
14-07-2007, 00:08:07
Pero eso es facil de modificar en la parte que dice + 'TI' en vez de sumar 'TI' suma ' Y' y listo.

Puedes modificar la rutina ya que tienes el codigo fuente de repente hasta la mejoras y me avisas.

ContraVeneno
14-07-2007, 00:17:04
Con los centavos de una vez tambien en letra:

Function CantidadEnLetra(curCantidad: Currency; MonNal: integer): String;
var i: integer;
Cantidad, Centavos: Currency;
BloqueCero, NumeroBloques, Digito: Byte;
PrimerDigito, SegundoDigito, TercerDigito: Byte;
Resultado, Temp, strCentavos, Bloque: String;
Unidades: Array[0..28] of String;
Decenas: Array[0..8] of String;
Centenas: Array[0..8] of String;
begin

Unidades[0] := 'UN'; Unidades[1] := 'DOS'; Unidades[2] := 'TRES'; Unidades[3] := 'CUATRO';
Unidades[4] := 'CINCO'; Unidades[5] := 'SEIS'; Unidades[6] := 'SIETE'; Unidades[7] := 'OCHO';
Unidades[8] := 'NUEVE'; Unidades[9] := 'DIEZ'; Unidades[10] := 'ONCE'; Unidades[11] := 'DOCE';
Unidades[12] := 'TRECE'; Unidades[13] := 'CATORCE'; Unidades[14] := 'QUINCE'; Unidades[15] := 'DIECISÉIS';
Unidades[16] := 'DIECISIETE'; Unidades[17] := 'DIECIOCHO'; Unidades[18] := 'DIECINUEVE';
Unidades[19] := 'VEINTE'; Unidades[20] := 'VEINTIUNO'; Unidades[21] := 'VEINTIDÓS';
Unidades[22] := 'VEINTITRÉS'; Unidades[23] := 'VEINTICUATRO'; Unidades[24] := 'VEINTICINCO';
Unidades[25] := 'VEINTISÉIS'; Unidades[26] := 'VEINTISIETE'; Unidades[27] := 'VEINTIOCHO'; Unidades[28] := 'VEINTINUEVE';

Decenas[0] := 'DIEZ'; Decenas[1] := 'VEINTE'; Decenas[2] := 'TREINTA'; Decenas[3] := 'CUARENTA';
Decenas[4] := 'CINCUENTA'; Decenas[5] := 'SESENTA'; Decenas[6] := 'SETENTA'; Decenas[7] := 'OCHENTA'; Decenas[8] := 'NOVENTA';

Centenas[0] := 'CIENTO'; Centenas[1] := 'DOSCIENTOS'; Centenas[2] := 'TRESCIENTOS'; Centenas[3] := 'CUATROCIENTOS';
Centenas[4] := 'QUINIENTOS'; Centenas[5] := 'SEISCIENTOS'; Centenas[6] := 'SETECIENTOS'; Centenas[7] := 'OCHOCIENTOS'; Centenas[8] := 'NOVECIENTOS';

Cantidad := Trunc(curCantidad);
Centavos := (curCantidad - Cantidad) * 100;
NumeroBloques := 1;
Repeat
PrimerDigito := 0;
SegundoDigito := 0;
TercerDigito := 0;
Bloque := '';
BloqueCero := 0;
For i := 1 To 3 do begin
Digito := Round(Cantidad) Mod 10;
If Digito <> 0 Then begin
Case i of
1: begin
Bloque := ' ' + Unidades[Digito - 1];
PrimerDigito := Digito;
end; //case 1
2: begin
If Digito <= 2 Then begin
Bloque := ' ' + Unidades[(Digito * 10 + PrimerDigito - 1)];
end Else begin
If PrimerDigito <> 0 then
Temp := ' Y' else Temp := '';
Bloque := ' ' + Decenas[Digito - 1] + Temp + Bloque;
End; //if
SegundoDigito := Digito;
end; //case 2
3: begin
If (Digito = 1) and (PrimerDigito = 0) and (SegundoDigito = 0) then
Temp := 'CIEN' else Temp := Centenas[Digito-1];
Bloque := ' ' + Temp + Bloque;
TercerDigito := Digito;
end; //case 3
End; //case
end Else begin
BloqueCero := BloqueCero + 1;
End; // If Digito <>0
Cantidad := Int(Cantidad / 10);
If Cantidad = 0 Then begin
Break;
End; // If Cantidad=0
end; //for
Case NumeroBloques of
1:
Resultado := Bloque;
2: begin
if BloqueCero = 3 then
Temp := '' else Temp := ' MIL';
Resultado := Bloque + Temp + Resultado;
end; //case 2
3: begin
If (PrimerDigito = 1) and (SegundoDigito = 0) and (TercerDigito = 0) then
Temp := ' MILLON' else Temp := ' MILLONES';
Resultado := Bloque + Temp + Resultado;
end; //case 3
End; //case
NumeroBloques := NumeroBloques + 1;
Until Cantidad = 0; //repeat
case MonNal of
0: begin
If curCantidad > 1 then
Temp := ' CENTAVOS ***' else Temp := ' CENTAVO ***';
CantidadEnLetra := Resultado + Temp;

end;
1: begin
If curCantidad > 1 then
Temp := ' PESOS ' else Temp := ' PESO ';
if Centavos=0 then strCentavos := '' else strCentavos := 'CON '+CantidadEnLetra(Centavos, 0);
CantidadEnLetra := 'SON: *** ' + Resultado + Temp + strCentavos;
end;
2: begin
If curCantidad > 1 then
Temp := ' DLLS ' else Temp := ' DOLAR ';
if Centavos=0 then strCentavos := '' else strCentavos := 'CON '+CantidadEnLetra(Centavos, 0);
CantidadEnLetra := 'SON: *** ' + Resultado + Temp + strCentavos;
end;
end;

End;


:D

Esta versión es con "SESENTA Y CINCO", no con "SESENTICINCO".
Saludos

Arturo_
14-07-2007, 00:42:23
// **** SPLASH ****
// Por: Arturo Vidal Gómez
// Versión: 1.000.000
// Copyright © 1980, 2007
// Derechos - Reservados
// Arequipa, Perú
// PASCAL - DELPHI (Client Server Suite)
// Ingeniería de Software

unit Splash;

interface

uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, jpeg, Gauges, DateUtils;

// For NumbersToLetters
const
// Table Unidades 0 - 9
LIBRARY_Table_0001 : packed array[0..9] of string =
('CERO', 'UNO', 'DOS', 'TRES', 'CUATRO', 'CINCO',
'SEIS', 'SIETE', 'OCHO', 'NUEVE');
// Table Decenas 10 - 19
LIBRARY_Table_0002 : packed array[0..9] of string =
('DIEZ', 'ONCE', 'DOCE', 'TRECE', 'CATORCE', 'QUINCE',
'DIECISEIS', 'DIECISIETE', 'DIECIOCHO', 'DIECINUEVE');
// Table Decenas 20 - 90
LIBRARY_Table_0003 : packed array[2..9] of string =
('VEINTE', 'TREINTA', 'CUARENTA', 'CINCUENTA',
'SESENTA', 'SETENTA', 'OCHENTA', 'NOVENTA');
// Table Centenas 100 - 900
LIBRARY_Table_0004 : packed array[0..9] of string =
('', 'CIEN', 'DOSCIENTOS', 'TRESCIENTOS', 'CUATROCIENTOS',
'QUINIENTOS', 'SEISCIENTOS', 'SETENCIENTOS',
'OCHOCIENTOS', 'NOVECIENTOS');

const
SubChar_ON : Boolean = True; // Enabled Reemplazar UNO por UN
SubChar_OFF : Boolean = False; // Disabled Reemplazar UNO por UN
Sep_NULL : Integer = 0; // Value NULL
Sep_MIL : Integer = 1; // Separador de Miles
Sep_MILLON : Integer = 2; // Separador de Millones

const
asm_POINT : string = '.';
asm_COMET : string = ',';
asm_DECIMALS : string = '0000000000';
asm_VALID : set of char = ['0'..'9', '.', ','];
var
lib_RESULT_CNA : string;
lib_DIGITS_ALF : string;
lib_DIGITS_INT : string;
lib_DIGITS_DEC : string;
lib_TYPE : string;

// INTERFACE Procedimientos para Conversiones
function NumbersToLetters(pmt_NUMBER, pmt_TYPE: string; pmt_DEC: Integer): string; export;
implementation

{$R *.DFM}
// IMPLEMENTATION Procedimientos para Conversiones
// NumbersToLetters Numeros a Letras
function NumbersToLetters(pmt_NUMBER, pmt_TYPE: string; pmt_DEC: Integer): string; export;
var
Loop : Integer;
// Seleccionar TIPO 1 2 ó 3
// TIPO 1 = 0 para las Unidades
// TIPO 2 = 00 para las Decenas
// TIPO 3 = 000 para las Centenas
// 12 Digitos y n Decimales
// 999,000,000,000.00
function Select_TYPE(pmt_DIGITS_INT: string; Flag_SUB: Boolean;
Flag_SEP: Integer): string;
// Seleccionar Separador MIL MILLON...
procedure Select_SEP(pmt_DIGITS_INT: string; Flag_SUB: Boolean;
Flag_SEP: Integer);
begin
if (Flag_SUB) and
(Length(lib_DIGITS_INT) >= 4) and
(Length(lib_DIGITS_INT) <= 12) then
begin
if Flag_SEP = sep_MIL then
lib_DIGITS_ALF := lib_DIGITS_ALF + ' MIL '
else
if Flag_SEP = sep_MILLON then
begin
lib_DIGITS_ALF := lib_DIGITS_ALF + ' MILLONES ';
// Elimina 'ES' de 'MILLONES' si Primer Digito es 1
if (Length(lib_DIGITS_INT) = 7) and
(Copy(pmt_DIGITS_INT, 1, 1) = '1') then
SYSTEM.Delete(lib_DIGITS_ALF, 10, 2);
end;
end;
end;
begin
(* DIGITS = 1 *)
if (Length(pmt_DIGITS_INT) = 1) then
begin
lib_DIGITS_ALF := LIBRARY_Table_0001[StrToInt(pmt_DIGITS_INT)];
// Remplaza UNO por UN
if (Flag_SUB) and
(Copy(pmt_DIGITS_INT, 1, 1) = '1') then
SYSTEM.Delete(lib_DIGITS_ALF, Length(lib_DIGITS_ALF), 1);
Select_SEP(pmt_DIGITS_INT, Flag_SUB, Flag_SEP);
end;
(* DIGITS = 2 *)
if (Length(pmt_DIGITS_INT) = 2) then
begin
// Asigna de 10 - 19
if (Copy(pmt_DIGITS_INT, 1, 1) = '1') then
lib_DIGITS_ALF := LIBRARY_Table_0002[StrToInt(Copy(pmt_DIGITS_INT, 2, 1))]
// Asigna de 20 a 99
else
begin
// Asigna de 20 a 90 Decenas
lib_DIGITS_ALF := LIBRARY_Table_0003[StrToInt(Copy(pmt_DIGITS_INT, 1, 1))];
// Asigna de 20 a 90 Decenas y 21 a 99 Unidades
if (Copy(pmt_DIGITS_INT, 2, 1) <> '0') then
begin
// Comment: Salida >> SESENTICINCO
// lib_DIGITS_ALF := Copy(lib_DIGITS_ALF, 1, Length(lib_DIGITS_ALF) - 2)
// + 'TI' + LIBRARY_Table_0001[StrToInt(Copy(pmt_DIGITS_INT, 2, 1))];

// **** OJO Aqui se reemplaza este codigo para que te sirva ****
// Comment: Salida >> SESENTA Y CINCO
lib_DIGITS_ALF := lib_DIGITS_ALF + ' Y '
+ LIBRARY_Table_0001[StrToInt(Copy(pmt_DIGITS_INT, 2, 1))];
// Remplaza UNO por UN
if (Flag_SUB) and
(Copy(pmt_DIGITS_INT, 2, 1) = '1') then
SYSTEM.Delete(lib_DIGITS_ALF, Length(lib_DIGITS_ALF), 1);
end;
end;
Select_SEP(pmt_DIGITS_INT, Flag_SUB, Flag_SEP);
end;
(* DIGITS = 3 *)
if (Length(pmt_DIGITS_INT) = 3) then
begin
// Salir si los tres Digitos son cero
if (Copy(pmt_DIGITS_INT, 1, 1) = '0') and
(Copy(pmt_DIGITS_INT, 2, 1) = '0') and
(Copy(pmt_DIGITS_INT, 3, 1) = '0') then
begin
Select_TYPE := '';
Exit;
end;
// Asignar Centenas
lib_DIGITS_ALF := LIBRARY_Table_0004[StrToInt(Copy(pmt_DIGITS_INT, 1, 1))];
// Si el Primer Digito es 1 de 100 a 199 Agregar 'TO'
if (Copy(pmt_DIGITS_INT, 1, 1) = '1') and
((Copy(pmt_DIGITS_INT, 2, 1) <> '0') or
(Copy(pmt_DIGITS_INT, 3, 1) <> '0')) then
lib_DIGITS_ALF := lib_DIGITS_ALF + 'TO '
// Si no Agregar Espacio en Blanco si Primer
// Digito de la Centena no es 0
else
if (Copy(pmt_DIGITS_INT, 1, 1) <> '0') then
lib_DIGITS_ALF := lib_DIGITS_ALF + ' ';
// Si son Centenas Asignar y Salir
if (Copy(pmt_DIGITS_INT, 2, 1) = '0') and
(Copy(pmt_DIGITS_INT, 3, 1) = '0') then
begin
Select_SEP(pmt_DIGITS_INT, Flag_SUB, Flag_SEP);
Select_TYPE := lib_DIGITS_ALF;
Exit;
end;
// Asignar Unidades en Base a Decenas y
// Asignar Decenas en Base a Centenas
// Unidades
if (Copy(pmt_DIGITS_INT, 2, 1) = '0') then
begin
lib_DIGITS_ALF := lib_DIGITS_ALF
+ LIBRARY_Table_0001[StrToInt(Copy(pmt_DIGITS_INT, 3, 1))];
// Remplaza UNO por UN
if (Flag_SUB) and
(Copy(pmt_DIGITS_INT, 2, 1) = '0') and
(Copy(pmt_DIGITS_INT, 3, 1) = '1') then
SYSTEM.Delete(lib_DIGITS_ALF, Length(lib_DIGITS_ALF), 1);
end
// Decenas 10 - 19
else
if (Copy(pmt_DIGITS_INT, 2, 1) = '1') then
lib_DIGITS_ALF := lib_DIGITS_ALF
+ LIBRARY_Table_0002[StrToInt(Copy(pmt_DIGITS_INT, 3, 1))];
// Decenas 20 - 99
if (Copy(pmt_DIGITS_INT, 2, 1) >= '2') then
begin
lib_DIGITS_ALF := lib_DIGITS_ALF
+ LIBRARY_Table_0003[StrToInt(Copy(pmt_DIGITS_INT, 2, 1))];
if (Copy(pmt_DIGITS_INT, 3, 1) <> '0') then
begin
lib_DIGITS_ALF := Copy(lib_DIGITS_ALF, 1, Length(lib_DIGITS_ALF) - 2)
+ 'TI' + LIBRARY_Table_0001[StrToInt(Copy(pmt_DIGITS_INT, 3, 1))];
// Remplaza UNO por UN
if (Flag_SUB) and
(Copy(pmt_DIGITS_INT, 3, 1) = '1') then
SYSTEM.Delete(lib_DIGITS_ALF, Length(lib_DIGITS_ALF), 1);
end;
end;
Select_SEP(pmt_DIGITS_INT, Flag_SUB, Flag_SEP);
end;
Select_TYPE := lib_DIGITS_ALF;
end;
// Main
begin
// Validación Entrada
if (pmt_NUMBER = '') then
begin
NumbersToLetters := '';
Exit;
end;
// Validación de Digitos
for Loop := 1 to Length(pmt_NUMBER) do
begin
if not (pmt_NUMBER[Loop] in asm_VALID) then
begin
NumbersToLetters := 'ERROR: No se Permiten Caracteres Alfabeticos.';
Exit;
end;
end;
// Longitud Permitida en Digitos
if (Pos(asm_POINT, pmt_NUMBER) - 1 > 12) or
(Pos(asm_COMET, pmt_NUMBER) - 1 > 12) then
begin
NumbersToLetters := 'Solo se Permiten Hasta (12) Enteros y (02) Decimales';
Exit;
end;
// Inicializar
lib_RESULT_CNA := '';
lib_DIGITS_ALF := '';
lib_DIGITS_INT := '';
lib_DIGITS_DEC := '';
lib_TYPE := '';
// Seleccionar Tipo de Moneda
if (pmt_TYPE = vk_SOLES) then lib_TYPE := vk_SOLES
else if (pmt_TYPE = vk_DOLAR) then lib_TYPE := vk_DOLAR;
// Extraer Numero Entero y Decimales
if (Pos(asm_POINT, pmt_NUMBER) <> 0) then
begin
lib_DIGITS_INT := Copy(pmt_NUMBER, 1, Pos(asm_POINT, pmt_NUMBER) - 1);
lib_DIGITS_DEC := Copy(pmt_NUMBER, Pos(asm_POINT, pmt_NUMBER) + 1, pmt_DEC);
end
else
if (Pos(asm_COMET, pmt_NUMBER) <> 0) then
begin
lib_DIGITS_INT := Copy(pmt_NUMBER, 1, Pos(asm_COMET, pmt_NUMBER) - 1);
lib_DIGITS_DEC := Copy(pmt_NUMBER, Pos(asm_COMET, pmt_NUMBER) + 1, pmt_DEC);
end
else
begin
lib_DIGITS_INT := pmt_NUMBER;
lib_DIGITS_DEC := Copy(asm_DECIMALS, 1, pmt_DEC);
end;
// Execute_NOW ****
// Length = 1 Format: 9
if Length(lib_DIGITS_INT) = 1 then
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 1), SubChar_OFF, Sep_NULL)
// Length = 2 Format: 99
else
if Length(lib_DIGITS_INT) = 2 then
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 2), SubChar_OFF, Sep_NULL)
// Length = 3 Format: 999
else
if Length(lib_DIGITS_INT) = 3 then
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 3), SubChar_OFF, Sep_NULL)
// Length = 4 Format: 9 999
else
if Length(lib_DIGITS_INT) = 4 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 1), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 2, 3), SubChar_OFF, Sep_NULL);
end
// Length = 5 Format: 99 999
else
if Length(lib_DIGITS_INT) = 5 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 2), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 3, 3), SubChar_OFF, Sep_NULL);
end
// Length = 6 Format: 999 999
else
if Length(lib_DIGITS_INT) = 6 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 4, 3), SubChar_OFF, Sep_NULL);
end
// Length = 7 Format: 9 999 999
else
if Length(lib_DIGITS_INT) = 7 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 1), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 2, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 5, 3), SubChar_OFF, Sep_NULL);
end
// Length = 8 Format: 99 999 999
else
if Length(lib_DIGITS_INT) = 8 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 2), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 3, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 6, 3), SubChar_OFF, Sep_NULL);
end
// Length = 9 Format: 999 999 999
else
if Length(lib_DIGITS_INT) = 9 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 3), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 4, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 7, 3), SubChar_OFF, Sep_NULL);
end
// Length = 10 Format: 9 999 999 999
else
if Length(lib_DIGITS_INT) = 10 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 1), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 2, 3), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 5, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 8, 3), SubChar_OFF, Sep_NULL);
end
// Length = 11 Format: 99 999 999 999
else
if Length(lib_DIGITS_INT) = 11 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 2), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 3, 3), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 6, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 9, 3), SubChar_OFF, Sep_NULL);
end
// Length = 12 Format: 999 999 999 999
else
if Length(lib_DIGITS_INT) = 12 then
begin
lib_RESULT_CNA := Select_TYPE(Copy(lib_DIGITS_INT, 1, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 4, 3), SubChar_ON, Sep_MILLON)
+ Select_TYPE(Copy(lib_DIGITS_INT, 7, 3), SubChar_ON, Sep_MIL)
+ Select_TYPE(Copy(lib_DIGITS_INT, 10, 3), SubChar_OFF, Sep_NULL);
end;
// Asignar Resultado
SYSTEM.Insert('SON: ', lib_RESULT_CNA, 1);
lib_RESULT_CNA := lib_RESULT_CNA + ' Y ' + lib_DIGITS_DEC + '/100' + lib_TYPE;
NumbersToLetters := lib_RESULT_CNA;
end;

end.
//Edite: Para colocar etiquetas DELPHI.

Arturo_
14-07-2007, 00:48:49
Tu rutina esta bien, existen varias rutinas para hacer este tipo de trabajos de conversión claro esta que cada persona tiene su propia logica bueno es cuestion de opiniones.

nos vemos.