Подтвердить что ты не робот

Форматирование строки в формате валюты в отчете jasper

У меня есть строка с некоторым числовым значением.

Я хочу отформатировать его таким образом, чтобы сотни были разделены запятыми, и перед этим число знака доллара.

например. 12345 следует отформатировать до 12 345,00 долларов США.

Я попробовал код ниже без знака доллара:

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

и ниже со знаком доллара:

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

Однако оба дают ошибку.

Каков правильный способ достижения этого формата?

Это часть jarx отчета jasper, где я хочу избежать "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, но тогда оператор сравнения? = не работал.

Если значение валюты недоступно, я хочу напечатать "unavailable" в отчете, а не по умолчанию "null". Кроме того, я хочу, чтобы номер был правильно отформатирован, как описано выше.

Как решить эту проблему?

Спасибо за чтение.

4b9b3361

Ответ 1

Правильное выражение:

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*

Примечание: Вы также должны добавить check для null.

Вы также можете использовать свойство шаблон 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>

Результат будет таким же.

Ответ 2

Вышеприведенный код может работать в трех случаях:

  • исправить два нуля после десятичной точки. Когда я пытался использовать для этого "Двойной" тип данных, это не сработало для меня. Но этот код может это сделать.
  • Исправить $-знак перед номером в строковом типе данных, а также позаботиться о знаке "-" в своем собственном.
  • Получить "," после 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

Только что пришел к этой проблеме и нашел решение, которое отлично работает для меня.

Будьте внимательны - это не то, что просит автор, но если у вас возникнет эта проблема, вы здесь.

У меня есть серверы с немецким и английским языками, и на всех валютах должно быть как 7.500,60

Мое заключительное выражение:

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

поэтому параметр Locale "hardcoded" - именно то, что мне нужно.

Возможно, это поможет кому-то

Ответ 4

Im используя iReport 5.6.0, и я взял некоторые из этих ответов, но то, что для меня работало, было:

Текстовое поле (я положил это в конструктор):

Float.valueOf($V{DISPONIBLE_FINAL})

И в шаблоне (на вкладке свойств) я использовал Custom Format с:

$#,##0.00

Включение всей строки, указанной здесь во всем поле "Редактировать выражение", не сработало для меня.

Надеюсь, это поможет.

PD: Я использовал groovy jar, совместимый с jasper 5.6.0, зарегистрированным на сайте mvnrepository.

Ответ 5

При попытке использовать рекомендуемый ответ в iReport, я получил "незаконный символ строки после знака доллара"; когда я запустил отчет.

Легко исправляется путем выхода из знака доллара с помощью обратной косой черты:

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