Compatibility with JSR-354 final (and its new Monetary singleton)
Includes support for currency detection with @NumberFormat. Issue: SPR-12209
This commit is contained in:
parent
b4095c3e1d
commit
de893ada2b
|
|
@ -36,7 +36,7 @@ configure(allprojects) { project ->
|
||||||
ext.groovyVersion = "2.4.3"
|
ext.groovyVersion = "2.4.3"
|
||||||
ext.gsonVersion = "2.3.1"
|
ext.gsonVersion = "2.3.1"
|
||||||
ext.hibernate3Version = "3.6.10.Final"
|
ext.hibernate3Version = "3.6.10.Final"
|
||||||
ext.hibernate4Version = "4.3.9.Final"
|
ext.hibernate4Version = "4.3.10.Final"
|
||||||
ext.hibval4Version = "4.3.2.Final"
|
ext.hibval4Version = "4.3.2.Final"
|
||||||
ext.hibval5Version = "5.2.0.Beta1" // to be upgraded to 5.2 final in time for Spring Framework 4.2 GA
|
ext.hibval5Version = "5.2.0.Beta1" // to be upgraded to 5.2 final in time for Spring Framework 4.2 GA
|
||||||
ext.hsqldbVersion = "2.3.2"
|
ext.hsqldbVersion = "2.3.2"
|
||||||
|
|
@ -462,7 +462,7 @@ project("spring-context") {
|
||||||
optional("javax.inject:javax.inject:1")
|
optional("javax.inject:javax.inject:1")
|
||||||
optional("javax.ejb:ejb-api:3.0")
|
optional("javax.ejb:ejb-api:3.0")
|
||||||
optional("javax.enterprise.concurrent:javax.enterprise.concurrent-api:1.0")
|
optional("javax.enterprise.concurrent:javax.enterprise.concurrent-api:1.0")
|
||||||
optional("javax.money:money-api:1.0-RC3")
|
optional("javax.money:money-api:1.0")
|
||||||
optional("org.eclipse.persistence:javax.persistence:2.0.0")
|
optional("org.eclipse.persistence:javax.persistence:2.0.0")
|
||||||
optional("javax.validation:validation-api:1.0.0.GA")
|
optional("javax.validation:validation-api:1.0.0.GA")
|
||||||
optional("org.hibernate:hibernate-validator:${hibval4Version}")
|
optional("org.hibernate:hibernate-validator:${hibval4Version}")
|
||||||
|
|
@ -472,7 +472,7 @@ project("spring-context") {
|
||||||
optional("org.beanshell:bsh:2.0b4")
|
optional("org.beanshell:bsh:2.0b4")
|
||||||
optional("org.jruby:jruby:${jrubyVersion}")
|
optional("org.jruby:jruby:${jrubyVersion}")
|
||||||
testCompile("javax.inject:javax.inject-tck:1")
|
testCompile("javax.inject:javax.inject-tck:1")
|
||||||
testCompile("org.javamoney:moneta:1.0-RC3")
|
testCompile("org.javamoney:moneta:1.0")
|
||||||
testCompile("commons-dbcp:commons-dbcp:1.4")
|
testCompile("commons-dbcp:commons-dbcp:1.4")
|
||||||
testCompile("org.apache.commons:commons-pool2:2.2")
|
testCompile("org.apache.commons:commons-pool2:2.2")
|
||||||
testCompile("org.slf4j:slf4j-api:${slf4jVersion}")
|
testCompile("org.slf4j:slf4j-api:${slf4jVersion}")
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ package org.springframework.format.number.money;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import javax.money.CurrencyUnit;
|
import javax.money.CurrencyUnit;
|
||||||
import javax.money.MonetaryCurrencies;
|
import javax.money.Monetary;
|
||||||
|
|
||||||
import org.springframework.format.Formatter;
|
import org.springframework.format.Formatter;
|
||||||
|
|
||||||
|
|
@ -38,7 +38,7 @@ public class CurrencyUnitFormatter implements Formatter<CurrencyUnit> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CurrencyUnit parse(String text, Locale locale) {
|
public CurrencyUnit parse(String text, Locale locale) {
|
||||||
return MonetaryCurrencies.getCurrency(text);
|
return Monetary.getCurrency(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,8 @@ import java.util.Currency;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.money.CurrencyUnit;
|
import javax.money.CurrencyUnit;
|
||||||
|
import javax.money.Monetary;
|
||||||
import javax.money.MonetaryAmount;
|
import javax.money.MonetaryAmount;
|
||||||
import javax.money.MonetaryAmounts;
|
|
||||||
import javax.money.MonetaryCurrencies;
|
|
||||||
|
|
||||||
import org.springframework.context.support.EmbeddedValueResolutionSupport;
|
import org.springframework.context.support.EmbeddedValueResolutionSupport;
|
||||||
import org.springframework.format.AnnotationFormatterFactory;
|
import org.springframework.format.AnnotationFormatterFactory;
|
||||||
|
|
@ -49,6 +48,9 @@ import org.springframework.util.StringUtils;
|
||||||
public class Jsr354NumberFormatAnnotationFormatterFactory extends EmbeddedValueResolutionSupport
|
public class Jsr354NumberFormatAnnotationFormatterFactory extends EmbeddedValueResolutionSupport
|
||||||
implements AnnotationFormatterFactory<NumberFormat> {
|
implements AnnotationFormatterFactory<NumberFormat> {
|
||||||
|
|
||||||
|
private static final String CURRENCY_CODE_PATTERN = "\u00A4\u00A4";
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public Set<Class<?>> getFieldTypes() {
|
public Set<Class<?>> getFieldTypes() {
|
||||||
|
|
@ -68,18 +70,18 @@ public class Jsr354NumberFormatAnnotationFormatterFactory extends EmbeddedValueR
|
||||||
|
|
||||||
private Formatter<MonetaryAmount> configureFormatterFrom(NumberFormat annotation) {
|
private Formatter<MonetaryAmount> configureFormatterFrom(NumberFormat annotation) {
|
||||||
if (StringUtils.hasLength(annotation.pattern())) {
|
if (StringUtils.hasLength(annotation.pattern())) {
|
||||||
return new NumberDecoratingFormatter(null, resolveEmbeddedValue(annotation.pattern()));
|
return new PatternDecoratingFormatter(resolveEmbeddedValue(annotation.pattern()));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Style style = annotation.style();
|
Style style = annotation.style();
|
||||||
if (style == Style.PERCENT) {
|
if (style == Style.NUMBER) {
|
||||||
return new NumberDecoratingFormatter(new PercentStyleFormatter(), null);
|
return new NumberDecoratingFormatter(new NumberStyleFormatter());
|
||||||
}
|
}
|
||||||
else if (style == Style.NUMBER) {
|
else if (style == Style.PERCENT) {
|
||||||
return new NumberDecoratingFormatter(new NumberStyleFormatter(), null);
|
return new NumberDecoratingFormatter(new PercentStyleFormatter());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return new NumberDecoratingFormatter(null, null);
|
return new NumberDecoratingFormatter(new CurrencyStyleFormatter());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -89,38 +91,72 @@ public class Jsr354NumberFormatAnnotationFormatterFactory extends EmbeddedValueR
|
||||||
|
|
||||||
private final Formatter<Number> numberFormatter;
|
private final Formatter<Number> numberFormatter;
|
||||||
|
|
||||||
|
public NumberDecoratingFormatter(Formatter<Number> numberFormatter) {
|
||||||
|
this.numberFormatter = numberFormatter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String print(MonetaryAmount object, Locale locale) {
|
||||||
|
return this.numberFormatter.print(object.getNumber(), locale);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MonetaryAmount parse(String text, Locale locale) throws ParseException {
|
||||||
|
CurrencyUnit currencyUnit = Monetary.getCurrency(locale);
|
||||||
|
Number numberValue = this.numberFormatter.parse(text, locale);
|
||||||
|
return Monetary.getDefaultAmountFactory().setNumber(numberValue).setCurrency(currencyUnit).create();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static class PatternDecoratingFormatter implements Formatter<MonetaryAmount> {
|
||||||
|
|
||||||
private final String pattern;
|
private final String pattern;
|
||||||
|
|
||||||
public NumberDecoratingFormatter(Formatter<Number> numberFormatter, String pattern) {
|
public PatternDecoratingFormatter(String pattern) {
|
||||||
this.numberFormatter = numberFormatter;
|
|
||||||
this.pattern = pattern;
|
this.pattern = pattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String print(MonetaryAmount object, Locale locale) {
|
public String print(MonetaryAmount object, Locale locale) {
|
||||||
Formatter<Number> formatterToUse = this.numberFormatter;
|
CurrencyStyleFormatter formatter = new CurrencyStyleFormatter();
|
||||||
if (formatterToUse == null) {
|
formatter.setCurrency(Currency.getInstance(object.getCurrency().getCurrencyCode()));
|
||||||
CurrencyStyleFormatter formatter = new CurrencyStyleFormatter();
|
formatter.setPattern(this.pattern);
|
||||||
formatter.setCurrency(Currency.getInstance(object.getCurrency().getCurrencyCode()));
|
return formatter.print(object.getNumber(), locale);
|
||||||
formatter.setPattern(this.pattern);
|
|
||||||
formatterToUse = formatter;
|
|
||||||
}
|
|
||||||
return formatterToUse.print(object.getNumber(), locale);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MonetaryAmount parse(String text, Locale locale) throws ParseException {
|
public MonetaryAmount parse(String text, Locale locale) throws ParseException {
|
||||||
Currency currency = Currency.getInstance(locale);
|
CurrencyStyleFormatter formatter = new CurrencyStyleFormatter();
|
||||||
Formatter<Number> formatterToUse = this.numberFormatter;
|
Currency currency = determineCurrency(text, locale);
|
||||||
if (formatterToUse == null) {
|
CurrencyUnit currencyUnit = Monetary.getCurrency(currency.getCurrencyCode());
|
||||||
CurrencyStyleFormatter formatter = new CurrencyStyleFormatter();
|
formatter.setCurrency(currency);
|
||||||
formatter.setCurrency(currency);
|
formatter.setPattern(this.pattern);
|
||||||
formatter.setPattern(this.pattern);
|
Number numberValue = formatter.parse(text, locale);
|
||||||
formatterToUse = formatter;
|
return Monetary.getDefaultAmountFactory().setNumber(numberValue).setCurrency(currencyUnit).create();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Currency determineCurrency(String text, Locale locale) {
|
||||||
|
try {
|
||||||
|
if (text.length() < 3) {
|
||||||
|
// Could not possibly contain a currency code ->
|
||||||
|
// try with locale and likely let it fail on parse.
|
||||||
|
return Currency.getInstance(locale);
|
||||||
|
}
|
||||||
|
else if (this.pattern.startsWith(CURRENCY_CODE_PATTERN)) {
|
||||||
|
return Currency.getInstance(text.substring(0, 3));
|
||||||
|
}
|
||||||
|
else if (this.pattern.endsWith(CURRENCY_CODE_PATTERN)) {
|
||||||
|
return Currency.getInstance(text.substring(text.length() - 3));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// A pattern without a currency code...
|
||||||
|
return Currency.getInstance(locale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException ex) {
|
||||||
|
throw new IllegalArgumentException("Cannot determine currency for number value [" + text + "]", ex);
|
||||||
}
|
}
|
||||||
Number numberValue = formatterToUse.parse(text, locale);
|
|
||||||
CurrencyUnit currencyUnit = MonetaryCurrencies.getCurrency(currency.getCurrencyCode());
|
|
||||||
return MonetaryAmounts.getDefaultAmountFactory().setNumber(numberValue).setCurrency(currencyUnit).create();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,8 +55,10 @@ public class MoneyFormattingTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAmountAndUnit() {
|
public void testAmountAndUnit() {
|
||||||
DataBinder binder = new DataBinder(new MoneyHolder());
|
MoneyHolder bean = new MoneyHolder();
|
||||||
|
DataBinder binder = new DataBinder(bean);
|
||||||
binder.setConversionService(conversionService);
|
binder.setConversionService(conversionService);
|
||||||
|
|
||||||
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
||||||
propertyValues.add("amount", "USD 10.50");
|
propertyValues.add("amount", "USD 10.50");
|
||||||
propertyValues.add("unit", "USD");
|
propertyValues.add("unit", "USD");
|
||||||
|
|
@ -64,11 +66,23 @@ public class MoneyFormattingTests {
|
||||||
assertEquals(0, binder.getBindingResult().getErrorCount());
|
assertEquals(0, binder.getBindingResult().getErrorCount());
|
||||||
assertEquals("USD10.50", binder.getBindingResult().getFieldValue("amount"));
|
assertEquals("USD10.50", binder.getBindingResult().getFieldValue("amount"));
|
||||||
assertEquals("USD", binder.getBindingResult().getFieldValue("unit"));
|
assertEquals("USD", binder.getBindingResult().getFieldValue("unit"));
|
||||||
|
assertTrue(bean.getAmount().getNumber().doubleValue() == 10.5d);
|
||||||
|
assertEquals("USD", bean.getAmount().getCurrency().getCurrencyCode());
|
||||||
|
|
||||||
|
LocaleContextHolder.setLocale(Locale.CANADA);
|
||||||
|
binder.bind(propertyValues);
|
||||||
|
LocaleContextHolder.setLocale(Locale.US);
|
||||||
|
assertEquals(0, binder.getBindingResult().getErrorCount());
|
||||||
|
assertEquals("USD10.50", binder.getBindingResult().getFieldValue("amount"));
|
||||||
|
assertEquals("USD", binder.getBindingResult().getFieldValue("unit"));
|
||||||
|
assertTrue(bean.getAmount().getNumber().doubleValue() == 10.5d);
|
||||||
|
assertEquals("USD", bean.getAmount().getCurrency().getCurrencyCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAmountWithNumberFormat1() {
|
public void testAmountWithNumberFormat1() {
|
||||||
DataBinder binder = new DataBinder(new FormattedMoneyHolder1());
|
FormattedMoneyHolder1 bean = new FormattedMoneyHolder1();
|
||||||
|
DataBinder binder = new DataBinder(bean);
|
||||||
binder.setConversionService(conversionService);
|
binder.setConversionService(conversionService);
|
||||||
|
|
||||||
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
||||||
|
|
@ -76,19 +90,22 @@ public class MoneyFormattingTests {
|
||||||
binder.bind(propertyValues);
|
binder.bind(propertyValues);
|
||||||
assertEquals(0, binder.getBindingResult().getErrorCount());
|
assertEquals(0, binder.getBindingResult().getErrorCount());
|
||||||
assertEquals("$10.50", binder.getBindingResult().getFieldValue("amount"));
|
assertEquals("$10.50", binder.getBindingResult().getFieldValue("amount"));
|
||||||
|
assertTrue(bean.getAmount().getNumber().doubleValue() == 10.5d);
|
||||||
|
assertEquals("USD", bean.getAmount().getCurrency().getCurrencyCode());
|
||||||
|
|
||||||
/* TODO: preserve currency from given value
|
|
||||||
LocaleContextHolder.setLocale(Locale.CANADA);
|
LocaleContextHolder.setLocale(Locale.CANADA);
|
||||||
binder.bind(propertyValues);
|
binder.bind(propertyValues);
|
||||||
LocaleContextHolder.setLocale(Locale.US);
|
LocaleContextHolder.setLocale(Locale.US);
|
||||||
assertEquals(0, binder.getBindingResult().getErrorCount());
|
assertEquals(0, binder.getBindingResult().getErrorCount());
|
||||||
assertEquals("$10.50", binder.getBindingResult().getFieldValue("amount"));
|
assertEquals("$10.50", binder.getBindingResult().getFieldValue("amount"));
|
||||||
*/
|
assertTrue(bean.getAmount().getNumber().doubleValue() == 10.5d);
|
||||||
|
assertEquals("CAD", bean.getAmount().getCurrency().getCurrencyCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAmountWithNumberFormat2() {
|
public void testAmountWithNumberFormat2() {
|
||||||
DataBinder binder = new DataBinder(new FormattedMoneyHolder2());
|
FormattedMoneyHolder2 bean = new FormattedMoneyHolder2();
|
||||||
|
DataBinder binder = new DataBinder(bean);
|
||||||
binder.setConversionService(conversionService);
|
binder.setConversionService(conversionService);
|
||||||
|
|
||||||
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
||||||
|
|
@ -96,11 +113,14 @@ public class MoneyFormattingTests {
|
||||||
binder.bind(propertyValues);
|
binder.bind(propertyValues);
|
||||||
assertEquals(0, binder.getBindingResult().getErrorCount());
|
assertEquals(0, binder.getBindingResult().getErrorCount());
|
||||||
assertEquals("10.5", binder.getBindingResult().getFieldValue("amount"));
|
assertEquals("10.5", binder.getBindingResult().getFieldValue("amount"));
|
||||||
|
assertTrue(bean.getAmount().getNumber().doubleValue() == 10.5d);
|
||||||
|
assertEquals("USD", bean.getAmount().getCurrency().getCurrencyCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAmountWithNumberFormat3() {
|
public void testAmountWithNumberFormat3() {
|
||||||
DataBinder binder = new DataBinder(new FormattedMoneyHolder3());
|
FormattedMoneyHolder3 bean = new FormattedMoneyHolder3();
|
||||||
|
DataBinder binder = new DataBinder(bean);
|
||||||
binder.setConversionService(conversionService);
|
binder.setConversionService(conversionService);
|
||||||
|
|
||||||
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
||||||
|
|
@ -108,11 +128,14 @@ public class MoneyFormattingTests {
|
||||||
binder.bind(propertyValues);
|
binder.bind(propertyValues);
|
||||||
assertEquals(0, binder.getBindingResult().getErrorCount());
|
assertEquals(0, binder.getBindingResult().getErrorCount());
|
||||||
assertEquals("10%", binder.getBindingResult().getFieldValue("amount"));
|
assertEquals("10%", binder.getBindingResult().getFieldValue("amount"));
|
||||||
|
assertTrue(bean.getAmount().getNumber().doubleValue() == 0.1d);
|
||||||
|
assertEquals("USD", bean.getAmount().getCurrency().getCurrencyCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAmountWithNumberFormat4() {
|
public void testAmountWithNumberFormat4() {
|
||||||
DataBinder binder = new DataBinder(new FormattedMoneyHolder4());
|
FormattedMoneyHolder4 bean = new FormattedMoneyHolder4();
|
||||||
|
DataBinder binder = new DataBinder(bean);
|
||||||
binder.setConversionService(conversionService);
|
binder.setConversionService(conversionService);
|
||||||
|
|
||||||
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
||||||
|
|
@ -120,26 +143,31 @@ public class MoneyFormattingTests {
|
||||||
binder.bind(propertyValues);
|
binder.bind(propertyValues);
|
||||||
assertEquals(0, binder.getBindingResult().getErrorCount());
|
assertEquals(0, binder.getBindingResult().getErrorCount());
|
||||||
assertEquals("010.500", binder.getBindingResult().getFieldValue("amount"));
|
assertEquals("010.500", binder.getBindingResult().getFieldValue("amount"));
|
||||||
|
assertTrue(bean.getAmount().getNumber().doubleValue() == 10.5d);
|
||||||
|
assertEquals("USD", bean.getAmount().getCurrency().getCurrencyCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAmountWithNumberFormat5() {
|
public void testAmountWithNumberFormat5() {
|
||||||
DataBinder binder = new DataBinder(new FormattedMoneyHolder5());
|
FormattedMoneyHolder5 bean = new FormattedMoneyHolder5();
|
||||||
|
DataBinder binder = new DataBinder(bean);
|
||||||
binder.setConversionService(conversionService);
|
binder.setConversionService(conversionService);
|
||||||
|
|
||||||
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
MutablePropertyValues propertyValues = new MutablePropertyValues();
|
||||||
propertyValues.add("amount", "$ 10.50");
|
propertyValues.add("amount", "USD 10.50");
|
||||||
binder.bind(propertyValues);
|
binder.bind(propertyValues);
|
||||||
assertEquals(0, binder.getBindingResult().getErrorCount());
|
assertEquals(0, binder.getBindingResult().getErrorCount());
|
||||||
assertEquals("$ 010.500", binder.getBindingResult().getFieldValue("amount"));
|
assertEquals("USD 010.500", binder.getBindingResult().getFieldValue("amount"));
|
||||||
|
assertTrue(bean.getAmount().getNumber().doubleValue() == 10.5d);
|
||||||
|
assertEquals("USD", bean.getAmount().getCurrency().getCurrencyCode());
|
||||||
|
|
||||||
/* TODO: preserve currency from given value
|
|
||||||
LocaleContextHolder.setLocale(Locale.CANADA);
|
LocaleContextHolder.setLocale(Locale.CANADA);
|
||||||
binder.bind(propertyValues);
|
binder.bind(propertyValues);
|
||||||
LocaleContextHolder.setLocale(Locale.US);
|
LocaleContextHolder.setLocale(Locale.US);
|
||||||
assertEquals(0, binder.getBindingResult().getErrorCount());
|
assertEquals(0, binder.getBindingResult().getErrorCount());
|
||||||
assertEquals("$ 010.500", binder.getBindingResult().getFieldValue("amount"));
|
assertEquals("USD 010.500", binder.getBindingResult().getFieldValue("amount"));
|
||||||
*/
|
assertTrue(bean.getAmount().getNumber().doubleValue() == 10.5d);
|
||||||
|
assertEquals("USD", bean.getAmount().getCurrency().getCurrencyCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -229,7 +257,7 @@ public class MoneyFormattingTests {
|
||||||
|
|
||||||
public static class FormattedMoneyHolder5 {
|
public static class FormattedMoneyHolder5 {
|
||||||
|
|
||||||
@NumberFormat(pattern = "\u00A4 #000.000#")
|
@NumberFormat(pattern = "\u00A4\u00A4 #000.000#")
|
||||||
private MonetaryAmount amount;
|
private MonetaryAmount amount;
|
||||||
|
|
||||||
public MonetaryAmount getAmount() {
|
public MonetaryAmount getAmount() {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue