2012-06-06 39 views
13

我有一個數字值的字符串。將字符串格式化爲碧玉報告中的貨幣格式

我想以數百個逗號分隔的方式進行格式化,數字之前有$美元符號。

例如12345的格式應爲$ 12,345.00

我嘗試下面的代碼,而美元符號:

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

和一個低於美元符號:

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

然而,無論是給錯誤。

什麼是實現這種格式的正確方法?

這是碧玉報告JRXML的一部分,我想避免「空」的報告,從而將下面的代碼:

<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」。否則,我希望數字按上述方式正確格式化。

如何解決此問題?

感謝您的閱讀。

回答

27

正確表達式爲:

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*

注: 你也應該爲空補充檢查。

您還可以使用模式格式化數據的屬性文本框

樣品:

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

其結果將是相同的。

+0

添加另一種解決方案 –

+0

感謝亞歷克斯,會嘗試一下! – Nik

+0

Double.valueOf給出錯誤「預計」...我發現這個 - 「你需要指定編譯類路徑,如果你使用jasper報告以外的庫」---但無法找到如何實現它! – Nik

3

上面的代碼可以三種情況下工作:

  1. 固定小數點後兩個零。當我嘗試使用「Double」數據類型來達到這個目的時,它不適合我。但是這個代碼可以做到這一點。
  2. 修復字符串數據類型中的數字之前的$ -sign,並且還自己處理「 - 」號。
  3. GET「」後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> 
0

進出口使用iReport的5.6.0和我花了一些這些問題的答案,但什麼它的工作對我來說是:

文本字段(我把這個變成設計師):

Float.valueOf($V{DISPONIBLE_FINAL}) 

並在Pattern(屬性選項卡)中,我使用自定義格式:

$#,##0.00 

將所有提到的字符串在這裏整個「編輯表達」字段沒有爲我工作。

希望它有幫助。

PD:我使用的是與jasper 5.6.0在mvnrepository站點中檢查兼容的groovy jar。

0

在iReport中嘗試推薦的答案時,我得到「美元符號後的非法字符串主體字符;」當我運行報告時。

輕鬆通過像這樣一個反斜槓美元符號補救:

new java.text.DecimalFormat("\$ #,##0.00").format(Double.valueOf($F{le1_feeAmount})) 
1

剛來到翻過這一問題,並發現這是爲我工作的罰款解決方案。

請注意 - 它不完全是作者要求的,但如果你谷歌這個問題,你最終會在這裏。

我有德語和英語語言環境,並在所有貨幣服務器應該像7.500,60

我最後的表達:

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

這樣的區域設置爲「硬編碼」 - 正是我需要的。

也許這將幫助別人

+0

如果國家區域設置定義沒有在那裏給出?如何使它無論如何?例如,印度尼西亞不在java.util.Locale內部列出。 @Frankstar – gumuruh