String FoxPro函数,用于确定变量是字符串还是数字字符串

String FoxPro函数,用于确定变量是字符串还是数字字符串,string,function,foxpro,visual-foxpro,digits,String,Function,Foxpro,Visual Foxpro,Digits,我正在寻找一个类似于PHP函数的Visual FoxPro函数。 我已经找到了,但是我不能使用VARTYPE或TYPE,因为变量总是一个只包含数字的字符串 我找到了ISDIGIT()函数,但手册上说它只检查第一个字符 确定指定字符的最左侧字符 表达式是一个数字(0到9) 参数 cExpression 指定ISDIGIT()测试的字符表达式。任何 cExpression中第一个字符之后的字符将被忽略 我将使用正则表达式对象VBScript.RegExp FUNCTION isNumeric( tc

我正在寻找一个类似于PHP函数的Visual FoxPro函数。
我已经找到了,但是我不能使用
VARTYPE
TYPE
,因为变量总是一个只包含数字的字符串

我找到了
ISDIGIT()
函数,但手册上说它只检查第一个字符

确定指定字符的最左侧字符 表达式是一个数字(0到9)

参数
cExpression

指定ISDIGIT()测试的字符表达式。任何 cExpression中第一个字符之后的字符将被忽略

我将使用正则表达式对象
VBScript.RegExp

FUNCTION isNumeric( tcValue )
    LOCAL oRE
    oRE = CreateObject("VBScript.RegExp")
    oRE.Pattern = '^[0-9]+$'
    RETURN oRE.test( tcValue )      
ENDFUNC

? isNumeric( '123' )
但是,FoxPro是否为此提供了任何功能?
我只是在俯瞰吗


同样适用于
ISALHPA()
,它确定字符表达式中最左边的字符是否为字母。我想检查变量是否只包含字母。

您可以像这样创建自己的函数

FUNCTION IsAllDigits
    LPARAMETERS tcSearched, tcOptionalSearch

    * tcSearched = the string of characters to test.
    * tcOptionalSearch = optional, additional characters to allow.

    LOCAL lcSearch
    m.lcSearch = "01234567989" + IIF(VARTYPE(m.tcOptionalSearch) = "C", m.tcOptionalSearch, "")

    LOCAL lcRemaining
    m.lcRemaining = CHRTRAN(m.tcSearched, m.lcSearch, "")

    RETURN ( LEN(m.lcRemaining) = 0 )
ENDFUNC
函数是数值函数
L参数cVal
本地llNumeric、lnLen、lcChr、lnDecs、lnVal
llNumeric=VARTYPE(cVal)=“N”&&驴已经发送了一个数值
lnDecs=0
办案
案例llNumeric
大小写变量类型(cVal)“C”和非字符(&N)
否则
cVal=所有修剪(cVal)和修剪空间
lnLen=LEN(cVal)&&有多少个字符
llNumeric=.T.&&假定
i=0
执行llNumeric和i0&&1-9时正常
列表中的大小写(lcChr、“-”、“+”&&允许,但仅在开头
llNumeric=i=1
CASE lcChr=“.”&&小数点,但只有一个
lnDecs=lnDecs+1
llNumeric=lnDecs=1
否则
llNumeric=.F。
尾声
恩多
尾声
返回llNumeric
ENDFUNC

仅使用Visual Fox Pro,您可以执行以下操作:

FUNCTION is_numeric(var_name)
    error_trigger=.f. &&** first initialization 
    &&** evaluate("any_char") will generate an error so I'm using TRY-CATCH-ENDTRY  
    TRY  
      EVALUATE(var_name)
    CATCH &&** evaluate() generates an error then the string is character
      WAIT WINDOW "character"   
      error_trigger=.t. &&** there was an error returned by evaluate()
      EXIT  && stop and jump after ENDTRY
    ENDTRY 
    IF error_trigger=.f. &&** there was no error returned by evaluate() then the string was numeric
       WAIT WINDOW "numeric"
    ENDIF 
ENDFUNC 
然后调用函数:
is_numeric(“333”)将显示:numeric
是数字(“aaa”)将显示:字符
是数字(“333a333”)将显示:字符

我希望它将帮助您

这可能适用于ISDIGIT()或ISALPHA()

一班怎么样

Function IsNumeric
Lparameters pString
Return  m.pString == Chrtran(m.pString, Chrtran(m.pString, "0123456789", ""), "")
EndFunc

您可以将任何其他有效字符添加到“0123456789”中,如“.”或“,”

测试字符串是否为数字更简单:

  • 如果String=“123”=>val('String')>0
  • 如果String=“AB123”=>val('String')=0

仅此而已……

不,没有语言函数可以做到这一点。像Frank在下面发布的功能是唯一的方法。谢谢Frank!你的很棘手。但是我们能检查小数点吗?例如,“12.34”是数字,但“12.34.56”不是数字。只需将“.”添加到允许的字符列表中,并添加一个检查发生情况的测试(“.”,m.tcsearch)太好了!向上投票!您的循环甚至可以检查小数点和负值。但我不太喜欢while循环,因为它可能会在一个长过程中调用,甚至在嵌套循环中调用。我认为我们可以使用
ATC()
OCCURS()
来检查每个字符,而不是循环,例如,“-”和“+“必须在第一个位置。对于这种情况,我们可以使用
ATC()
。并且字符串不能包含两个点“”。对于这种情况,我们可以使用
ocurses()
。如果String=“0”=>val('String')=0否,很遗憾不是。VAL()将1ABC10之类的值转换为1。
FUNCTION is_numeric(var_name)
    error_trigger=.f. &&** first initialization 
    &&** evaluate("any_char") will generate an error so I'm using TRY-CATCH-ENDTRY  
    TRY  
      EVALUATE(var_name)
    CATCH &&** evaluate() generates an error then the string is character
      WAIT WINDOW "character"   
      error_trigger=.t. &&** there was an error returned by evaluate()
      EXIT  && stop and jump after ENDTRY
    ENDTRY 
    IF error_trigger=.f. &&** there was no error returned by evaluate() then the string was numeric
       WAIT WINDOW "numeric"
    ENDIF 
ENDFUNC 
Function IsAllDigits(myValue)
   lReturn = .t. 
   FOR i = 1 TO LEN(myvalue)
      IF !ISDIGIT( SUBSTR(myValue, i, 1)  )
         lReturn = .f.
         EXIT
      ENDIF
   ENDFOR
   RETURN lReturn
ENDFUNC
Function IsNumeric
Lparameters pString
Return  m.pString == Chrtran(m.pString, Chrtran(m.pString, "0123456789", ""), "")
EndFunc