Progress 4GL 是否具有用于测试字符串是否为数字的函数,例如 PHP 的 is_numeric($foo) 函数?
我在http://knowledgebase.progress.com/articles/Article/P148549看到了函数示例来测试字符串中的字符是否为数字。好像有错别字,顺便说一句。
但我认为该语言将是一个内置函数。
Progress 4GL 是否具有用于测试字符串是否为数字的函数,例如 PHP 的 is_numeric($foo) 函数?
我在http://knowledgebase.progress.com/articles/Article/P148549看到了函数示例来测试字符串中的字符是否为数字。好像有错别字,顺便说一句。
但我认为该语言将是一个内置函数。
我最近自己也在看这个。对此给出的批准答案在 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.
该语言没有内置的“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" ).
不需要函数就可以直接转换。
ASSIGN dNumber = DECIMAL(cNumber) NO-ERROR.
IF ERROR-STATUS:ERROR THEN
DO:
{Handle issues}
END.
或者如果它总是整数可以使用 INTEGER 而不是 DECIMAL。
此代码处理任何数字字符串 - 即使使用的字符长于最大十进制长度等。
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.
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.