Skip to content

Commit 148d217

Browse files
author
otaviojava
committed
using MonetaryAmountFormat
1 parent 335aa03 commit 148d217

File tree

7 files changed

+209
-99
lines changed

7 files changed

+209
-99
lines changed

src/main/java/org/javamoney/moneta/FastMoney.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515
*/
1616
package org.javamoney.moneta;
1717

18+
import org.javamoney.moneta.ToStringMonetaryAmountFormat.ToStringMonetaryAmountFormatStyle;
1819
import org.javamoney.moneta.internal.FastMoneyAmountBuilder;
1920
import org.javamoney.moneta.spi.DefaultNumberValue;
2021
import org.javamoney.moneta.spi.MonetaryConfig;
2122
import org.javamoney.moneta.spi.MoneyUtils;
2223

2324
import javax.money.*;
25+
import javax.money.format.MonetaryAmountFormat;
26+
2427
import java.io.Serializable;
2528
import java.math.BigDecimal;
2629
import java.util.Objects;
@@ -703,16 +706,28 @@ public static FastMoney from(MonetaryAmount amount){
703706

704707
/**
705708
* Obtains an instance of FastMoney from a text string such as 'EUR 25.25'.
706-
* @param text
709+
* @param text the text to parse not null
707710
* @return FastMoney instance
708711
* @throws NullPointerException
709712
* @throws NumberFormatException
710713
* @throws UnknownCurrencyException
711714
*/
712715
public static FastMoney parse(CharSequence text) {
713-
return MonetaryAmountParser.parserFastMoney(text);
716+
return parse(text, DEFAULT_FORMATTER);
717+
}
718+
/**
719+
* Obtains an instance of FastMoney from a text using specific formatter.
720+
* @param text the text to parse not null
721+
* @param formatter the formatter to use not null
722+
* @return FastMoney instance
723+
*/
724+
public static FastMoney parse(CharSequence text, MonetaryAmountFormat formatter) {
725+
return from(formatter.parse(text));
714726
}
715727

728+
private static ToStringMonetaryAmountFormat DEFAULT_FORMATTER = ToStringMonetaryAmountFormat
729+
.of(ToStringMonetaryAmountFormatStyle.FAST_MONEY);
730+
716731
private BigDecimal getBigDecimal(){
717732
return BigDecimal.valueOf(this.number).movePointLeft(SCALE);
718733
}

src/main/java/org/javamoney/moneta/MonetaryAmountParser.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/main/java/org/javamoney/moneta/Money.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,29 @@
1515
*/
1616
package org.javamoney.moneta;
1717

18-
import org.javamoney.moneta.internal.MoneyAmountBuilder;
19-
import org.javamoney.moneta.spi.MoneyUtils;
20-
import org.javamoney.moneta.spi.DefaultNumberValue;
21-
22-
import javax.money.*;
23-
24-
import java.io.*;
18+
import java.io.Serializable;
2519
import java.math.BigDecimal;
2620
import java.math.MathContext;
2721
import java.math.RoundingMode;
2822
import java.util.Objects;
2923

24+
import javax.money.CurrencyUnit;
25+
import javax.money.MonetaryAmount;
26+
import javax.money.MonetaryAmountFactory;
27+
import javax.money.MonetaryContext;
28+
import javax.money.MonetaryCurrencies;
29+
import javax.money.MonetaryException;
30+
import javax.money.MonetaryOperator;
31+
import javax.money.MonetaryQuery;
32+
import javax.money.NumberValue;
33+
import javax.money.UnknownCurrencyException;
34+
import javax.money.format.MonetaryAmountFormat;
35+
36+
import org.javamoney.moneta.ToStringMonetaryAmountFormat.ToStringMonetaryAmountFormatStyle;
37+
import org.javamoney.moneta.internal.MoneyAmountBuilder;
38+
import org.javamoney.moneta.spi.DefaultNumberValue;
39+
import org.javamoney.moneta.spi.MoneyUtils;
40+
3041
/**
3142
* Default immutable implementation of {@link MonetaryAmount} based
3243
* on {@link BigDecimal} as numeric representation.
@@ -793,6 +804,19 @@ public static Money from(MonetaryAmount amt){
793804
* @throws UnknownCurrencyException
794805
*/
795806
public static Money parse(CharSequence text) {
796-
return MonetaryAmountParser.parserMoney(text);
807+
return parse(text, DEFAULT_FORMATTER);
797808
}
809+
810+
/**
811+
* Obtains an instance of Money from a text using specific formatter.
812+
* @param text the text to parse not null
813+
* @param formatter the formatter to use not null
814+
* @return Money instance
815+
*/
816+
public static Money parse(CharSequence text, MonetaryAmountFormat formatter) {
817+
return from(formatter.parse(text));
818+
}
819+
820+
private static ToStringMonetaryAmountFormat DEFAULT_FORMATTER = ToStringMonetaryAmountFormat
821+
.of(ToStringMonetaryAmountFormatStyle.MONEY);
798822
}

src/main/java/org/javamoney/moneta/RoundedMoney.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
*/
1616
package org.javamoney.moneta;
1717

18+
import org.javamoney.moneta.ToStringMonetaryAmountFormat.ToStringMonetaryAmountFormatStyle;
1819
import org.javamoney.moneta.internal.RoundedMoneyAmountBuilder;
1920
import org.javamoney.moneta.spi.DefaultNumberValue;
2021
import org.javamoney.moneta.spi.MoneyUtils;
2122

2223
import javax.money.*;
24+
import javax.money.format.MonetaryAmountFormat;
2325

2426
import java.io.Serializable;
2527
import java.math.BigDecimal;
@@ -648,8 +650,20 @@ public static RoundedMoney from(MonetaryAmount amt){
648650
* @throws UnknownCurrencyException
649651
*/
650652
public static RoundedMoney parse(CharSequence text) {
651-
return MonetaryAmountParser.parserRoundedMoney(text);
653+
return parse(text, DEFAULT_FORMATTER);
652654
}
655+
/**
656+
* Obtains an instance of FastMoney from a text using specific formatter.
657+
* @param text the text to parse not null
658+
* @param formatter the formatter to use not null
659+
* @return RoundedMoney instance
660+
*/
661+
public static RoundedMoney parse(CharSequence text, MonetaryAmountFormat formatter) {
662+
return from(formatter.parse(text));
663+
}
664+
665+
private static ToStringMonetaryAmountFormat DEFAULT_FORMATTER = ToStringMonetaryAmountFormat
666+
.of(ToStringMonetaryAmountFormatStyle.ROUNDED_MONEY);
653667
/*
654668
* }(non-Javadoc)
655669
* @see javax.money.MonetaryAmount#adjust(javax.money.AmountAdjuster)
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package org.javamoney.moneta;
2+
3+
import java.io.IOException;
4+
import java.math.BigDecimal;
5+
import java.util.Objects;
6+
import java.util.Optional;
7+
8+
import javax.money.CurrencyUnit;
9+
import javax.money.MonetaryAmount;
10+
import javax.money.MonetaryCurrencies;
11+
import javax.money.format.AmountFormatContext;
12+
import javax.money.format.MonetaryAmountFormat;
13+
import javax.money.format.MonetaryParseException;
14+
15+
/**
16+
* class to format and parse a text string such as 'EUR 25.25' or vice versa.
17+
* @author otaviojava
18+
*/
19+
class ToStringMonetaryAmountFormat implements MonetaryAmountFormat {
20+
21+
private ToStringMonetaryAmountFormatStyle style;
22+
23+
private ToStringMonetaryAmountFormat(ToStringMonetaryAmountFormatStyle style) {
24+
this.style = Objects.requireNonNull(style);
25+
}
26+
27+
public static ToStringMonetaryAmountFormat of(
28+
ToStringMonetaryAmountFormatStyle style) {
29+
return new ToStringMonetaryAmountFormat(style);
30+
}
31+
32+
@Override
33+
public String queryFrom(MonetaryAmount amount) {
34+
if (Objects.isNull(amount)) {
35+
return null;
36+
}
37+
return amount.toString();
38+
}
39+
40+
@Override
41+
public AmountFormatContext getAmountFormatContext() {
42+
throw new UnsupportedOperationException(
43+
"ToStringMonetaryAmountFormat does not the method suport getAmountFormatContext()");
44+
}
45+
46+
@Override
47+
public void print(Appendable appendable, MonetaryAmount amount)
48+
throws IOException {
49+
appendable.append(Optional.ofNullable(amount)
50+
.map(MonetaryAmount::toString).orElse("null"));
51+
52+
}
53+
54+
@Override
55+
public MonetaryAmount parse(CharSequence text)
56+
throws MonetaryParseException {
57+
ParserMonetaryAmount amount = parserMonetaryAmount(text);
58+
return style.to(amount);
59+
}
60+
61+
private ParserMonetaryAmount parserMonetaryAmount(CharSequence text) {
62+
String[] array = Objects.requireNonNull(text).toString().split(" ");
63+
CurrencyUnit currencyUnit = MonetaryCurrencies.getCurrency(array[0]);
64+
BigDecimal number = new BigDecimal(array[1]);
65+
return new ParserMonetaryAmount(currencyUnit, number);
66+
}
67+
private class ParserMonetaryAmount {
68+
public ParserMonetaryAmount(CurrencyUnit currencyUnit, BigDecimal number) {
69+
this.currencyUnit = currencyUnit;
70+
this.number = number;
71+
}
72+
73+
private CurrencyUnit currencyUnit;
74+
private BigDecimal number;
75+
}
76+
77+
/**
78+
* indicates with implementation will used to format or parser in
79+
* ToStringMonetaryAmountFormat
80+
*/
81+
enum ToStringMonetaryAmountFormatStyle {
82+
MONEY {
83+
@Override
84+
MonetaryAmount to(ParserMonetaryAmount amount) {
85+
return Money.of(amount.number, amount.currencyUnit);
86+
}
87+
},
88+
FAST_MONEY {
89+
@Override
90+
MonetaryAmount to(ParserMonetaryAmount amount) {
91+
return FastMoney.of(amount.number, amount.currencyUnit);
92+
}
93+
},
94+
ROUNDED_MONEY {
95+
@Override
96+
MonetaryAmount to(ParserMonetaryAmount amount) {
97+
return RoundedMoney.of(amount.number, amount.currencyUnit);
98+
}
99+
};
100+
abstract MonetaryAmount to(ParserMonetaryAmount amount);
101+
}
102+
103+
}

0 commit comments

Comments
 (0)