Вопрос по formatting, jasper-reports, java, string – форматирование строки в формате валюты в отчете яшмы
У меня есть строка с некоторым числовым значением.
Я хочу отформатировать его так, чтобы сотни были разделены запятыми, а перед номером был знак доллара.
например 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". Иначе, я хочу, чтобы номер был правильно отформатирован, как описано выше.
Как решить эту проблему?
Спасибо за прочтение.
Просто натолкнулся на эту проблему и нашел решение, которое работает нормально для меня.
Будьте в курсе - это не совсем то, о чем просит Автор, но если вы решите эту проблему, вы окажетесь здесь.
У меня есть серверы с немецким и английским языком и на всей валюте должно быть как7.500,60
Мое последнее выражение:
new java.text.DecimalFormat("#,##0.00", new java.text.DecimalFormatSymbols(java.util.Locale.GERMANY)).format($F{variable}) + " €"
таким образом, настройка локали является «жестко закодированной» - именно то, что мне было нужно.
Может быть, это кому-то поможет
Правильное выражение:
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):
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>
Результат будет таким же.
Я использую iReport 5.6.0, и я взял некоторые из этих ответов, но для меня это сработало:
Текстовое поле (я вставил это в конструктор):
Float.valueOf($V{DISPONIBLE_FINAL})
А в шаблоне (на вкладке свойств) я использовал пользовательский формат с:
$#,##0.00
Поместить всю упомянутую здесь строку в целое & quot; Изменить выражение & quot; поле не работает для меня.
Надеюсь, поможет.
PD: Я использовал groovy jar, который совместим с jasper 5.6.0, проверенным на сайте mvnrepository.
Приведенный выше код может работать в трех случаях:
- 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.
- Fix $ -sign before the number in string datatype and also takes care of "-" sign in its own.
- 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>