En el grupo de noticias de Visual FoxPro en español, se preguntó sobre alguna función que convierta texto a número, por ejemplo "DOCE MIL CIENTO CINCUENTA" a 12150. He aquí la función para ello.
Mario López envió como respuesta una función de la cual he tomado la idea y modificado para la conversión solo a numeros enteros. Carlos Yohn Zubiria también colaboró con algunos ajustes.
*-- Ejemplos:
? Txt2Num("CIENTO VEINTITRES MILLONES CUATROCIENTOS " + ;
"CINCUENTA Y SEIS MIL SETECIENTOS OCHENTA Y NUEVE")
? Txt2Num("QUINIENTAS QUINCE")
? Txt2Num("UN MIL CIENTO ONCE")
FUNCTION Txt2Num(tcCadena)
LOCAL ln, lnI, lnRet, lnIndice, lnCoef
STORE 0 TO lnRet, lnCoef
IF EMPTY(tcCadena)
RETURN lnRet
ENDIF
*-- Texto con la tabla de valores
TEXT TO lcAux NOSHOW
CERO 0
UN 1
UNO 1
UNA 1
DOS 2
TRES 3
CUATRO 4
CINCO 5
SEIS 6
SIETE 7
OCHO 8
NUEVE 9
DIEZ 10
ONCE 11
DOCE 12
TRECE 13
CATORCE 14
QUINCE 15
DIECISEIS 16
DIECISIETE 17
DIECIOCHO 18
DIECINUEVE 19
VEINTE 20
VEINTIUN 21
VEINTIUNO 21
VEINTIUNA 21
VEINTIDOS 22
VEINTITRES 23
VEINTICUATRO 24
VEINTICINCO 25
VEINTISEIS 26
VEINTISIETE 27
VEINTIOCHO 28
VEINTINUEVE 29
DIEZ 10
VEINTE 20
TREINTA 30
CUARENTA 40
CINCUENTA 50
SESENTA 60
SETENTA 70
OCHENTA 80
NOVENTA 90
CIEN 100
CIENTO 100
DOSCIENTOS 200
DOSCIENTAS 200
TRESCIENTOS 300
TRESCIENTAS 300
CUATROCIENTOS 400
CUATROCIENTAS 400
QUINIENTOS 500
QUINIENTAS 500
SEISCIENTOS 600
SEISCIENTAS 600
SETECIENTOS 700
SETECIENTAS 700
OCHOCIENTOS 800
OCHOCIENTAS 800
NOVECIENTOS 900
NOVECIENTAS 900
MIL 1000
MILES 1000
MILLON 1000000
MILLONES 1000000
ENDTEXT
*-- Array con los valores
FOR ln = 1 TO GETWORDCOUNT(lcAux) STEP 2
lnI = CEILING(ln / 2)
DIMENSION laArr(lnI, 2)
laarr(lnI, 1) = GETWORDNUM(lcAux, ln)
laarr(lnI, 2) = VAL(GETWORDNUM(lcAux, ln + 1))
ENDFOR
*-- Preparo la cadena a convertir
tcCadena = UPPER(tcCadena)
tcCadena = CHRTRAN(tcCadena, "ÁÉÍÓÚ", "AEIOU")
ln = ALINES(laCad, tcCadena, .T., " ")
FOR lnI = ln TO 1 STEP -1
lnIndice = ASCAN(laArr, laCad(lnI), 1, 0, 1, 15)
IF lnIndice > 0
DO CASE
CASE INLIST(laArr(lnIndice, 1), "MILLON", "MILLONES")
lnCoef = 6
CASE INLIST(laArr(lnIndice, 1), "MIL", "MILES")
lnCoef = lnCoef + 3
OTHERWISE
lnRet = lnRet + laArr(lnIndice, 2) * 10 ^ lnCoef
ENDCASE
ENDIF
ENDFOR
RETURN INT(lnRet)
ENDFUNC
Esta función trabaja correctamente como inversa de la función N2L() publicada en PortalFox en: http://www.portalfox.com/article.php?sid=24
Por cualquier sugerencia y/o modificación, no dude en dejar su comentario.
|