Como saber si un control de texto posee un dato numerico o una cadena de caracteres??

3,092 views
Skip to first unread message

roberto zugazua

unread,
Sep 12, 2012, 2:22:03 PM9/12/12
to publice...@googlegroups.com
Hola buenas tardes!

Como saber si un control de texto posee un dato numerico o una cadena de caracteres??

Porque si quiero forzar a transformar un valor numerico con val() me tira error lo mismo con la cadena de caracteres str().
Existe alguna propiedad en este control que me permita chequear si es numerico o caracter el datos que tiene guardado?

Muchisimas gracias!!!

Edgar Acevedo

unread,
Sep 12, 2012, 2:28:59 PM9/12/12
to publice...@googlegroups.com
Una forma sería:

IF NOT EMPTY(Thisform.Label1.Value)
    DO CASE
          CASE  ISALPHA(Thisform.Label1.Value)
                 ? 'Es tipo Alfabético'
          CASE  ISDIGIT(Thisform.Label1.Value)
                 ? 'Es tipo Numérico'
          OTHERWISE
                  ? 'Sepa Judas que fregados será !'
    ENDCASE
ENDIF

Otra forma es con el TYPE

?  TYPE(Thisform.Label1.Value)





--
 
 
 

roberto zugazua

unread,
Sep 12, 2012, 2:46:23 PM9/12/12
to publice...@googlegroups.com
Hola mi control es un cuadro de texto, no un label, quiero saber si el contenido de un cuadro de texto es una cadena de caracteres o un dato numerico

mil gracias

Jairo Miranda

unread,
Sep 12, 2012, 2:54:02 PM9/12/12
to publice...@googlegroups.com

ISALPHA( ) (Función)

Vea también

ISLOWER( ) | ISUPPER( ) | LOWER( ) | UPPER( )

Determina si el carácter más a la izquierda de una expresión de caracteres es alfabético.

ISALPHA(cExpression)

Valores devueltos

Logical

Parámetros

cExpression

Especifica la expresión de caracteres evaluada por ISALPHA( ). Los caracteres que aparezcan después del primer carácter de cExpression se pasan por alto.

Observaciones

ISALPHA( ) devuelve verdadero (.T.) si el carácter situado más a la izquierda de la expresión de caracteres especificada es alfabético. Si no lo es, ISALPHA( ) devuelve falso (.F.).

Ejemplo

CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\testdata')
USE Customer     && Open customer table
CLEAR 
 
DISPLAY contact
? ISALPHA(contact)  && Displays .T.
DISPLAY maxordamt
? ISALPHA(cust_id)  && Displays .F.

 

ISDIGIT( ) (Función)

Vea también

ISALPHA( ) | CLEAR (Comandos) | Funciones de tipo Character | USE

Determina si el carácter de la izquierda de la expresión de caracteres especificada es un dígito (0 a 9).

ISDIGIT(cExpression)

Valores devueltos

Logical

Parámetros

cExpression

Especifica la expresión de caracteres comprobada por ISDIGIT( ). Los caracteres que aparezcan después del primer carácter de cExpression se pasan por alto.

Observaciones

ISDIGIT( ) devuelve verdadero (.T.) si el carácter más a la izquierda de la expresión de caracteres especificada es un dígito (0 a 9); de lo contrario, ISDIGIT( ) devuelve falso (.F.).

Ejemplo

CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\testdata')
USE orders  && Open Orders table
CLEAR 
 
DISPLAY cust_id
? ISDIGIT(cust_id)  && Displays .F.
DISPLAY order_dsc
? ISDIGIT(ALLTRIM(STR(order_dsc)))  && Displays .T.

 

Espero sirva

 

JM

--
 
 
 

ArturoPC

unread,
Sep 12, 2012, 2:56:24 PM9/12/12
to publice...@googlegroups.com
Pues cambia el "label1" por el nombre de tu cuadro de texto.

Slds,

ArturoPC

FidelJ

unread,
Sep 12, 2012, 5:22:21 PM9/12/12
to publice...@googlegroups.com
En general, controlas qué dato tendrá un cuadro de dos maneras:
Asignando un ControlSource, cuyo tipo de dato puede ser Caracter, numérico ó fecha
Asignando p.ej. .Text1.Value=0 el cuadro de texto tomará un valor numérico.
Pero si quieres dejar esto libre y que se ingrese cualquier valor, puedes testear el resultado.
La evaluación con isalpha() te devuelve .t. si el primer caracter de la izquierda no es un número. Pero en un caso como "9A", isalpha() devuelve .F. pero no puede ser un número.
IsDigit no te asegura que puede ser numérico, porque solo testea el caracter de la izquierda. Si tengo "99A4",  Isdigit() devuelve .T., pero no es un número ni podría serlo.
Por otra parte Vartype() puede testear si el valor es un número, pero si el contenido es una fecha devuelve "C" igual que si es un String.

Aquí transcribo dos funciones TestNumero() y TestFecha() que determinan sin un String podría convertirse en fecha ó en número.

**************************************************
*lparameters xcValor
function TEstNumero(xcValor)
*****************************
* xcValor es un String que puede ser un número
* Devuelve Verdadero SI PUEDE SER UN NUMERO ó Falso
****************************************************
local nlen,i_,lNumero
if vartype(xcValor)#"C".or.empty(xcValor)
return .f.
endif
nlen=len(xcValor)
* Posible Numero negativo
if nlen>1
if left(xcValor,1)="-"
xcValor=substr(xcValor,2)
nlen=len(xcValor)
endif
endif
lNumero=.t.
for i_ =1 to nlen
if !inlist(substr(xcValor,i_,1),"0","1","2","3","4","5","6","7","8","9",".")
lNUmero=.f.
exit
endif
next
return lNumero


*lparameters xcValor
function TEstFecha(xcValor)
****************************
* xcValor es un String que puede ser una Fecha
* Formato esperado "99/99/9999"
* Devuelve Falso ó Verdadero SI PUEDE SER UNA FECHA
****************************************************
local nlen,i_,lNumero,ndia,nmes,nano,cdia,cmes,cano
if vartype(xcValor)#"C".or.empty(xcValor).or.Len(xcValor)#10
return .f.
endif
if Occurs("/",xcValor)#2
return .f.
endif
if substr(xcValor,3,1)#"/"
return .f.
endif
if substr(xcValor,6,1)#"/"
return .f.
endif
cDia=Substr(xcValor,1,2)
cMes=Substr(xcValor,4,2)
cAno=Substr(xcValor,7,4)
nDia=val(cdia)
nmes=val(cmes)
nano=val(cano)
if !between(ndia,1,31)
return .f.
endif
if !between(nmes,1,12)
return .f.
endif
if nano<1900
return .f.
endif

RETURN .T.
****************************************

Para practicar algo, puedes poner este código en el evento Valid del TextBox.
*TextBox Text1
* Valid
IF !EMPTY(THIS.VALUE)
cString=alltrim(this.value)
do case
case InList(cSTring,".T.",".t.",".F.",".f.")
Messagebox(cSTring+" Puede ser un boolean")
lcValor=iif(Atc("t",cString)#0,.t.,.f.)
case TestNumero(cString)
Messagebox(cSTring+" Puede ser un Número")
lcValor=Val(cString)
case TestFEcha(cString)
Messagebox(cString+" Puede ser una fecha")
lcValor=cTod(cString)
otherwise
Messagebox(cstring+" Debe ser un Texto")
lcValor=cString
endcase
endif
LcValor sería el valor convertido de acuerdo a lo que parece que es la cadena ingresada.
Para el ejemplo, el Varype(lcValor) puede dar "N","C","L" ó "D"
Saludos

El miércoles, 12 de septiembre de 2012 15:22:04 UTC-3, roberto zugazua escribió:

ZeRoberto

unread,
Sep 13, 2012, 3:41:48 PM9/13/12
to publice...@googlegroups.com
VARTYPE()

--
 
 
 

Ariel D'Alfeo

unread,
Sep 14, 2012, 9:05:19 AM9/14/12
to publice...@googlegroups.com
Con la función TYPE(),

IF TYPE(THISFORM.text1.value)="N"  &&es numerico

IF TYPE(THISFORM.text1.value)="C"  &&es CHAR

IF TYPE(THISFORM.text1.value)="D"  &&es date

ARIEL D'ALFEO
Córdoba, Argentina
--
 
 
 

Viktor Velazquez

unread,
Sep 14, 2012, 12:28:51 PM9/14/12
to publice...@googlegroups.com
yo lo hice mas simple para saber si habia datos alfa o num

vf=alltrim(Thisform.cfact1.value)
sia=0
FOR i=65 TO 90
sia=ATC(CHR(i),vf)
IF sia=1
EXIT
endif
NEXT i
Set order to 1
IF sia=1
                               el alfa
                         else
                                 el num
                        endif





Date: Fri, 14 Sep 2012 10:05:19 -0300
From: ariel...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Como saber si un control de texto posee un dato numerico o una cadena de caracteres??
--
 
 
 

dasarobe

unread,
Sep 14, 2012, 7:23:24 PM9/14/12
to publice...@googlegroups.com
Hola
 
 
IF TRANSFORM(VAL(TRANSFORM(dato))) = TRANSFORM(dato)
  * ES UN NUMERO
  Numero = VAL(TRANSFORM(dato))
ELSE
  * ES UNA CADENA
  Cadena = TRANSFORM(dato)
ENDIF
 
 
Saludos,
 
Daniel

Víctor Hugo Espínola Domínguez

unread,
Sep 14, 2012, 7:37:32 PM9/14/12
to publice...@googlegroups.com
Hola Daniel

Excelente validación!
Pero hay que tener cuidado con las configuraciones de: 

SET POINT
SET SEARATOR
SET DECIMAL

Saludos.
Víctor.

--
 
 
 

Walter R. Ojeda Valiente

unread,
Sep 14, 2012, 7:50:31 PM9/14/12
to publice...@googlegroups.com
Para ese caso, sería más conveniente usar la función VARTYPE()

DO CASE
  CASE VARTYPE(dato) == "C"
      ? "Es caracter"
  CASE VARTYPE(dato) == "N"
      ? "Es numérico"
  CASE VARTYPE(dato) == "D"
      ? "Es fecha"
  etcétera.
ENDCASE

Saludos.

Walter.




Date: Fri, 14 Sep 2012 16:23:24 -0700
From: dasa...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Re: Como saber si un control de texto posee un dato numerico o una cadena de caracteres??
--
 
 
 

Víctor Hugo Espínola Domínguez

unread,
Sep 14, 2012, 9:02:38 PM9/14/12
to publice...@googlegroups.com
Hola Walter

Creo que la consulta era como determinar si el contenido de un dato tipo carácter representa un número o no.

"123.456"   es número
"12xxx3"    es carácter

Saludos.
Víctor.


--
 
 
 

ZeRoberto

unread,
Sep 14, 2012, 9:46:22 PM9/14/12
to publice...@googlegroups.com
Yo tengo una libreria que maneja eso pero usa una FLL RegExp te dice si una cadena es Numerico, Logico, Dte(), DateTime(), Etc etc.
 
Luego te paso
 
Saludos

--
 
 
 

Walter R. Ojeda Valiente

unread,
Sep 14, 2012, 10:56:21 PM9/14/12
to publice...@googlegroups.com
Pues en ese caso, la mejor solución posiblemente sea usar TRANSFORM() y VAL(), como Daniel sugirió, aunque su solución se puede simplificar un poco así:

lcTexto = "123456"
? Transform(lcTexto) == Transform(Val(lcTexto))

lcTexto = "123xx6"
? Transform(lcTexto) == Transform(Val(lcTexto))

Saludos.

Walter.




Date: Fri, 14 Sep 2012 21:02:38 -0400
Subject: Re: [vfp] Re: Como saber si un control de texto posee un dato numerico o una cadena de caracteres??
From: vich...@gmail.com
To: publice...@googlegroups.com
--
 
 
 

Víctor Hugo Espínola Domínguez

unread,
Sep 14, 2012, 11:06:05 PM9/14/12
to publice...@googlegroups.com
Hola Walter

Prueba lo siguiente:

lcTexto = "1234.56"
? Transform(lcTexto) == Transform(Val(lcTexto))

lcTexto = "123.456"
? Transform(lcTexto) == Transform(Val(lcTexto))

Saludos.
Víctor.

--
 
 
 

Walter R. Ojeda Valiente

unread,
Sep 14, 2012, 11:46:58 PM9/14/12
to publice...@googlegroups.com
Para ese caso, habría que agregar otra función VAL().

lcTexto = "1234.56"
? Val(Transform(lcTexto)) == Val(Transform(Val(lcTexto)))

lcTexto = "123.456"
? Val(Transform(lcTexto)) == Val(Transform(Val(lcTexto)))

porque el TRANSFORM(VAL()) le agrega ceros a la derecha y por lo tanto nunca coincidirá exactamente, como el doble signo igual obliga.

Saludos.

Walter.





Date: Fri, 14 Sep 2012 23:06:05 -0400
--
 
 
 

J. Enrique Ramos Menchaca

unread,
Sep 15, 2012, 12:00:27 AM9/15/12
to publice...@googlegroups.com
Aunando a lo publicado por Roberto, podrías revisar el siguiente link:



El miércoles, 12 de septiembre de 2012 13:22:04 UTC-5, roberto zugazua escribió:

Víctor Hugo Espínola Domínguez

unread,
Sep 15, 2012, 9:01:49 AM9/15/12
to publice...@googlegroups.com
Hola Walter

Mira esto:
lctexto="123abc456"
? Val(Transform(lcTexto)) == Val(Transform(Val(lcTexto)))

Estaba esperando que Luís María Guayán de una solución, pero como no ha participado me atrevo a dar una solución  a su estilo:

? CHRTRAN( dato, CHRTRAN( dato, "1234567890,-", "" ), "" ) == dato and RAT( "-", dato) <= 1

Saludos.
Víctor.


--
 
 
 

Víctor Hugo Espínola Domínguez

unread,
Sep 15, 2012, 9:10:29 AM9/15/12
to publice...@googlegroups.com
Perdón, falta verificar que no haya más de una coma:

? CHRTRAN( dato, CHRTRAN( dato, "1234567890,-", "" ), "" ) == dato AND RAT( "-", dato) <=1 AND OCCURS( ",", dato ) <= 1

Saludos.
Víctor.

fr...@grupo3rs.com

unread,
Sep 15, 2012, 9:40:42 AM9/15/12
to publice...@googlegroups.com
Usar lo siguiente:

ISDIGIT( ) function

ISALPHA( ) function


Un saludo


----- Original Message -----
From: Víctor Hugo Espínola Domínguez <vich...@gmail.com>
To: publice...@googlegroups.com
Date: Sat, 15 Sep 2012 09:10:29 -0400
Subject: Re: [vfp] Re: Como saber si un control de texto posee un dato numerico o una cadena de caracteres??

> Perdón, falta verificar que no haya más de una coma:
>
> ?* CHRTRAN( dato, CHRTRAN( dato, "1234567890,-", "" ), "" ) == dato AND
> RAT( "-", dato) <=1 AND OCCURS( ",", dato ) <= 1*
>
> Saludos.
> Víctor.
>
>
>
> El 15 de septiembre de 2012 09:01, Víctor Hugo Espínola Domínguez <
> vich...@gmail.com> escribió:
>
> > Hola Walter
> >
> > Mira esto:
> > lctexto="123abc456"
> > ? Val(Transform(lcTexto)) == Val(Transform(Val(lcTexto)))
> >
> > Estaba esperando que Luís María Guayán de una solución, pero como no ha
> > participado me atrevo a dar una solución a su estilo:
> >
> > ? *CHRTRAN( dato, CHRTRAN( dato, "1234567890,-", "" ), "" ) == dato and
> > RAT( "-", dato) <= 1*
> >
> > Saludos.
> > Víctor.
> >
> >
> > El 14 de septiembre de 2012 23:46, Walter R. Ojeda Valiente <
> > wr...@hotmail.com> escribió:
> >
> > Para ese caso, habría que agregar otra función VAL().
> >>
> >> lcTexto = "1234.56"
> >> ? Val(Transform(lcTexto)) == Val(Transform(Val(lcTexto)))
> >>
> >> lcTexto = "123.456"
> >> ? Val(Transform(lcTexto)) == Val(Transform(Val(lcTexto)))
> >>
> >> porque el TRANSFORM(VAL()) le agrega ceros a la derecha y por lo tanto
> >> nunca coincidirá exactamente, como el doble signo igual obliga.
> >>
> >> Saludos.
> >>
> >> Walter.
> >>
> >>
> >>
> >>
> >> ------------------------------
> >> Date: Fri, 14 Sep 2012 23:06:05 -0400
> >>
> >> Subject: Re: [vfp] Re: Como saber si un control de texto posee un dato
> >> numerico o una cadena de caracteres??
> >> From: vich...@gmail.com
> >> To: publice...@googlegroups.com
> >>
> >> Hola Walter
> >>
> >> Prueba lo siguiente:
> >>
> >> lcTexto = "1234.56"
> >> ? Transform(lcTexto) == Transform(Val(lcTexto))
> >>
> >> lcTexto = "123.456"
> >> ? Transform(lcTexto) == Transform(Val(lcTexto))
> >>
> >> Saludos.
> >> Víctor.
> >>
> >> El 14 de septiembre de 2012 22:56, Walter R. Ojeda Valiente <
> >> wr...@hotmail.com> escribió:
> >>
> >> Pues en ese caso, la mejor solución posiblemente sea usar TRANSFORM() y
> >> VAL(), como Daniel sugirió, aunque su solución se puede simplificar un poco
> >> así:
> >>
> >> lcTexto = "123456"
> >> ? Transform(lcTexto) == Transform(Val(lcTexto))
> >>
> >> lcTexto = "123xx6"
> >> ? Transform(lcTexto) == Transform(Val(lcTexto))
> >>
> >> Saludos.
> >>
> >> Walter.
> >>
> >>
> >>
> >> ------------------------------
> >> ------------------------------
> --
>
>
>
>
>

edgar suarez kummers

unread,
Sep 15, 2012, 9:41:35 AM9/15/12
to publice...@googlegroups.com
Buenas Victor Hugo:

Muy buena solución la que das, planteada apenas en una línea, al estilo de Luis María Guayán.

Hay que tener reservadas en la mente localizaciones específicas para acumular códigos tan eficientes. Felicitaciones.

Cuando yo me enfrento a problemas de este estilo, los resuelvo cocinando un buen "plato de spaguettis" o sea analizando por código y barriendo las variables y colocando sumas de los subtotales.

Para contar hasta tres yo aprendí de chico a abrir muy poco la boca y a sumar así: "Tres es igual a uno más uno y más uno".

saludos y suerte

edgar



edgar suarez kummers


--
 
 
 

GeoSys Diseño de Software

unread,
Sep 15, 2012, 10:10:27 AM9/15/12
to publice...@googlegroups.com
Tengan cuidado con ISDIGIT, depende para el uso que le quieran dar ya que por ejemplo:

variable = "34%5.8.76"
?ISDIGIT(variable)

con ISDIGIT Esto da como resultado .T. (Verdadero)


Saludos

Anthony Contreras Peralta

Costa Rica.


--
 
 
 

Luis Maria Guayan

unread,
Sep 15, 2012, 11:43:15 AM9/15/12
to publice...@googlegroups.com
ISDIGIT solo tiene en cuenta si el primer caracter de la izquierda esta entre 0 y 9. Cualquier otro caracter de la cadena a la derecha del primer caracter es ignorado.

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

--
 
 
 

ZeRoberto

unread,
Sep 15, 2012, 2:45:32 PM9/15/12
to publice...@googlegroups.com
Usa expresiones regulares
 
Aca te dejo el patron para saber si es numero o no
 
^[+-]?\d+(\.\d+)?$
 
Saludos

--
 
 
 

Walter R. Ojeda Valiente

unread,
Sep 17, 2012, 1:08:21 PM9/17/12
to publice...@googlegroups.com
Y te falta agregar que acepte puntos y que la cantidad de puntos sea consistente.

Saludos.

Walter.





Date: Sat, 15 Sep 2012 09:10:29 -0400
--
 
 
 

Walter R. Ojeda Valiente

unread,
Sep 17, 2012, 1:10:55 PM9/17/12
to publice...@googlegroups.com
La función ISDIGIT() solamente te dice si el PRIMER caracter de una cadena es un dígito o no. No te da información sobre los siguientes caracteres, por lo tanto no sirve para el problema planteado.

Saludos.

Walter.




Date: Sat, 15 Sep 2012 08:10:27 -0600

Subject: Re: [vfp] Re: Como saber si un control de texto posee un dato numerico o una cadena de caracteres??
--
 
 
 

Víctor Hugo Espínola Domínguez

unread,
Sep 17, 2012, 4:30:31 PM9/17/12
to publice...@googlegroups.com
Hola Walter

Es verdad, pero eso ya es imposible de codificar en una sola línea, salvo que se use una expresión regular.

Con el auxilio de una función sí se puede, así:

? CHRTRAN( dato, CHRTRAN( dato, "1234567890,-", "" ), "" ) == dato AND RAT( "-", dato) <=1 AND OCCURS( ",", dato ) <= 1   AND PuntosOK( dato )

*
FUNCTION PuntosOk( tcDato AS String )

LOCAL lnCntPuntos, lnPosComa, lnPosControl, lnPosPunto, i AS Integer, llok AS Boolean

lnCntPuntos  = OCCURS( ".", tcDato )
lnPosComa    = AT( ",", tcDato )
lnPosControl = IIF( lnPosComa > 0, lnPosComa, LEN(tcDato ) + 1 )
lnPosPunto   = 0

FOR i = lnCntPuntos TO 1 STEP -1
lnPosPunto = AT( ".", tcDato, i )
IF ( lnPosControl - lnPosPunto ) % 4 > 0
EXIT
ENDIF
ENDFOR

IF i > 0 OR lnPosPunto > 4
llOk = .F.
ELSE
llOk = ( VAL( tcDato ) <> 0 ) OR ( lnCntPuntos = 0 )
ENDIF

RETURN llOk
*

Ahora sólo faltaría controlar que el número esté en notación científica ;-)

Saludos.
Víctor.



--
 
 
 

edgar suarez kummers

unread,
Sep 17, 2012, 4:36:03 PM9/17/12
to publice...@googlegroups.com
Estimados Victor Hugo y Walter:

Estoy sorprendido del código tan bien elaborado que presentan.

Me parece de lo más difícil llegar a esas expresiones.

Felicitaciones.

edgar



edgar suarez kummers


--
 
 
 

Reply all
Reply to author
Forward
0 new messages