martes, 17 de agosto de 2010

Procedimientos: conversión de números a letras


Conversión de números a letras

El procedimiento que a continuación se describe, nos muestra el código fuente que nos permitirá convertir un numero a su correspondiente literal de texto.

proc conv_let(numero=8)

field=m
; declaracion de variables para obtener el resultado de la conversion
dcl num_numericos$=20(100)
dcl num_terminaciones$=15(15)
; array
dcl array_calculo(20)
; contadores varios
dcl var_contadores_0%
dcl var_contadores_1%
endloc

; se inician las data
for var_contadores_0=1 to 100
read=0:num_numericos(var_contadores_0)
next var_contadores_0
for var_contadores_0=1 to 15
read=0:num_terminaciones(var_contadores_0)
next var_contadores_0

; iniciar calculo y comprobaciones

array_calculo(1)=numero


if array_calculo(1)=1
print=1:tab(3,9),"UN EURO ."
goto &final
endif
if int(abs(array_calculo(1)))>99999999
num_convertido=gener(10,".")
endif

array_calculo(1)=array_calculo(1)/1000000
array_calculo(2)=fix(array_calculo(1))
if array_calculo(2)=0 : goto &2300
if array_calculo(2)>1 : goto &2200
num_convertido=includ(index(num_convertido,"."),num_terminaciones(10))
goto &2300
&2200
num_convertido=includ(index(num_convertido,"."),num_numericos(conv(array_calculo(2))))
num_convertido=includ(index(num_convertido,"."),num_terminaciones(11))
&2300
array_calculo(6)=array_calculo(1)
array_calculo(1)=fp(array_calculo(6))*1000
array_calculo(2)=fix(array_calculo(1))
if array_calculo(2)=0 : goto &2800
array_calculo(3)=array_calculo(2)/100
array_calculo(4)=fix(array_calculo(3))
if array_calculo(4)=0 : goto &2400
num_convertido=includ(index(num_convertido,"."),num_terminaciones(conv(array_calculo(4))))
&2400
array_calculo(5)=fp(array_calculo(3))*100
if array_calculo(5)=0 : goto &2600
if array_calculo(4)<>1 : goto &2500
num_convertido=includ(index(num_convertido,".")-1,num_terminaciones(13))
&2500
if array_calculo(2)=1
num_convertido=includ(index(num_convertido,"."),num_terminaciones(12))
goto &2800
endif
num_convertido=includ(index(num_convertido,"."),num_numericos(conv(array_calculo(5))))
goto &2700
&2600
if array_calculo(4)=0 : goto &2800
&2700
num_convertido=includ(index(num_convertido,"."),num_terminaciones(12))
&2800
array_calculo(2)=fp(array_calculo(1))*1000
array_calculo(3)=array_calculo(2)/100
array_calculo(4)=fix(array_calculo(3))
if array_calculo(4)<>0 : num_convertido=includ(index(num_convertido,"."),num_terminaciones(conv(array_calculo(4))))
array_calculo(5)=fp(array_calculo(3))*100
array_calculo(7)=fp(array_calculo(5))*1000
array_calculo(7)=fix(array_calculo(7))/1000
array_calculo(8)=fp(array_calculo(7))
array_calculo(8)=fp(array_calculo(8))*100
array_calculo(8)=fix(array_calculo(8))
array_calculo(9)=fix(array_calculo(8))
array_calculo(5)=fix(array_calculo(5))
if array_calculo(5)<>0
if array_calculo(4)=1 : num_convertido=includ(index(num_convertido,".")-1,num_terminaciones(13))
num_convertido=includ(index(num_convertido,"."),num_numericos(conv(array_calculo(5))))
endif
array_calculo(2)=fix(array_calculo(2))
if array_calculo(8)>0
num_convertido=includ(index(num_convertido,"."),num_terminaciones(14))
num_convertido=includ(index(num_convertido,"."),num_numericos(conv(array_calculo(8))))
endif

; impresion del resultado final ya convertido
num_convertido=includ(index(num_convertido,"."),num_terminaciones(15))
print=1:tab(3,9),num_convertido

;fin de la ejecucion
&final
pause "Pulse enter para continuar con otro numero."

&fin

exit

; datas
DATA "UNO .","DOS .","TRES .","CUATRO .","CINCO .","SEIS .","SIETE .","OCHO .","NUEVE .","DIEZ .","ONCE .","DOCE .","TRECE .","CATORCE .","QUINCE .","DIECISEIS .","DIECISIETE .","DIECIOCHO .","DIECINUEVE .","VEINTE .","VEINTIUN .","VEINTIDOS ."
DATA "VEINTITRES .","VEINTICUATRO .","VEINTICINCO .","VEINTISEIS .","VEINTISIETE .","VEINTIOCHO .","VEINTINUEVE .","TREINTA .","TREINTA Y UN .","TREINTA Y DOS .","TREINTA Y TRES .","TREINTA Y CUATRO .","TREINTA Y CINCO .","TREINTA Y SEIS ."
DATA "TREINTA Y SIETE .","TREINTA Y OCHO .","TREINTA Y NUEVE .","CUARENTA .","CUARENTA Y UN .","CUARENTA Y DOS .","CUARENTA Y TRES .","CUARENTA Y CUATRO .","CUARENTA Y CINCO .","CUARENTA Y SEIS .","CUARENTA Y SIETE .","CUARENTA Y OCHO ."
DATA "CUARENTA Y NUEVE .","CINCUENTA .","CINCUENTA Y UN .","CINCUENTA Y DOS .","CINCUENTA Y TRES .","CINCUENTA Y CUATRO .","CINCUENTA Y CINCO .","CINCUENTA Y SEIS .","CINCUENTA Y SIETE .","CINCUENTA Y OCHO .","CINCUENTA Y NUEVE .","SESENTA ."
DATA "SESENTA Y UN .","SESENTA Y DOS .","SESENTA Y TRES .","SESENTA Y CUATRO .","SESENTA Y CINCO .","SESENTA Y SEIS .","SESENTA Y SIETE .","SESENTA Y OCHO .","SESENTA Y NUEVE .","SETENTA .","SETENTA Y UN .","SETENTA Y DOS .","SETENTA Y TRES ."
DATA "SETENTA Y CUATRO .","SETENTA Y CINCO .","SETENTA Y SEIS .","SETENTA Y SIETE .","SETENTA Y OCHO .","SETENTA Y NUEVE .","OCHENTA ."
DATA "OCHENTA Y UN .","OCHENTA Y DOS .","OCHENTA Y TRES .","OCHENTA Y CUATRO .","OCHENTA Y CINCO .","OCHENTA Y SEIS .","OCHENTA Y SIETE .","OCHENTA Y OCHO .","OCHENTA Y NUEVE .","NOVENTA .","NOVENTA Y UN .","NOVENTA Y DOS .","NOVENTA Y TRES ."
DATA "NOVENTA Y CUATRO .","NOVENTA Y CINCO .","NOVENTA Y SEIS .","NOVENTA Y SIETE .","NOVENTA Y OCHO .","NOVENTA Y NUEVE .","UN"

DATA "CIEN ."
DATA "DOSCIENTOS ."
DATA "TRESCIENTOS ."
DATA "CUATROCIENTOS ."
DATA "QUINIENTOS ."
DATA "SEISCIENTOS ."
DATA "SETECIENTOS ."
DATA "OCHOCIENTOS ."
DATA "NOVECIENTOS ."
DATA "UN MILLON ."
DATA "MILLONES ."
DATA "MIL ."
DATA "TO ."
DATA "CON ."
DATA "EUROS ."

endproc

Sintaxis

Después de haber pegado el código descrito en la bilioteca de procedimientos en la aplicación que se requiera, para obtener un buen resultado, simplemente habría que llamar al procedimiento, tal y como se describe a continuación.

conv_let(num_numerico)

Si num_numerico le damos el valor de 12,34, el procedimiento nos devolverá el resultado literal: DOCE CON TREINTA Y CUATRO EUROS. Si no se quisiera utilizar el literal "EUROS", se modificará el código fuente del procedimiento, cambiando dicho literal por el que se requiera, o bien, se puede añadir una variable de tipo alfanumerico "$", con el literal correspondiente.

A continuación se describe el código fuente en el que se muestra como se llama a dicho procedimiento:

program "num_numericosletras"

field=m
dcl num_convertido$=256
dcl num_numerico=8

#include "conversion.prc"

segment 0

do
; iniciamos la aplicacion para realizar la conversion
print=1:clear
num_convertido="."
print=1:tab(5,5),"numero a convertir"
print=1:tab(26,5),"[ ]"
ask=1,i=&fin:tab(27,5),(-n8.nn)=num_numerico
print=1:tab(27,5),(s(.)-n8.nn),num_numerico

conv_let(num_numerico)
loop

&fin
stop

eseg 0


No hay comentarios:

Publicar un comentario