【问题标题】:Mule ESB, formatting decimal format from expression nodeMule ESB,从表达式节点格式化十进制格式
【发布时间】:2014-07-30 02:00:36
【问题描述】:

之前,我从数据库连接 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"

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

谢谢

【问题讨论】:

  • 你想要一个字符串还是一个数字?如果是数字,第一个解决方案是正确的。如果是字符串,则第二个是。

标签: json expression mule esb


【解决方案1】:

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

阅读https://stackoverflow.com/a/3730040/387927了解更多信息。

因此修复数据库以仅存储整数,例如以美分为单位,111111 而不是 111.11,并且仅对这些美分执行整数计算。

或查看数据库查询以返回 java.math.BigDecimal 实例,而不是它似乎正在返回的 floatsdoubles。这样一来,您就不会受到不利的四舍五入。

如果您首先处理有损浮点数据类型,然后执行舍入(如 user1760178 的回答),任何其他方法都会使您面临舍入问题。

【讨论】:

    【解决方案2】:

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

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2020-07-21
      • 1970-01-01
      相关资源
      最近更新 更多