Вопрос по formatting, jasper-reports, java, string – форматирование строки в формате валюты в отчете яшмы

15

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

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

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

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

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

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

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

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

Как правильно достичь этого формата?

Это часть отчета jasper jrxml, где я хочу избежать & quot; null & quot; в отчете и, следовательно, вставив следующий код:

<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, но тогда оператор сравнения? = Не работал.

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

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

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

Ваш Ответ

6   ответов
0

В студии нажмите на поле и увидите панель свойств. В панели свойств подText Field Properties вы найдетеPattern имущество. Вставить#,##0.00 или нажмите на три точки и установите флажок во всплывающем меню, чтобы разделить их на 1000.

0

оку & # xA0; тело & # xA0; символ & # xA0; после & # xA0; доллара & # xA0; знак; & quot; когда я запустил отчет.

Легко исправляется путем экранирования знака доллара с обратной косой чертой, например:

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}) + " €"

таким образом, настройка локали является «жестко закодированной» - именно то, что мне было нужно.

Может быть, это кому-то поможет

если там не дано определение локали страны? Как это сделать? Например, Индонезия не указана в java.util.Locale. @Frankstar
33

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

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*

Note: Вы также должны добавить проверку на ноль.

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

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

Спасибо Алекс, попробую! Vicky
добавить другое решение
Какой инструмент вы используете для тестирования отчета (iReport или что-то еще)? Вы установили язык для отчета какJava?
Double.valueOf выдает ошибку & lt; идентификатор & gt; ожидаемый "... Я нашел это -" вам нужно указать путь к классу компиляции, если вы используете библиотеки, внешние по отношению к отчетам Jasper & quot; --- но не смог узнать как этого добиться! Vicky
Алекс, вы должны предложить использовать шаблон, чтобы иметь правильный результат в xls экспорта (как число), инвертировать методы ??
0

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

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

Float.valueOf($V{DISPONIBLE_FINAL})

А в шаблоне (на вкладке свойств) я использовал пользовательский формат с:

$#,##0.00

Поместить всю упомянутую здесь строку в целое & quot; Изменить выражение & quot; поле не работает для меня.

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

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

3

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

  1. fix two zeros after decimal point. When I tried to use "Double" datatype for this purpose it did not work for me. But this code can do it.
  2. Fix $ -sign before the number in string datatype and also takes care of "-" sign in its own.
  3. Get "," after 3 digits in a number

Для меня я хотел поставить & quot;, & quot; запятая после каждых трех цифр (путем передачи строки в качестве параметра), и я попробовал следующий код. Это сработало для меня .... Большое спасибо. Я ценю этот ответ.

<textFieldExpression>

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

</textFieldExpression>

Похожие вопросы