Class Money
- java.lang.Object
-
- de.hybris.order.calculation.money.AbstractAmount
-
- de.hybris.order.calculation.money.Money
-
public class Money extends AbstractAmount
Represents a monetary amount by combining aBigDecimal
and aCurrency
. Please know that the scale of the amount is always equal to the amount of currency digits.Therefore the following rules apply:used values result BigDecimal Currency.getDigits() Money.getAmount() as BigDecimal new BigDecimal(1.000) 0 1 new BigDecimal(1.000) 3 1.000 BigDecimal.ZERO 2 0.00 BigDecimal.valueOf(-1.34) 3 -1.340 BigDecimal.valueOf(1.234) 1 1.2 since we simply cut off the extra digits add(Money)
,subtract(Money)
andsplit(List)
. A Money in the smallest amount (example 0.01 EUR) can not be split in smaller amounts. Splitting this amount in two will return {0.01 EUR, 0.00 EUR}. Last but not least there are a number of tool methods to ease working with this class:zero(Currency)
,valueOf(Currency, String...)
,sum(Collection)
,sortAscending(List)
andgetPercentages(Money...)
to name a few.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
Money.MoneyExtractor<T>
-
Constructor Summary
Constructors Constructor Description Money(long amountInSmallestPieces, Currency currency)
Creates a new money from a given amount of smallest pieces and a currency.Money(Currency currency)
Creates zero money of the given Currency.Money(java.lang.String amount, Currency currency)
Creates a new money from String and currency.Money(java.math.BigDecimal amount, Currency currency)
Creates a Money object.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description Money
add(Money money)
void
assertCurreniesAreEqual(Currency curr)
Checks if the current Currency is equal to given one.void
assertCurreniesAreEqual(Money other)
Checks if the current Currency is equal to given one.protected java.math.BigDecimal
checkPercentages(java.util.List<Percentage> percentages)
boolean
equals(java.lang.Object obj)
Returns true if the given parameter is also an instanceof money and the current currency is equal to the currency of the given money and the current amount is comparedTo == 0 to the given money amount.java.math.BigDecimal
getAmount()
The monetary amount.Currency
getCurrency()
Returns the currency of this money.static java.util.List<Percentage>
getPercentages(int scale, Money... moneys)
Calculates a list ofPercentage
objects reflecting the distribution of money within the given money list.static java.util.List<Percentage>
getPercentages(Money... moneys)
Calculates a list ofPercentage
objects reflecting the distribution of money within the given money list.static java.util.List<Percentage>
getPercentages(java.util.List<Money> moneys, int scale)
Calculates a list ofPercentage
objects reflecting the distribution of money within the given money list.protected static int[]
getSortedPositionTable(java.util.List<Money> moneyList)
int
hashCode()
static void
sortAscending(java.util.List<Money> elements)
protected static <T> java.util.List<T>
sortByMoney(java.util.Map<T,Money> moneyMap, java.util.Comparator<java.util.Map.Entry<?,Money>> comp)
static <T> java.util.List<T>
sortByMoneyAscending(java.util.Map<T,Money> moneyMap)
static <T> java.util.List<T>
sortByMoneyDescending(java.util.Map<T,Money> moneyMap)
static void
sortDescending(java.util.List<Money> elements)
java.util.List<Money>
split(Percentage... percentages)
Same assplit(List)
but because of the variable parameter list the sum must not be exactly 100%.java.util.List<Money>
split(java.util.List<Percentage> percentages)
Splits the current Money into a list of new Money objects, based on the given list ofPercentage
objects.Money
subtract(Money money)
static Money
sum(Money... money)
static Money
sum(java.util.Collection<Money> elements)
static <T> Money
sum(java.util.Collection<T> elements, Money.MoneyExtractor<T> extractor)
protected static long
sumUnscaled(java.util.Collection<Money> elements)
protected static <T> Money
sumUnscaled(java.util.Collection<T> elements, Money.MoneyExtractor<T> extractor)
java.lang.String
toString()
Returns the amount of the value formatted with theCurrency.getDigits()
and the currency isocode.static java.util.List<Money>
valueOf(Currency curr, long... amounts)
Creates a list of money objects for a specific currency and any number of long values.static java.util.List<Money>
valueOf(Currency curr, java.lang.String... amounts)
Creates a list of money objects for a specific currency and any number of String values.static java.util.List<Money>
valueOf(Currency curr, java.math.BigDecimal... amounts)
Creates a list of money objects for a specific currency and any number of BigDecimal values.static Money
zero(Currency curr)
Shortcut to obtain commonly used zero money instances.
-
-
-
Constructor Detail
-
Money
public Money(java.math.BigDecimal amount, Currency currency)
Creates a Money object. A new BigDecimal object is used internally, based onCurrency.getDigits()
.amount
andthis.getAmount()
are maybe not equal (because of the different scale of the BigDecimal) BUTnew Money(BigDecimal.ONE, curr)
andnew Money(new BigDecimal("1.000"), curr)
are equal with each other!- Parameters:
amount
- the value or amount of the moneycurrency
- the amount of the money in the hybrisCurrency
pojo- Throws:
java.lang.ArithmeticException
- if the amount must be rounded because theCurrency.getDigits()
does not provide enough digits.
-
Money
public Money(Currency currency)
Creates zero money of the given Currency.- Parameters:
currency
-
-
Money
public Money(long amountInSmallestPieces, Currency currency)
Creates a new money from a given amount of smallest pieces and a currency.
-
Money
public Money(java.lang.String amount, Currency currency)
Creates a new money from String and currency.
-
-
Method Detail
-
valueOf
public static java.util.List<Money> valueOf(Currency curr, java.lang.String... amounts)
Creates a list of money objects for a specific currency and any number of String values.
-
valueOf
public static java.util.List<Money> valueOf(Currency curr, long... amounts)
Creates a list of money objects for a specific currency and any number of long values.
-
valueOf
public static java.util.List<Money> valueOf(Currency curr, java.math.BigDecimal... amounts)
Creates a list of money objects for a specific currency and any number of BigDecimal values.
-
zero
public static Money zero(Currency curr)
Shortcut to obtain commonly used zero money instances. Since they are cached this methods should be preferred toMoney(Currency)
.
-
getCurrency
public Currency getCurrency()
Returns the currency of this money.
-
getAmount
public java.math.BigDecimal getAmount()
The monetary amount. The amount scale is equal to the currency digits!
-
assertCurreniesAreEqual
public void assertCurreniesAreEqual(Currency curr)
Checks if the current Currency is equal to given one.- Throws:
CurrenciesAreNotEqualException
- if the currencies are not equal.
-
assertCurreniesAreEqual
public void assertCurreniesAreEqual(Money other)
Checks if the current Currency is equal to given one.- Throws:
CurrenciesAreNotEqualException
- if the currencies are not equal.
-
add
public Money add(Money money)
Add to the currentMoney
amount the givenMoney
amount. The result is a new Money object with the sum of both amounts and in the same currency.- Parameters:
money
- this will be added to the current money amount- Returns:
- a new object with the sum
- Throws:
CurrenciesAreNotEqualException
- ifgetCurrency()
is different in the given objects
-
subtract
public Money subtract(Money money)
Subtracts from currentMoney
amount the givenMoney
amount. The result is a new Money object with the difference of both amounts and in the same currency.- Parameters:
money
- this will be subtracted to the current money amount- Returns:
- a new object with the difference
- Throws:
CurrenciesAreNotEqualException
- ifgetCurrency()
is different in the given objects
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
- Returns:
- currency.hashCode + amount.hashCode
-
equals
public boolean equals(java.lang.Object obj)
Returns true if the given parameter is also an instanceof money and the current currency is equal to the currency of the given money and the current amount is comparedTo == 0 to the given money amount. (this is not BigDecimal.equals(BigDecimal), the check is BigDecimal.compareTo(BigDecimal))- Overrides:
equals
in classjava.lang.Object
-
toString
public java.lang.String toString()
Returns the amount of the value formatted with theCurrency.getDigits()
and the currency isocode. Example: "1.20 EUR"- Overrides:
toString
in classAbstractAmount
- Returns:
- {0.xx} {currency.toString};
xx.lenght == currency.digits
-
split
public java.util.List<Money> split(Percentage... percentages)
Same assplit(List)
but because of the variable parameter list the sum must not be exactly 100%. If less the missingPercentage
value will be added. This means, the size of the resulting list is equal to the given percentage list if the sum of them is exactly 100% or the size of the resulting list is one more if the given percentage list is less than 100%. Anyway aCalculationException
is thrown if the sum is greater than 100%.- Parameters:
percentages
- the variable list of percentages- Returns:
- a
List
ofMoney
objects which are summed up the same amount of this current Money object.
-
split
public java.util.List<Money> split(java.util.List<Percentage> percentages)
Splits the current Money into a list of new Money objects, based on the given list ofPercentage
objects. The sum of the Percentages must be equal to 100% or aCalculationException
is thrown. The size of the returned money list is equal to the size of the given percentage list. The sum of the returned money list is equal to the given amount of money. A money can only be split into the smallest possible amount of this money which depends on the currency. If a small amount of money can not be split anymore this amount is added to the last entry in the returned list. Example: splitting 0.01 EURO into half results in [0.00EUR , 0.01EUR]- Parameters:
percentages
- the list ofPercentage
in which the current money should be split into.- Returns:
- a
List
ofMoney
objects which are summed up the same amount of this current Money object. - Throws:
AmountException
- if the sum of the percentages is not 100%java.lang.IllegalArgumentException
- if the percent list is null or empty
-
checkPercentages
protected java.math.BigDecimal checkPercentages(java.util.List<Percentage> percentages)
-
sortByMoneyAscending
public static <T> java.util.List<T> sortByMoneyAscending(java.util.Map<T,Money> moneyMap)
-
sortByMoney
protected static <T> java.util.List<T> sortByMoney(java.util.Map<T,Money> moneyMap, java.util.Comparator<java.util.Map.Entry<?,Money>> comp)
-
sortByMoneyDescending
public static <T> java.util.List<T> sortByMoneyDescending(java.util.Map<T,Money> moneyMap)
-
sortAscending
public static void sortAscending(java.util.List<Money> elements)
-
sortDescending
public static void sortDescending(java.util.List<Money> elements)
-
sum
public static final <T> Money sum(java.util.Collection<T> elements, Money.MoneyExtractor<T> extractor)
-
sumUnscaled
protected static final <T> Money sumUnscaled(java.util.Collection<T> elements, Money.MoneyExtractor<T> extractor)
-
sumUnscaled
protected static final long sumUnscaled(java.util.Collection<Money> elements)
-
getPercentages
public static java.util.List<Percentage> getPercentages(Money... moneys)
Calculates a list ofPercentage
objects reflecting the distribution of money within the given money list. Please note that the scale of these percentages is zero.- See Also:
getPercentages(int, Money...)
-
getPercentages
public static java.util.List<Percentage> getPercentages(int scale, Money... moneys)
Calculates a list ofPercentage
objects reflecting the distribution of money within the given money list. The specified scale is defining the precision of these percentages.- See Also:
getPercentages(Money...)
-
getPercentages
public static java.util.List<Percentage> getPercentages(java.util.List<Money> moneys, int scale)
Calculates a list ofPercentage
objects reflecting the distribution of money within the given money list. The specified scale is defining the precision of these percentages.- See Also:
getPercentages(Money...)
-
getSortedPositionTable
protected static int[] getSortedPositionTable(java.util.List<Money> moneyList)
-
-