web-dev-qa-db-ja.com

ジャスパーレポートで文字列を通貨形式にフォーマットする

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

何百ものコンマで区切られ、数字の前にドル記号が付いているようにフォーマットしたい。

例えば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」の代わりに「unavailable」をレポートに印刷したいです。それ以外の場合、上記のように番号を適切にフォーマットする必要があります。

この問題を解決するには?

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

16
Vicky

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

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でプレビュー):

The result in *iReport*

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

patternプロパティtextFieldデータのフォーマット用。

標本、見本:

<?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>

結果は同じになります。

37
Alex K

上記のコードは、次の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>
3
Rushi

ちょうどこの問題に出くわして、私にとってうまく機能している解決策を見つけました。

気をつけてください-Autorが要求していることは正確ではありませんが、この問題をグーグルで検索すると、ここで終わることになります。

ドイツ語と英語のロケールのサーバーがあり、すべての通貨は7.500,60

私の最終的な表現:

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

ロケール設定は「ハードコーディング」されています-まさに必要なものです。

たぶんこれは誰かを助けるでしょう

1
Frankstar

私はiReport 5.6.0を使用しており、これらの回答のいくつかを取りましたが、それが私にとってうまくいったのは:

テキストフィールド(これをデザイナーに入力しました):

Float.valueOf($V{DISPONIBLE_FINAL})

([プロパティ]タブにある)パターンでは、カスタムフォーマットを次のように使用しました。

$#,##0.00

ここで言及したすべての文字列を「式の編集」フィールド全体に入れてもうまくいきませんでした。

それが役に立てば幸い。

PD:mvnrepositoryサイトでチェックされたジャスパー5.6.0と互換性のあるgroovy jarを使用していました。

1
Rodolfo Velasco

これは、iReport Studioを使用して行うこともできます。スタジオでフィールドをクリックして、プロパティペインを参照します。プロパティペインのテキストフィールドプロパティの下にパターンプロパティがあります。貼り付け#、## 0.または3つのドットをクリックし、ポップアップメニューのチェックボックスをオンにして1000で区切ります。

0

IReportで推奨される回答を試してみると、「ドル記号の後に違法な文字列ボディ文字」が表示されました。レポートを実行したとき。

次のようにドル記号をバックスラッシュでエスケープすることで簡単に修正できます。

new Java.text.DecimalFormat("\$ #,##0.00").format(Double.valueOf($F{le1_feeAmount}))
0
incircuitous