19

数値を含む文字列があります。

百がコンマで区切られ、数字の前に $ ドル記号があるようにフォーマットしたいと思います。

たとえば、12345 は $12,345.00 にフォーマットする必要があります。

ドル記号なしで以下のコードを試しました:

new java.text.DecimalFormat(#,##0.00).format.(myString)

そしてドル記号付きの下のもの:

new java.text.DecimalFormat($ #,##0.00).format.(myString)

ただし、どちらもエラーを出しています。

このフォーマットを実現する正しい方法は何ですか?

これはジャスパー レポート jrxml の一部であり、レポートで「null」を回避したいため、以下のコードを挿入します。

<textField isBlankWhenNull="false" isStretchWithOverflow="true">            
  <reportElement stretchType="RelativeToTallestObject" x="1350" y="0" width="150" height="30"/>             
      <textElement/>             
   <textFieldExpression class="java.math.BigDecimal"><![CDATA[$F{myString}!=null?new java.text.DecimalFormat(#,##0.00).format.($F{myString}):"Unavailable"]]></textFieldExpression>        
</textField>

myString はクエリの結果であり、jrxml で次のように宣言されます。

 <field name="myString" class="java.lang.String"/>

以前、myString は BigDecimal として宣言されていましたが、比較演算子 ?= が機能していませんでした。

通貨の値が利用できない場合、デフォルトの「null」ではなく「利用不可」をレポートに出力したいと考えています。それ以外の場合は、上記のように数値を適切にフォーマットする必要があります。

この問題を解決するにはどうすればよいですか?

読んでくれてありがとう。

4

8 に答える 8

42

正しい表現は次のとおりです。

new java.text.DecimalFormat("$ #,##0.00").format(Double.valueOf($P{strParam}))

java.lang.Integerおよびjava.lang.Stringの作業サンプル:

<?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="format_as_current" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <parameter name="intParam" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[12345678]]></defaultValueExpression>
    </parameter>
    <parameter name="strParam" class="java.lang.String">
        <defaultValueExpression><![CDATA["12345678.95"]]></defaultValueExpression>
    </parameter>
    <title>
        <band height="79" splitType="Stretch">
            <textField>
                <reportElement x="137" y="18" width="291" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[new java.text.DecimalFormat("$ #,##0.00").format($P{intParam})]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="137" y="48" width="291" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[new java.text.DecimalFormat("$ #,##0.00").format(Double.valueOf($P{strParam} != null && $P{strParam}.length() > 0 ? Double.valueOf($P{strParam}) : 0))]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

結果は次のようになります ( iReportでのプレビュー):

*iReport* の結果

注: null のチェックも追加する必要があります。

データの書式設定にtextFieldのpatternプロパティを使用することもできます。

標本、見本:

<?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="format_as_current" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <parameter name="intParam" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[12345678]]></defaultValueExpression>
    </parameter>
    <parameter name="strParam" class="java.lang.String">
        <defaultValueExpression><![CDATA["12345678.95"]]></defaultValueExpression>
    </parameter>
    <title>
        <band height="148" splitType="Stretch">
            <textField pattern="$ #,##0.00">
                <reportElement x="218" y="99" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$P{intParam}]]></textFieldExpression>
            </textField>
            <textField pattern="$ #,##0.00">
                <reportElement x="218" y="119" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$P{strParam} != null && $P{strParam}.length() > 0 ? Double.valueOf($P{strParam}) : 0]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

結果は同じになります。

于 2012-06-06T12:07:58.967 に答える
3

この問題に遭遇したばかりで、うまく機能する解決策を見つけました。

注意してください - Autor が求めているものとは正確には異なりますが、この問題をググるとここにたどり着きます。

ドイツ語と英語のロケールのサーバーがあり、すべての通貨で次のようになります7.500,60

私の最終的な表現:

new java.text.DecimalFormat("#,##0.00", new java.text.DecimalFormatSymbols(java.util.Locale.GERMANY)).format($F{variable}) + " €"

そのため、ロケール設定は「ハードコード」されています-まさに私が必要としていたものです。

多分これは誰かを助けるでしょう

于 2016-12-02T18:33:07.703 に答える
3

上記のコードは、次の 3 つのケースで機能します。

  1. 小数点以下 2 つのゼロを修正します。この目的で「Double」データ型を使用しようとすると、うまくいきませんでした。しかし、このコードはそれを行うことができます。
  2. 文字列データ型の数値の前の $ -sign を修正し、"-" 記号も独自に処理します。
  3. 数字の 3 桁の後に "," を取得する

私にとっては、3桁ごとに(文字列をパラメーターとして渡すことにより)「、」コンマを入れたかったので、次のコードを試しました。それは私のために働いた....どうもありがとう。この答えに感謝します。

<textFieldExpression>

<![CDATA[new java.text.DecimalFormat("$ #,##0.00").format(Double.valueOf($P{actualWrittenPremium} != null && $P{actualWrittenPremium}.length() > 0 ? Double.valueOf($P{actualWrittenPremium}) : 0))]]>

</textFieldExpression>
于 2012-10-16T19:16:14.303 に答える