如何在SAP CPI Groovy脚本中格式化Double类型薪资值
问题解决:Groovy(SAP CPI)中Double薪资值格式化
编译错误修复
首先解决你遇到的编译错误:删除代码中未使用的导入语句import java.util.text.NumberFormat;,这条导入完全多余,是导致编译失败的直接原因。
完整修正代码
以下是修复逻辑并实现薪资格式化需求的完整代码:
import com.sap.gateway.ip.core.customdev.util.Message; import java.math.RoundingMode; import java.text.DecimalFormat; // 格式化薪资为带千分位、两位小数的字符串 def String salaryFormat(Object salaryValue) { // 定义格式:千分位分隔,强制保留两位小数 DecimalFormat df = new DecimalFormat("#,###.00"); // 设置四舍五入模式,保证小数精度一致性 df.setRoundingMode(RoundingMode.HALF_UP); double salary; // 兼容XML读取的字符串类型和数值类型输入 if (salaryValue instanceof String) { salary = Double.parseDouble(salaryValue.trim()); } else { salary = (double) salaryValue; } return df.format(salary); } def Message processData(Message message) { def body = message.getBody(java.lang.String); def root = new XmlSlurper().parseText(body); // 用StringBuilder高效构建XML内容 StringBuilder strBody = new StringBuilder("<root>\n"); // 遍历所有EmpJob节点,Groovy风格遍历更简洁 root.EmpJob.each { empJob -> strBody.append(" <record>\n"); def formattedSalary = salaryFormat(empJob.User.salary.text()); strBody.append(" <Salary><![CDATA[").append(formattedSalary).append("]]></Salary>\n"); strBody.append(" </record>\n"); } strBody.append("</root>"); message.setBody(strBody.toString()); return message; }
关键修改说明
格式化函数优化:
- 兼容字符串(XML读取的内容)和数值类型输入,避免类型转换异常
- 格式模式改为
#,###.00,强制保留两位小数,完全匹配你需要的1,000.00格式 - 明确设置四舍五入模式,避免默认舍入行为导致的精度偏差
- 函数返回格式化后的字符串,而非原始数值,直接满足输出需求
XML构建逻辑修复:
- 使用
StringBuilder替代重复字符串拼接,提升性能且避免循环中覆盖内容的问题 - 改用Groovy原生的
each遍历语法,简化代码结构 - 确保所有
EmpJob记录都能被正确写入输出XML
- 使用
冗余代码清理:
- 删除未使用的
HashMap导入和多余变量声明 - 简化代码逻辑,提升可读性
- 删除未使用的
测试效果
输入薪资值100000,会被格式化为100,000.00;输入1234567.891,会被格式化为1,234,567.89。
内容的提问来源于stack exchange,提问作者Lloyd Albert Tongco
相关产品推荐
相关产品推荐

