5

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

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

但我认为该语言将是一个内置函数。

4

5 回答 5

5

我最近自己也在看这个。对此给出的批准答案在 100% 的情况下不起作用。

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

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

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

DEFINE VARIABLE iZeroCode    AS INTEGER   NO-UNDO.
DEFINE VARIABLE iNineCode    AS INTEGER   NO-UNDO.
DEFINE VARIABLE chChar       AS CHARACTER NO-UNDO.

ASSIGN iZeroCode = ASC("0")
       iNineCode = ASC("9")
       chChar    = SUBSTRING(cNumber,1,1).                           

IF NOT(ASC(chChar) >= iZeroCode AND ASC(chChar) <= iNineCode)    THEN DO:
    MESSAGE "Invalid Number..." VIEW-AS ALERT-BOX.
END.
于 2017-01-11T19:41:52.723 回答
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" ).
于 2013-10-10T14:38:47.227 回答
4

不需要函数就可以直接转换。

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

或者如果它总是整数可以使用 INTEGER 而不是 DECIMAL。

于 2013-10-11T06:42:17.703 回答
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.
于 2016-11-11T12:01:07.250 回答
1

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.
于 2020-04-28T08:44:33.833 回答