FDMEE中Jython的if elif条件判断结果异常排查请求
问题排查与解决:FDMEE Jython脚本条件判断异常
错误原因分析
你遇到的问题核心是字符串与数字的比较逻辑混淆了。代码里把计算出来的数字类型diff通过diff = ("%d" % diff)转换成了字符串,而字符串的比较是按字符的ASCII顺序逐位对比,不是我们直觉里的数值大小对比。
举个直观的例子:当diff是367时,转换成字符串是"367",和"90"比较时,第一个字符'3'的ASCII值小于'9',所以"367" <= "90"会被判定为True——这就是为什么明明数值是367,却错误进入了diff<=90的分支。
解决方法
只需要保留diff的整数类型,不要将其转换为字符串,直接进行数值比较即可。
修改后的完整代码
def Timetest(strField, strRecord): import java.util.Date as date import java.text.SimpleDateFormat as Sdf import java.lang.Exception as Ex import java.sql as sql import java.util.concurrent.TimeUnit as TimeUnit PerKey = fdmContext["PERIODKEY"] strDate = strRecord.split(",")[11] # 获取到期日 strMM = strDate.split("/")[0] strDD = strDate.split("/")[1] strYYYY = strDate.split("/")[2] strDate = ("%s.%s.%s" % (strMM,strDD, strYYYY)) # 转换到期日格式 sdf = Sdf("MM.dd.yyyy") strMRD = sdf.parse(strDate) # 计算日期差值 - 保留整数类型,不转换为字符串 diff = (strMRD.getTime() - PerKey.getTime()) // 86400000 # 用整数除法确保结果为整数 if diff >= 0: if diff <= 30: return "Mat_Up1m " + str(diff) elif diff <= 90: return "Mat_1to3m " + str(diff) elif diff <= 360: return "Mat_3to12m " + str(diff) elif diff <= 1800: return "Mat_1to5y " + str(diff) else: return "Mat_Over5y " + str(diff)
额外优化说明
- 把原有的
diff>="0"改成数值比较diff >=0,逻辑更严谨清晰; - 使用整数除法
//替代普通除法/,确保diff始终是整数,避免浮点数带来的潜在比较问题; - 仅在返回结果时才将
diff转为字符串拼接,完全不影响条件判断的逻辑。
内容的提问来源于stack exchange,提问作者user1550192
相关产品推荐
相关产品推荐

