如何使用Progress 4GL测试字符串是否为数字

时间:2013-10-10 13:53:16

标签: progress-4gl isnumeric

Progress 4GL是否具有测试字符串是否为数字的函数,如PHP的is_numeric($ foo)函数?

我在http://knowledgebase.progress.com/articles/Article/P148549看到了函数示例来测试字符串中的字符是否为数字。看起来它有一个错字,顺便说一句。

但我认为这种语言将是一种内置函数。

5 个答案:

答案 0 :(得分:4)

该语言没有内置的“isNum()”函数类型。

kbase方法的替代方案是:

function isNum returns logical ( input s as character ):
  define variable n as decimal no-undo.
  assign
    n = decimal( s )
    no-error
  .
  return ( error-status:num-messages = 0 ).
end.

display isNum( "123" ) isNum( "xyz" ).

答案 1 :(得分:3)

不需要功能就可以直接转换。

ASSIGN dNumber = DECIMAL(cNumber) NO-ERROR. 
IF ERROR-STATUS:ERROR THEN
DO:
    {Handle issues}        
END.

或者如果它始终是整数,则可以使用INTEGER而不是DECIMAL。

答案 2 :(得分:3)

我最近在看这个。批准的答案在100%的情况下不起作用。

如果用户输入以下任何特殊字符串字符:? * - 或+答案不起作用。
单个加号或减号(破折号)将转换为0,您可能不需要 单个问号字符是有效值,其中进度识别为您可能不想要的未知值 单个或组星号本身也会转换为0 如果您运行以下代码,您将看到我的意思。

add(_:)

以下附加代码可能有助于解决此问题

DISP DECIMAL("*")
     DECIMAL("**")
     DECIMAL("?")
     DECIMAL("+")
     DECIMAL("-").

答案 3 :(得分:1)

此代码处理任何数字字符串 - 即使使用的字符长于最大十进制长度等。

FUNCTION isNumeric RETURNS LOGICAL (textvalue AS CHAR):
    DEF VAR i AS INT NO-UNDO.

    IF textvalue = ? THEN RETURN TRUE.

    DO i = 1 TO (LENGTH(textvalue) - 1):
        INT(SUBSTRING(textvalue, i, (i + 1))) NO-ERROR.
        IF ERROR-STATUS:ERROR THEN RETURN FALSE.
    END.

    RETURN TRUE.
END FUNCTION.

答案 4 :(得分:0)

100%的时间可行

FUNCTION is-num RETURNS LOGICAL
    (INPUT cString AS CHARACTER):
    DEFINE VARIABLE iZeroCode    AS INTEGER   NO-UNDO.
    DEFINE VARIABLE iNineCode    AS INTEGER   NO-UNDO.
    DEFINE VARIABLE cChar        AS CHARACTER NO-UNDO.
    DEFINE VARIABLE iCount       AS INTEGER   NO-UNDO.

    DO iCount = 1 TO LENGTH(cString):
        ASSIGN iZeroCode = ASC("0")
               iNineCode = ASC("9")
               cChar     = SUBSTRING(cString,iCount,1).                           

        IF NOT(ASC(cChar) >= iZeroCode AND ASC(cChar) <= iNineCode)    THEN DO:
            RETURN FALSE.
        END.
    END.
    RETURN TRUE.
END.