问题描述
最近做了一个简单的自动计算工资的功能。其中用到国内的开源的框架:IKExpression处理其中的计算工资的公式解析问题。在IKExpression中规定:公式中的字符串之间的比较解析,需要给字符串添加转义符。如下公式:String exp = "(角色 == "小麦计量")?((计量工资+基本工资*0.3)*0.5*(1+绩效分数*0.01)):((角色 == "中转计量")?(绩效分数*(岗位基数+计量工资)*0.01):((角色 == "内勤")?(绩效分数*0.01*岗位基数):(0)))";如下参数:variables.add(Variable.createVariable("角色", "中转计量"));variables.add(Variable.createVariable("计量工资", new Double(100.0)));variables.add(Variable.createVariable("基本工资", new Double(100.0)));variables.add(Variable.createVariable("绩效分数", new Double(90.0)));variables.add(Variable.createVariable("岗位基数", new Double(5000)));在TestCase中测试OK,没有问题。执行前打印公式:expression : (角色 == "小麦计量")?((计量工资+基本工资*0.3)*0.5*(1+绩效分数*0.01)):((角色 == "中转计量")?(绩效分数*(岗位基数+计量工资)*0.01):((角色 == "内勤")?(绩效分数*0.01*岗位基数):(0)))转义符自动转换了。既然解决了问题,咱就开始前台设计了。把上面的公式,带转义符的设置到前台。然后保存进数据库。在根据业务从数据库中读取出来。这时候问题来了。转义字符一直存在。公式无法解析。提示有非法的字符:测试很多次无果。强烈以为数据在保存进oracle的时候,编码被数据库给改变,导致java自身识别不了,无法自动解析这"转义符号。最后过次测试。把前台的公式编辑器里保存提交时候的公式写成如下:(角色 == "小麦计量")?((计量工资+基本工资*0.3)*0.5*(1+绩效分数*0.01)):((角色 == "中转计量")?(绩效分数*(岗位基数+计量工资)*0.01):((角色 == "内勤")?(绩效分数*0.01*岗位基数):(0)))然后,什么问题都没有了。接着,我的疑问来了。前台提交字符串: 角色=="测试"我们都知道String test = ""; 这是java中的字符定义方式。那再action中传递来的字符: 角色=="测试"在获取的时候 难道不是 : "角色=="测试"" 这样的?如果是这样的话,那字符不就被截断成:"角色==","测试" 这样2个字符?这里的本来应该有的" 哪里去了,自动处理还是?反正不用转义符这样的变量:角色=="测试"应该是无法申明或者赋值的吧。
解决方案
JVM中的一个字符串,不管有多少双引号都没有关系,它自己会认识的,比如你从文件中读取一个字符串:角色=="测试",那么JVM中的字符串就还是原样的字符串,不存在截断的问题。要转义,主要是显式写在代码中时,需要加进行转义,还有进行字符串拼接时。
解决方案二:
你可以测试下从前台传入 " 如果后台得到的长度是2那么就是两个字符 而表达字面量时是一个字符