【问题标题】:How to add leading zeros to field expression contains numeric value? [duplicate]如何在包含数值的字段表达式中添加前导零? [复制]
【发布时间】:2019-12-27 11:24:44
【问题描述】:

我必须在 iReport 中为条形码添加“id”(字符串)。

id 是 8 位数字(这可能会有所不同),我想在其中添加 4 个前导 0。这样id的长度就变成了12。

jrxml

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="PadStringNumber" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="07c0dc81-9b58-48f9-8129-e0e08fe1cb98">
    <parameter name="id" class="java.lang.String">
        <defaultValueExpression><![CDATA["23423552"]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <title>
        <band height="39" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="550" height="30" uuid="26317c0f-77c0-46cb-a4d8-1ee4fa1e7387"/>
                <textFieldExpression><![CDATA[String.format("%12d",$P{id})]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

我目前的错误是:

Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: String.format("%12d",$P{id})
    at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:291)
    at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:618)
    at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:586)
    at net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression(JRFillElement.java:1020)
    at net.sf.jasperreports.engine.fill.JRFillTextField.evaluateText(JRFillTextField.java:567)
    at net.sf.jasperreports.engine.fill.JRFillTextField.evaluate(JRFillTextField.java:551)
    at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:281)
    at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:504)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillTitle(JRVerticalFiller.java:315)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:251)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:119)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:558)
    at net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFill.run(BaseFillHandle.java:119)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at PadStringNumber_1566475648252_841187.evaluate(PadStringNumber_1566475648252_841187:178)
    at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:277)
    ... 13 more

【问题讨论】:

  • @PetterFriberg ID 不是固定的,长度可能会有所不同,但我需要为条形码显示固定长度 12。我试过 String.format("%12d", $F{myBarcode}),它抛出了这个错误:“ Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException”
  • 好的,显示 jrxml minimal reproducible example 的最小版本以及您得到的确切错误 (stacktrace) edit 问题。
  • 在我的数据库中,id 值是整数,我在 java 类中转换为 String 并进一步使用数据。它将此显示为另一个原因,“原因:java.util.IllegalFormatConversionException:d!= java.lang.String”
  • 是的,您需要将其解析为整数(或将其作为整数传递)或使用库,如果您编辑,也许我可以回答
  • 用这个问题新建一个小的 jrxml 并显示 stacktrace

标签: jasper-reports


【解决方案1】:

该错误与您无法使用数字模式%12d 格式化字符串有关,要使用此功能,您需要先将字符串解析为数字,如果它不是数字自然无法完成

作为 jasper 报告中的一般解决方案,我将使用 org.apache.commons.lang3.StringUtils.leftPad,jasper 报告已经通过 commons-collections 将这个库作为 dependence (无需安装)。此方法适用于任何字符串,即使是 "HelloWorld"

org.apache.commons.lang.StringUtils.leftPad($P{id}, 12, "0")

如果您确定 id 始终是一个数字,您也可以先解析字符串(如果它不是数字则会抛出错误)。我正在使用Long,因为Integer 的最大值为2147483647

String.format("%012d", Long.parseLong($P{id}))

完整的 jrxml 示例

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="PadStringNumber" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="07c0dc81-9b58-48f9-8129-e0e08fe1cb98">
    <parameter name="id" class="java.lang.String">
        <defaultValueExpression><![CDATA["23423552"]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <title>
        <band height="177" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="10" width="550" height="30" uuid="b4a554e1-25c2-4bf9-a6f2-5d9b1a937384"/>
                <textElement verticalAlignment="Middle">
                    <font isBold="true"/>
                </textElement>
                <text><![CDATA[org.apache.commons.lang.StringUtils.leftPad]]></text>
            </staticText>
            <textField>
                <reportElement x="0" y="40" width="550" height="30" uuid="26317c0f-77c0-46cb-a4d8-1ee4fa1e7387"/>
                <textElement verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[org.apache.commons.lang.StringUtils.leftPad($P{id}, 12, "0")]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="0" y="100" width="550" height="30" uuid="64bbd86b-bcf4-41ea-892b-0511fcc9167b"/>
                <textElement verticalAlignment="Middle">
                    <font isBold="true"/>
                </textElement>
                <text><![CDATA[Long.parseLong()]]></text>
            </staticText>
            <textField>
                <reportElement x="2" y="130" width="550" height="30" uuid="384e670e-b682-4491-9937-64441bd73203"/>
                <textElement verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[String.format("%012d", Long.parseLong($P{id}))]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2015-05-14
    相关资源
    最近更新 更多