Mule ESB,从表达式节点格式化十进制格式

时间:2014-07-29 14:24:14

标签: json expression mule esb

我从数据库连接SQL语句中获得了类似于以下内容的结果:

[{"BALANCE":111.11},{"BALANCE":222.12},{"BALANCE":444.30}]

我使用表达式节点的以下内容来计算总和:

sum = 0;
foreach (row : message.payload) {
  sum += row['BALANCE'];
}
message.payload = sum;

这不太合适,但请注意下面返回的数字变量没有引号

777.5299999999999994315658113919199

从前一个帖子的优秀答案中,我切换到以下表达式节点内容:

sum = 0;
foreach (row : message.payload) {
  sum += row['BALANCE'];
}
message.payload = new java.text.DecimalFormat("#.##").format(sum);

这导致了以下准确结果:

"777.53"

我唯一的问题是它在数字周围有引号。如何消除报价?

由于

2 个答案:

答案 0 :(得分:1)

您可以尝试将总和转换为BigDecimal,然后将其上的比例设置为2.

message.payload = new BigDecimal(sum).setScale(2,java.math.RoundingMode.CEILING)

这会将您的有效负载保持为数字而不是字符串。

希望这有帮助。

答案 1 :(得分:1)

您问题的真正解决方法如下:不使用浮点数来存储货币金额。这很容易出现舍入错误(正如您在上面所经历过的那样),事实证明人们不喜欢在这里和那里失去分数。

有关详情,请阅读https://stackoverflow.com/a/3730040/387927

因此,修复数据库只存储整数,例如以美分111111代替111.11,并且只对这些分数执行整数计算。

或者查看数据库查询以返回java.math.BigDecimal个实例,而不是它似乎正在返回的floatsdoubles。那样你就不会有任何不利的四舍五入的伎俩。

任何其他方法,您首先要通过有损浮点数据类型然后执行舍入(如在用户1760178的答案中),将使您面临舍入问题。