【问题标题】:FoxPro functions which determine if a variable is a character string or a numeric stringFoxPro 函数确定变量是字符串还是数字字符串
【发布时间】:2012-12-14 11:07:40
【问题描述】:

我正在寻找一个类似于 PHP 函数 is_numeric() 的 Visual FoxPro 函数。
我找到了this,但我无法使用VARTYPE 或TYPE,因为变量始终是仅包含数字的字符串。

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

判断是否是指定字符的最左边字符 表达式是一个数字(0 到 9)。

  ISDIGIT(cExpression)

参数
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() 也一样,它确定字符表达式中最左边的字符是否为字母。我想检查变量是否只包含字母。

【问题讨论】:

  • 不,没有语言功能可以做到这一点。像 Frank 在下面发布的函数是唯一的方法。

标签: string function foxpro visual-foxpro digits


【解决方案1】:

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

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

【讨论】:

  • 谢谢弗兰克!你的很棘手。但是我们可以检查小数点吗?例如,“12.34”是数字,但“12.34.56”不是数字。
  • 只需添加“。”到允许的字符列表并添加一个测试来检查 OCCURS('.', m.tcSearched)
【解决方案2】:
FUNCTION ISNUMERIC
    LPARAMETERS cVal
    LOCAL llNumeric, lnLen, lcChr, lnDecs, lnVal

    llNumeric = VARTYPE(cVal) = "N"      && Donkey has sent a numeric value
    lnDecs = 0

    DO CASE
        CASE llNumeric
        CASE VARTYPE(cVal)<>"C"          && Not a character
        OTHERWISE
            cVal = ALLTRIM(cVal)         && Trim spaces
            lnLen = LEN(cVal)            && How many characters
            llNumeric = .T.              && Assume
            i = 0
            DO WHILE llNumeric AND i<lnLen
                i = i+1
                lcChr = SUBSTR(cVal,i,1)        && Get next char
                    lnVal = VAL(lcChr)
                DO CASE
                CASE lcChr = "0"                && Allowed
                CASE lnVal>0                    && 1 - 9 OK
                CASE INLIST(lcChr, "-", "+")    && Allowed but ONLY at the start
                    llNumeric = i = 1
                CASE lcChr = "."                && Decimal point but ONLY one
                    lnDecs = lnDecs+1
                    llNumeric = lnDecs = 1
                OTHERWISE
                    llNumeric = .F.
            ENDCASE
        ENDDO
    ENDCASE
    RETURN llNumeric
ENDFUNC

【讨论】:

  • 完美!赞成!您甚至可以检查小数点和负值。但我不太喜欢 while 循环,因为它可能会在较长的过程中甚至在嵌套循环中被调用。
  • 我认为我们可以使用ATC(),OCCURS()来检查每个字符而不是循环,例如“-”和“+”必须在第一个位置。对于这种情况,我们可以使用ATC()。并且字符串不能包含两个点“.”。对于这种情况,我们可以使用OCCURS()。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    一个班轮怎么样?

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

    您可以将任何其他有效字符改为“0123456789”,例如“.”。或“,”

    【讨论】:

      【解决方案5】:

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

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

      就是这样……

      【讨论】:

      • If String="0" => val('String')=0 no?
      • 很遗憾没有。 VAL() 将 1ABC10 等值转换为 1。
      【解决方案6】:

      仅使用 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") 将显示:数字
      is_numeric("aaa") 将显示:字符
      is_numeric("333a333") 将显示:字符
      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 2020-07-24
        • 2018-05-08
        • 2015-01-01
        相关资源
        最近更新 更多