2

PHP 関数is_numeric()に似た Visual FoxPro 関数を探しています。
これを見つけましが、変数は常に数字のみを含む文字列であるため、VARTYPEorを使用できませんでした。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()また、文字式の左端の文字がアルファベットかどうかを決定する whichについても同じです。変数にアルファベットのみが含まれているかどうかを確認したい。

4

6 に答える 6

5

このように独自の関数を作成できます。

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
于 2012-12-14T11:53:22.183 に答える
1
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
于 2012-12-21T09:00:38.573 に答える
1

これは、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
于 2013-03-01T16:04:56.720 に答える
1

ワンライナーはいかがですか?

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

「.」のように「0123456789」に他の有効な文字を指定できます。また "、"

于 2013-03-03T12:14:05.990 に答える
0

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") が表示されます:
文字

于 2013-03-01T08:28:38.027 に答える