如何在Jasper Reports中为十进制数指定RoundingMode

我正在使用Java与Jasper Reports,并希望使用此格式掩码"#,##0.00"格式化十进制值。 乍一看,所有看起来都很好,但我发现使用RoundingMode.HALF_EVEN舍入模式RoundingMode.HALF_EVEN入我的十进制值,这在我的情况下是不正确的。

这是否可以指定其他舍入模式(我需要HALF_DOWN模式)?

您可以使用scriptlet机制

例子

  • Java类
 package utils; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; public class RoundingHelper { public static String round(BigDecimal value, RoundingMode mode, String pattern) { DecimalFormat format = new DecimalFormat(pattern); format.setRoundingMode(mode); return format.format(value); } } 
  • 报告的模板:
                                                                                          
  • 结果将是(在iReport中预览)

iReport中的报告

另一解决方案

另一种方法是使用BigDecimal.setScale(int,java.math.RoundingMode)方法(对于字段):

  

或者只是(对于BigDecimal字段):

  

有关JR : Scriptlets中的scriptlet的更多信息

这是另一种解决方案。

您可以通过扩展默认的JR格式工厂(net.sf.jasperreports.engine.util.DefaultFormatFactory)并通过JRParameter.REPORT_FORMAT_FACTORY参数发送扩展工厂的实例来更改数字格式化程序的默认舍入模式。

可以通过setRoundingMode()方法更改java.text.DecimalFormat实例的舍入模式。

https://community.jaspersoft.com/questions/528989/decimal-formatting-rounding-mode-problem

我创建了内部类:

  getParameters().put(REPORT_FORMAT_FACTORY, new DefaultFormatFactory() { @Override public NumberFormat createNumberFormat(String pattern, Locale locale) { NumberFormat format = null; if (pattern != null && pattern.trim().length() > 0) { if (STANDARD_NUMBER_FORMAT_DURATION.equals(pattern)) { format = new DurationNumberFormat(); } else { format = locale == null ? NumberFormat.getNumberInstance() : NumberFormat.getNumberInstance(locale); if (format instanceof DecimalFormat) { format.setRoundingMode(HALF_UP); ((DecimalFormat) format).applyPattern(pattern); } } } return format; } });`