Jasper reports 如何将前导零添加到包含数值的字段表达式?

Jasper reports 如何将前导零添加到包含数值的字段表达式?,jasper-reports,Jasper Reports,我必须在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"

我必须在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>

该错误与无法使用数字模式格式化字符串有关。要使用该模式,您需要先将字符串解析为数字,如果该字符串不是数字,则自然无法执行此操作

作为我将使用的jasper reports中的通用解决方案,jasper reports已经通过commons集合(无需安装)使用了这个库。此方法将适用于任何字符串,即使是
“HelloWorld”

如果您确定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>

结果


错误与无法使用数字模式格式化字符串有关
%12d
,要使用此模式,您需要首先将字符串解析为数字,如果它不是数字,则自然无法执行此操作

作为我将使用的jasper reports中的通用解决方案,jasper reports已经通过commons集合(无需安装)使用了这个库。此方法将适用于任何字符串,即使是
“HelloWorld”

如果您确定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>

结果


@PetterFriberg ID不是固定的,长度可能会有所不同,但我需要为条形码显示固定长度12。我尝试过String.format(“%12d”,$F{myBarcode}),它抛出了这个错误:“由:net.sf.jasperreports.engine.fill.JRexpressioneValeException引起”好的,显示jrxml的最低版本和问题的确切错误(stacktrace)。在我的DB中,id值是整数,我正在java类中转换为字符串,并进一步使用数据。它将此作为另一个原因显示,“由:java.util.IllegalFormatConversionException:d!=java.lang.String引起”是的,您需要将其解析为整数(或将其作为整数传递)或使用一个库,如果您进行编辑,可能我可以回答这个问题并显示一个新的jrxmlstacktrace@PetterFribergID不是固定的,长度可能不同,但我需要一个固定的长度为12显示的条形码。我尝试过String.format(“%12d”,$F{myBarcode}),它抛出了这个错误:“由:net.sf.jasperreports.engine.fill.JRexpressioneValeException引起”好的,显示jrxml的最低版本和问题的确切错误(stacktrace)。在我的DB中,id值是整数,我正在java类中转换为字符串,并进一步使用数据。这是另一个原因,“由:java.util.IllegalFormatConversionException:d!=java.lang.String引起”是的,您需要将其解析为整数(或将其作为整数传递)或使用库,如果您进行编辑,可能我可以回答这个问题,只需生成一个新的jrxml并显示stacktrace