Hola invitado         02 Sep, 2010 - 04:43
Menú principal
 
Ads
 
Patrocinadores
 
Anuncios
 
© 2009 PortalFox
Texto a número lecturas 2933
 Enviado por LuisMaria en Martes, 22 Mayo, 2007
Rutinas 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.

 

 Versión imprimible  
Texto a número | Entrar/Crear una cuenta | 0 Comentarios
Los comentarios son propiedad de sus respectivos autores.
No somos responsables de su contenido.



Todas las marcas y los logos utilizados en este sitio son propiedad de sus respectivos dueños.
Los artículos, noticias y comentarios son propiedad y responsabilidad de sus respectivos autores.
Copyright © 2000-2010 PortalFox. Todos los derechos reservados.