JAVA-19119 Move article Java Money and the Currency API to core-java-lang-math-3 module (#13602)
* JAVA-19119 Move article Java Money and the Currency API to core-java-lang-math-3 module
This commit is contained in:
@@ -10,4 +10,5 @@
|
||||
- [Create a BMI Calculator in Java](https://www.baeldung.com/java-body-mass-index-calculator)
|
||||
- [Java Program to Calculate the Standard Deviation](https://www.baeldung.com/java-calculate-standard-deviation)
|
||||
- [Java Program to Print Pascal’s Triangle](https://www.baeldung.com/java-pascal-triangle)
|
||||
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
|
||||
- More articles: [[<-- Prev]](/core-java-modules/core-java-lang-math-2)
|
||||
|
||||
@@ -23,11 +23,17 @@
|
||||
<artifactId>javaluator</artifactId>
|
||||
<version>${javaluator.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.javamoney</groupId>
|
||||
<artifactId>moneta</artifactId>
|
||||
<version>${javamoney.moneta.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<exp4j.version>0.4.8</exp4j.version>
|
||||
<javaluator.version>3.0.3</javaluator.version>
|
||||
<javamoney.moneta.version>1.1</javamoney.moneta.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,151 @@
|
||||
package com.baeldung.money;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.money.CurrencyUnit;
|
||||
import javax.money.Monetary;
|
||||
import javax.money.MonetaryAmount;
|
||||
import javax.money.UnknownCurrencyException;
|
||||
import javax.money.convert.ConversionQueryBuilder;
|
||||
import javax.money.convert.CurrencyConversion;
|
||||
import javax.money.convert.MonetaryConversions;
|
||||
import javax.money.format.AmountFormatQueryBuilder;
|
||||
import javax.money.format.MonetaryAmountFormat;
|
||||
import javax.money.format.MonetaryFormats;
|
||||
|
||||
import org.javamoney.moneta.FastMoney;
|
||||
import org.javamoney.moneta.Money;
|
||||
import org.javamoney.moneta.format.CurrencyStyle;
|
||||
|
||||
public class JavaMoney {
|
||||
final static Logger LOGGER = Logger.getLogger(JavaMoney.class.getName());
|
||||
CurrencyUnit USD;
|
||||
MonetaryAmount fstAmtUSD;
|
||||
MonetaryAmount fstAmtEUR;
|
||||
MonetaryAmount oneDolar;
|
||||
MonetaryAmount moneyof;
|
||||
MonetaryAmount fastmoneyof;
|
||||
MonetaryAmount roundEUR;
|
||||
MonetaryAmount calcAmtUSD;
|
||||
MonetaryAmount[] monetaryAmounts;
|
||||
MonetaryAmount sumAmtCHF;
|
||||
MonetaryAmount calcMoneyFastMoney;
|
||||
MonetaryAmount convertedAmountEURtoUSD;
|
||||
MonetaryAmount convertedAmountEURtoUSD2;
|
||||
MonetaryAmount convertedAmountUSDtoEUR;
|
||||
MonetaryAmount convertedAmountUSDtoEUR2;
|
||||
MonetaryAmount multiplyAmount;
|
||||
MonetaryAmount divideAmount;
|
||||
MonetaryAmount oneDivThree;
|
||||
CurrencyConversion convEUR;
|
||||
CurrencyConversion convUSD;
|
||||
CurrencyConversion conversionUSD;
|
||||
CurrencyConversion conversionEUR;
|
||||
MonetaryAmount oneEuro;
|
||||
MonetaryAmountFormat formatUSD;
|
||||
MonetaryAmountFormat customFormat;
|
||||
String usFormatted;
|
||||
String customFormatted;
|
||||
|
||||
public JavaMoney() {
|
||||
USD = Monetary.getCurrency("USD");
|
||||
fstAmtUSD = Monetary.getDefaultAmountFactory().setCurrency(USD).setNumber(200.50).create();
|
||||
fstAmtEUR = Monetary.getDefaultAmountFactory().setCurrency("EUR").setNumber(1.30473908).create();
|
||||
oneDolar = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(1).create();
|
||||
moneyof = Money.of(12, USD);
|
||||
fastmoneyof = FastMoney.of(2, USD);
|
||||
|
||||
LOGGER.info("First Amount in USD : " + fstAmtUSD);
|
||||
LOGGER.info("First Amount in EUR : " + fstAmtEUR);
|
||||
LOGGER.info("One Dolar : " + oneDolar);
|
||||
LOGGER.info("MoneyOf : " + moneyof);
|
||||
LOGGER.info("FastMoneyOf : " + fastmoneyof);
|
||||
|
||||
try{
|
||||
@SuppressWarnings("unused")
|
||||
CurrencyUnit AAA = Monetary.getCurrency("AAA");
|
||||
} catch (UnknownCurrencyException e) {
|
||||
LOGGER.severe("Unknown Currency");
|
||||
}
|
||||
|
||||
roundEUR = fstAmtEUR.with(Monetary.getDefaultRounding());
|
||||
|
||||
LOGGER.info("Rounded EUR : " + roundEUR);
|
||||
|
||||
calcAmtUSD = Money.of(1, "USD").subtract(fstAmtUSD);
|
||||
|
||||
LOGGER.info("Substracting amounts : " + calcAmtUSD);
|
||||
|
||||
calcMoneyFastMoney = moneyof.subtract(fastmoneyof);
|
||||
|
||||
LOGGER.info("Money & FastMoney operations : " + calcMoneyFastMoney);
|
||||
|
||||
monetaryAmounts =
|
||||
new MonetaryAmount[] {
|
||||
Money.of(100, "CHF"),
|
||||
Money.of(10.20, "CHF"),
|
||||
Money.of(1.15, "CHF"), };
|
||||
sumAmtCHF = Money.of(0, "CHF");
|
||||
for (MonetaryAmount monetaryAmount : monetaryAmounts) {
|
||||
sumAmtCHF = sumAmtCHF.add(monetaryAmount);
|
||||
}
|
||||
|
||||
LOGGER.info("Adding amounts : " + sumAmtCHF);
|
||||
|
||||
multiplyAmount = oneDolar.multiply(0.25);
|
||||
LOGGER.info("Multiply Amount : " + multiplyAmount);
|
||||
|
||||
divideAmount = oneDolar.divide(0.25);
|
||||
LOGGER.info("Divide Amount : " + divideAmount);
|
||||
|
||||
try{
|
||||
oneDivThree = oneDolar.divide(3);
|
||||
}catch (ArithmeticException e) {
|
||||
LOGGER.severe("One divide by Three is an infinite number");
|
||||
}
|
||||
|
||||
convEUR = MonetaryConversions.getConversion(ConversionQueryBuilder.of().setTermCurrency("EUR").build());
|
||||
convUSD = MonetaryConversions.getConversion(ConversionQueryBuilder.of().setTermCurrency(USD).build());
|
||||
|
||||
conversionUSD = MonetaryConversions.getConversion("USD");
|
||||
conversionEUR = MonetaryConversions.getConversion("EUR");
|
||||
|
||||
convertedAmountEURtoUSD = fstAmtEUR.with(conversionUSD);
|
||||
convertedAmountEURtoUSD2 = fstAmtEUR.with(convUSD);
|
||||
convertedAmountUSDtoEUR = oneDolar.with(conversionEUR);
|
||||
convertedAmountUSDtoEUR2 = oneDolar.with(convEUR);
|
||||
LOGGER.info("C1 - " + convertedAmountEURtoUSD);
|
||||
LOGGER.info("C2 - " + convertedAmountEURtoUSD2);
|
||||
LOGGER.info("One Euro -> " + convertedAmountUSDtoEUR);
|
||||
LOGGER.info("One Euro2 -> " + convertedAmountUSDtoEUR2);
|
||||
|
||||
oneEuro = Money.of(1, "EUR");
|
||||
|
||||
if (oneEuro.equals(FastMoney.of(1, "EUR"))) {
|
||||
LOGGER.info("Money == FastMoney");
|
||||
} else {
|
||||
LOGGER.info("Money != FastMoney");
|
||||
}
|
||||
|
||||
if (oneDolar.equals(Money.of(1, "USD"))) {
|
||||
LOGGER.info("Factory == Money");
|
||||
} else {
|
||||
LOGGER.info("Factory != Money");
|
||||
}
|
||||
|
||||
formatUSD = MonetaryFormats.getAmountFormat(Locale.US);
|
||||
usFormatted = formatUSD.format(oneDolar);
|
||||
LOGGER.info("One dolar standard formatted : " + usFormatted);
|
||||
|
||||
customFormat = MonetaryFormats.getAmountFormat(AmountFormatQueryBuilder.of(Locale.US).set(CurrencyStyle.NAME).set("pattern", "00000.00 ¤").build());
|
||||
customFormatted = customFormat.format(oneDolar);
|
||||
LOGGER.info("One dolar custom formatted : " + customFormatted);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
@SuppressWarnings("unused")
|
||||
JavaMoney java9Money = new JavaMoney();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,190 @@
|
||||
package com.baeldung.money;
|
||||
|
||||
import org.javamoney.moneta.FastMoney;
|
||||
import org.javamoney.moneta.Money;
|
||||
import org.javamoney.moneta.format.CurrencyStyle;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.money.CurrencyUnit;
|
||||
import javax.money.Monetary;
|
||||
import javax.money.MonetaryAmount;
|
||||
import javax.money.UnknownCurrencyException;
|
||||
import javax.money.convert.CurrencyConversion;
|
||||
import javax.money.convert.MonetaryConversions;
|
||||
import javax.money.format.AmountFormatQueryBuilder;
|
||||
import javax.money.format.MonetaryAmountFormat;
|
||||
import javax.money.format.MonetaryFormats;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
public class JavaMoneyUnitManualTest {
|
||||
|
||||
@Test
|
||||
public void givenCurrencyCode_whenString_thanExist() {
|
||||
CurrencyUnit usd = Monetary.getCurrency("USD");
|
||||
|
||||
assertNotNull(usd);
|
||||
assertEquals(usd.getCurrencyCode(), "USD");
|
||||
assertEquals(usd.getNumericCode(), 840);
|
||||
assertEquals(usd.getDefaultFractionDigits(), 2);
|
||||
}
|
||||
|
||||
@Test(expected = UnknownCurrencyException.class)
|
||||
public void givenCurrencyCode_whenNoExist_thanThrowsError() {
|
||||
Monetary.getCurrency("AAA");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAmounts_whenStringified_thanEquals() {
|
||||
CurrencyUnit usd = Monetary.getCurrency("USD");
|
||||
MonetaryAmount fstAmtUSD = Monetary
|
||||
.getDefaultAmountFactory()
|
||||
.setCurrency(usd)
|
||||
.setNumber(200)
|
||||
.create();
|
||||
Money moneyof = Money.of(12, usd);
|
||||
FastMoney fastmoneyof = FastMoney.of(2, usd);
|
||||
|
||||
assertEquals("USD", usd.toString());
|
||||
assertEquals("USD 200", fstAmtUSD.toString());
|
||||
assertEquals("USD 12", moneyof.toString());
|
||||
assertEquals("USD 2.00000", fastmoneyof.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenCurrencies_whenCompared_thanNotequal() {
|
||||
MonetaryAmount oneDolar = Monetary
|
||||
.getDefaultAmountFactory()
|
||||
.setCurrency("USD")
|
||||
.setNumber(1)
|
||||
.create();
|
||||
Money oneEuro = Money.of(1, "EUR");
|
||||
|
||||
assertFalse(oneEuro.equals(FastMoney.of(1, "EUR")));
|
||||
assertTrue(oneDolar.equals(Money.of(1, "USD")));
|
||||
}
|
||||
|
||||
@Test(expected = ArithmeticException.class)
|
||||
public void givenAmount_whenDivided_thanThrowsException() {
|
||||
MonetaryAmount oneDolar = Monetary
|
||||
.getDefaultAmountFactory()
|
||||
.setCurrency("USD")
|
||||
.setNumber(1)
|
||||
.create();
|
||||
oneDolar.divide(3);
|
||||
fail(); // if no exception
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAmounts_whenSummed_thanCorrect() {
|
||||
List<MonetaryAmount> monetaryAmounts = Arrays.asList(Money.of(100, "CHF"), Money.of(10.20, "CHF"), Money.of(1.15, "CHF"));
|
||||
|
||||
Money sumAmtCHF = (Money) monetaryAmounts
|
||||
.stream()
|
||||
.reduce(Money.of(0, "CHF"), MonetaryAmount::add);
|
||||
|
||||
assertEquals("CHF 111.35", sumAmtCHF.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenArithmetic_whenStringified_thanEqualsAmount() {
|
||||
CurrencyUnit usd = Monetary.getCurrency("USD");
|
||||
|
||||
Money moneyof = Money.of(12, usd);
|
||||
MonetaryAmount fstAmtUSD = Monetary
|
||||
.getDefaultAmountFactory()
|
||||
.setCurrency(usd)
|
||||
.setNumber(200.50)
|
||||
.create();
|
||||
MonetaryAmount oneDolar = Monetary
|
||||
.getDefaultAmountFactory()
|
||||
.setCurrency("USD")
|
||||
.setNumber(1)
|
||||
.create();
|
||||
Money subtractedAmount = Money
|
||||
.of(1, "USD")
|
||||
.subtract(fstAmtUSD);
|
||||
MonetaryAmount multiplyAmount = oneDolar.multiply(0.25);
|
||||
MonetaryAmount divideAmount = oneDolar.divide(0.25);
|
||||
|
||||
assertEquals("USD", usd.toString());
|
||||
assertEquals("USD 1", oneDolar.toString());
|
||||
assertEquals("USD 200.5", fstAmtUSD.toString());
|
||||
assertEquals("USD 12", moneyof.toString());
|
||||
assertEquals("USD -199.5", subtractedAmount.toString());
|
||||
assertEquals("USD 0.25", multiplyAmount.toString());
|
||||
assertEquals("USD 4", divideAmount.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAmount_whenRounded_thanEquals() {
|
||||
MonetaryAmount fstAmtEUR = Monetary
|
||||
.getDefaultAmountFactory()
|
||||
.setCurrency("EUR")
|
||||
.setNumber(1.30473908)
|
||||
.create();
|
||||
MonetaryAmount roundEUR = fstAmtEUR.with(Monetary.getDefaultRounding());
|
||||
assertEquals("EUR 1.30473908", fstAmtEUR.toString());
|
||||
assertEquals("EUR 1.3", roundEUR.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore("Currency providers are not always available")
|
||||
public void givenAmount_whenConversion_thenNotNull() {
|
||||
MonetaryAmount oneDollar = Monetary
|
||||
.getDefaultAmountFactory()
|
||||
.setCurrency("USD")
|
||||
.setNumber(1)
|
||||
.create();
|
||||
|
||||
CurrencyConversion conversionEUR = MonetaryConversions.getConversion("EUR");
|
||||
|
||||
MonetaryAmount convertedAmountUSDtoEUR = oneDollar.with(conversionEUR);
|
||||
|
||||
assertEquals("USD 1", oneDollar.toString());
|
||||
assertNotNull(convertedAmountUSDtoEUR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenLocale_whenFormatted_thanEquals() {
|
||||
MonetaryAmount oneDollar = Monetary
|
||||
.getDefaultAmountFactory()
|
||||
.setCurrency("USD")
|
||||
.setNumber(1)
|
||||
.create();
|
||||
MonetaryAmountFormat formatUSD = MonetaryFormats.getAmountFormat(Locale.US);
|
||||
String usFormatted = formatUSD.format(oneDollar);
|
||||
|
||||
assertEquals("USD 1", oneDollar.toString());
|
||||
assertNotNull(formatUSD);
|
||||
assertEquals("USD1.00", usFormatted);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenAmount_whenCustomFormat_thanEquals() {
|
||||
MonetaryAmount oneDollar = Monetary
|
||||
.getDefaultAmountFactory()
|
||||
.setCurrency("USD")
|
||||
.setNumber(1)
|
||||
.create();
|
||||
|
||||
MonetaryAmountFormat customFormat = MonetaryFormats.getAmountFormat(AmountFormatQueryBuilder
|
||||
.of(Locale.US)
|
||||
.set(CurrencyStyle.NAME)
|
||||
.set("pattern", "00000.00 US Dollar")
|
||||
.build());
|
||||
String customFormatted = customFormat.format(oneDollar);
|
||||
|
||||
assertNotNull(customFormat);
|
||||
assertEquals("USD 1", oneDollar.toString());
|
||||
assertEquals("00001.00 US Dollar", customFormatted);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user