Java 如何在Jasper报告中为十进制数指定舍入模式
我将Java与Jasper报表一起使用,并希望使用此格式掩码Java 如何在Jasper报告中为十进制数指定舍入模式,java,jasper-reports,rounding,Java,Jasper Reports,Rounding,我将Java与Jasper报表一起使用,并希望使用此格式掩码“#,##0.00”格式化十进制值。乍一看一切都很好,但我发现我的十进制值是使用舍入模式舍入的。半舍五入甚至是舍入模式,这在我的情况下是不正确的 这是否可以指定其他舍入模式(我需要HALF_DOWN模式)?您可以使用scriptlets机制 样本 Java类 package-utils; 导入java.math.BigDecimal; 导入java.math.RoundingMode; 导入java.text.DecimalForm
“#,##0.00”
格式化十进制值。乍一看一切都很好,但我发现我的十进制值是使用舍入模式舍入的。半舍五入甚至是舍入模式,这在我的情况下是不正确的
这是否可以指定其他舍入模式(我需要HALF_DOWN
模式)?您可以使用scriptlets机制
样本
- Java类
package-utils;
导入java.math.BigDecimal;
导入java.math.RoundingMode;
导入java.text.DecimalFormat;
公共类圆形帮助器{
公共静态字符串舍入(BigDecimal值、舍入模式、字符串模式){
DecimalFormat格式=新的DecimalFormat(模式);
format.setRoundingMode(模式);
返回格式。格式(值);
}
}
- 报告的模板:
- 结果将是(在iReport中预览)
另一个解决方案
另一种方法是使用方法(对于双字段):
或仅(对于BigDecimal字段):
关于JR中Scriptlet的更多信息:这里是另一个解决方案
您可以通过扩展默认JR格式工厂(net.sf.jasperreports.engine.util.DefaultFormatFactory)并通过JRParameter.REPORT\u format\u工厂参数发送扩展工厂的实例来更改数字格式化程序的默认舍入模式
可以通过setRoundingMode()方法更改java.text.DecimalFormat实例的舍入模式
我创建了内部类:
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;
}
});`
您可以使用scriptlet。或者您可以自定义classReview this thread@mauretto,您可以阅读该线程以获取如何使用scriptlet@MaykJasper报告进行查询,它应该设置十进制值的格式。我需要将jrxml设置为半向下舍入模式。我怎么做?
<textFieldExpression class="java.lang.String"><![CDATA[$F{COST}.setScale(0, BigDecimal.ROUND_HALF_DOWN).toString()]]></textFieldExpression>
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;
}
});`