TA的每日心情 | 奋斗 3 天前 |
---|
签到天数: 1720 天 连续签到: 3 天 [LV.Master]伴坛终老
管理员
进击的思考者
- 积分
- 39250
|
可以作为函数库,放在自己的.I文件中,以便使用。
FUNCTION fn-ISCHAR RETURN LOGICAL (INPUT ip_textin AS CHAR): /* via Marco Aurelio */
DEFINE VAR VA-INT AS DECIMAL NO-UNDO.
ip_textin=trim(ip_textin).
IF ip_textin ="" OR ip_textin = ? THEN RETURN NO.
VA-INT = DECIMAL(ip_textin) NO-ERROR.
RETURN ERROR-STATUS:ERROR. /* Does not include numbers */
END FUNCTION.
FUNCTION fn-ISDECIMAL RETURN LOGICAL (INPUT ip_textin AS CHAR):
DEFINE VAR va-value AS DECIMAL NO-UNDO.
ip_textin=trim(ip_textin).
IF ip_textin ="" OR ip_textin = ? THEN RETURN NO.
ASSIGN va-value = DECIMAL(ip_textin) no-error.
RETURN NOT ERROR-STATUS:ERROR.
END FUNCTION.
FUNCTION fn-ISINTEGER RETURN LOGICAL (INPUT ip_textin AS CHAR):
DEFINE VAR va-value AS INTEGER NO-UNDO.
ip_textin=trim(ip_textin).
IF ip_textin ="" OR ip_textin = ? THEN RETURN NO.
ASSIGN va-value = INTEGER(ip_textin) NO-ERROR.
IF error-status:error THEN RETURN NO. /* Catch chars */
IF decimal(ip_textin) - va-value <> 0 THEN return NO. /* Catch decimal - integer. */
RETURN YES.
END FUNCTION.
FUNCTION fn-IsNumber RETURNS LOGICAL /* From Jeff Pilant */
(INPUT ip_textin as character) :
DEFINE VARIABLE VA-SubStr AS CHARACTER NO-UNDO.
DEFINE VARIABLE VA-NumCommas AS INTEGER NO-UNDO.
DEFINE VARIABLE VA-NumPeriods AS INTEGER NO-UNDO.
DEFINE VARIABLE VA-IntegerPart AS CHARACTER NO-UNDO.
DEFINE VARIABLE cComma AS CHARACTER NO-UNDO INITIAL ",".
DEFINE VARIABLE cPeriod AS CHARACTER NO-UNDO INITIAL ".".
DEFINE VARIABLE VA-iCount AS INTEGER NO-UNDO.
DEFINE VARIABLE VA-IntegerDelimiterCount AS INTEGER NO-UNDO.
IF ip_textin = ? THEN RETURN NO.
IF TRIM(ip_textin, "+-0123456789.,") <> "" THEN RETURN NO.
VA-SubStr = SUBSTRING(ip_textin, 1, 1).
IF TRIM(VA-SubStr, "+-") = ""
THEN ip_textin = SUBSTRING(ip_textin, 2).
ELSE VA-SubStr = "+".
IF TRIM(ip_textin, "0123456789.,") <> "" THEN RETURN NO.
IF SESSION:NUMERIC-FORMAT = "AMERICAN" THEN
DO:
VA-NumPeriods = NUM-ENTRIES(ip_textin, cPeriod).
IF VA-NumPeriods > 2 THEN RETURN NO.
VA-IntegerPart = ENTRY(1, ip_textin, cPeriod).
VA-NumCommas = NUM-ENTRIES(VA-IntegerPart, cComma).
IF VA-NumCommas > 1 then
DO:
VA-IntegerDelimiterCount = NUM-ENTRIES(VA-IntegerPart, cComma).
IF LENGTH(ENTRY(1, VA-IntegerPart, cComma)) > 3 THEN RETURN NO.
IF VA-IntegerDelimiterCount > 1 THEN
DO VA-iCount = 2 TO VA-IntegerDelimiterCount:
IF LENGTH(ENTRY(VA-iCount, VA-IntegerPart, cComma)) <> 3 THEN RETURN NO.
END.
END.
IF VA-NumPeriods > 1 THEN
IF INDEX(ENTRy(2, ip_textin, cPeriod), cComma) > 0 THEN RETURN NO.
RETURN YES.
END.
IF SESSION:NUMERIC-FORMAT = "EUROPEAN" THEN
DO:
VA-NumCommas = NUM-ENTRIES(ip_textin, cComma).
IF VA-NumCommas > 2 THEN RETURN NO.
VA-IntegerPart = entry(1, ip_textin, cComma).
VA-NumPeriods = NUM-ENTRIES(VA-IntegerPart, cPeriod).
IF VA-NumPeriods > 1 THEN
DO:
VA-IntegerDelimiterCount = NUM-ENTRIES(VA-IntegerPart, cPeriod).
IF LENGTH(ENTRY(1, VA-IntegerPart, cPeriod)) > 3 THEN RETURN NO.
IF VA-IntegerDelimiterCount > 1 THEN
DO VA-iCount = 2 TO VA-IntegerDelimiterCount:
IF LENGTH(ENTRY(VA-iCount, VA-IntegerPart, cPeriod)) <> 3 THEN RETURN NO.
END.
END.
IF VA-NumCommas > 1 THEN
IF INDEX(ENTRY(2, ip_textin, cComma), cPeriod) > 0 THEN RETURN NO.
RETURN YES.
END.
RETURN NO.
END FUNCTION.
FUNCTION fn-ISCHAR-loop RETURN LOGICAL (INPUT ip_textin AS CHARACTER): /* from Carlos Eduardo P. Carvalho */
DEFINE VARIABLE va-loop AS INTEGER NO-UNDO.
DEFINE VARIABLE va-letter AS CHARACTER FORMAT "X(70)" NO-UNDO.
ip_textin=trim(ip_textin).
IF ip_textin ="" OR ip_textin = ? THEN RETURN NO.
DO va-loop = 0 TO 25: /* WORKS NO MATTER CODE PAGE */
va-letter = va-letter + CHR((ASC("A")) + va-loop).
END.
va-letter = va-letter + "0123456789". /* include numbers */
DO va-loop = 1 TO LENGTH(ip_textin):
IF INDEX(va-letter, SUBSTRING(ip_textin,va-loop,1)) = 0 THEN
RETURN NO.
END.
RETURN YES.
END FUNCTION.
FUNCTION fn-ISCHAR-trim RETURN LOGICAL (INPUT ip_textin AS CHAR): /* me */
IF TRIM(ip_textin) = "" OR ip_textin = ? THEN RETURN NO.
RETURN TRIM(ip_textin, "ABCEDFGHIJKLMNOPQRSTUVWXYZ") = "". /* could add numbers here if you wanted */
END FUNCTION.
FUNCTION fn-ISDECIMAL-loop RETURN LOGICAL (INPUT ip_textin AS CHARACTER): /* modeled after the fn-ischar-loop */
DEFINE VARIABLE va-loop AS INTEGER NO-UNDO.
IF ip_textin ="" OR ip_textin = ? THEN RETURN NO.
DO va-loop = 1 TO LENGTH(ip_textin):
IF INDEX("0123456789.,-+":U, SUBSTRING(ip_textin,va-loop,1)) = 0 THEN
RETURN NO.
END.
RETURN YES.
END FUNCTION.
FUNCTION fn-ISDECIMAL-trim RETURN LOGICAL (INPUT ip_textin AS CHAR): /* Idea From Jeff Pilant */
IF TRIM(ip_textin) = "" OR ip_textin = ? then RETURN NO.
RETURN TRIM(ip_textin, "0123456789-+.,") = "". /* includes dash period and comma */
END FUNCTION.
FUNCTION fn-ISINTEGER-trim RETURN LOGICAL (INPUT ip_textin AS CHAR): /* Idea From Jeff Pilant */
IF TRIM(ip_textin) = "" OR ip_textin = ? THEN RETURN NO.
RETURN TRIM(ip_textin, "0123456789-+") = "".
END FUNCTION.
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|