diff --git a/java-numbers-3/src/main/java/com/baeldung/formatNumber/FormatNumber.java b/java-numbers-3/src/main/java/com/baeldung/formatNumber/FormatNumber.java new file mode 100644 index 0000000000..1fdcdd4247 --- /dev/null +++ b/java-numbers-3/src/main/java/com/baeldung/formatNumber/FormatNumber.java @@ -0,0 +1,73 @@ +package com.baeldung.formatNumber; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.Locale; + +public class FormatNumber { + public static double withBigDecimal(double value, int places) { + if (places < 0) + throw new IllegalArgumentException(); + + BigDecimal bigDecimal = new BigDecimal(value); + bigDecimal = bigDecimal.setScale(places, RoundingMode.HALF_UP); + return bigDecimal.doubleValue(); + } + + public static double withMathRound(double value, int places) { + double scale = Math.pow(10, places); + return Math.round(value * scale) / scale; + } + + public static double withDecimalFormatPattern(double value, int places) { + DecimalFormat df2 = new DecimalFormat("#,###,###,##0.00"); + DecimalFormat df3 = new DecimalFormat("#,###,###,##0.000"); + if (places == 2) + return new Double(df2.format(value)); + else if (places == 3) + return new Double(df3.format(value)); + else + throw new IllegalArgumentException(); + } + + public static double withDecimalFormatLocal(double value) { + DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.getDefault()); + return new Double(df.format(value)); + } + + public static String withStringFormat(double value, int places) { + return String.format("%." + places + "f", value); + } + + public static String byPaddingZeros(int value, int paddingLength) { + return String.format("%0" + paddingLength + "d", value); + } + + public static double withTwoDecimalPlaces(double value) { + DecimalFormat df = new DecimalFormat("#.00"); + return new Double(df.format(value)); + } + + public static String withLargeIntegers(double value) { + DecimalFormat df = new DecimalFormat("###,###,###"); + return df.format(value); + } + + public static String forPercentages(double value, Locale localisation) { + NumberFormat nf = NumberFormat.getPercentInstance(localisation); + return nf.format(value); + } + + public static String currencyWithChosenLocalisation(double value, Locale localisation) { + NumberFormat nf = NumberFormat.getCurrencyInstance(localisation); + return nf.format(value); + } + + public static String currencyWithDefaultLocalisation(double value) { + NumberFormat nf = NumberFormat.getCurrencyInstance(); + return nf.format(value); + } +} + diff --git a/java-numbers-3/src/test/java/com/baeldung/formatNumber/FormatNumberUnitTest.java b/java-numbers-3/src/test/java/com/baeldung/formatNumber/FormatNumberUnitTest.java new file mode 100644 index 0000000000..4f0358c6a2 --- /dev/null +++ b/java-numbers-3/src/test/java/com/baeldung/formatNumber/FormatNumberUnitTest.java @@ -0,0 +1,82 @@ +package com.baeldung.formatNumber; + +import org.junit.Test; + +import java.util.Locale; + +import static com.baeldung.formatNumber.FormatNumber.*; +import static org.assertj.core.api.Assertions.*; + +public class FormatNumberUnitTest { + private static final double D = 4.2352989244d; + private static final double F = 8.6994540927d; + + @Test + public void givenDecimalNumber_whenFormatNumberWithBigDecimal_thenGetExpectedResult() { + assertThat(withBigDecimal(D, 2)).isEqualTo(4.24); + assertThat(withBigDecimal(D, 3)).isEqualTo(4.235); + assertThat(withBigDecimal(F, 2)).isEqualTo(8.7); + assertThat(withBigDecimal(F, 3)).isEqualTo(8.699); + } + + @Test + public void givenDecimalNumber_whenFormatNumberWithDecimalFormat_thenGetExpectedResult() { + assertThat(withDecimalFormatLocal(D)).isEqualTo(4.235); + assertThat(withDecimalFormatLocal(F)).isEqualTo(8.699); + + assertThat(withDecimalFormatPattern(D, 2)).isEqualTo(4.24); + assertThat(withDecimalFormatPattern(D, 3)).isEqualTo(4.235); + assertThat(withDecimalFormatPattern(F, 2)).isEqualTo(8.7); + assertThat(withDecimalFormatPattern(F, 3)).isEqualTo(8.699); + } + + @Test + public void givenDecimalNumber_whenFormatNumberWithStringFormat_thenGetExpectedResult() { + assertThat(withStringFormat(D, 2)).isEqualTo("4.24"); + assertThat(withStringFormat(D, 3)).isEqualTo("4.235"); + assertThat(withStringFormat(F, 2)).isEqualTo("8.70"); + assertThat(withStringFormat(F, 3)).isEqualTo("8.699"); + } + + @Test + public void givenDecimalNumber_whenFormatNumberWithMathRound_thenGetExpectedResult() { + assertThat(withMathRound(D, 2)).isEqualTo(4.24); + assertThat(withMathRound(D, 3)).isEqualTo(4.235); + assertThat(withMathRound(F, 2)).isEqualTo(8.7); + assertThat(withMathRound(F, 3)).isEqualTo(8.699); + } + + @Test + public void givenIntegerNumber_whenFormatNumberByPaddingOutZeros_thenGetExpectedResult() { + int value = 1; + assertThat(byPaddingZeros(value, 3)).isEqualTo("001"); + } + + @Test + public void givenIntegerNumber_whenFormatNumberWithTwoDecimalPlaces_thenGetExpectedResult() { + int value = 12; + assertThat(withTwoDecimalPlaces(value)).isEqualTo(12.00); + } + + @Test + public void givenIntegerNumber_whenFormatNumberWithLargeIntegers_thenGetExpectedResult() { + int value = 123456789; + assertThat(withLargeIntegers(value)).isEqualTo("123,456,789"); + } + + @Test + public void givenDecimalNumber_whenFormatNumberForPercentages_thenGetExpectedResult() { + double value = 25f / 100f; + assertThat(forPercentages(value, new Locale("en", "US"))).isEqualTo("25%"); + assertThat(forPercentages(value, new Locale("pl", "PL"))).isEqualTo("25%"); + } + + @Test + public void givenCurrency_whenFormatNumberCurrencyWithChosenLocalisation_thenGetExpectedResult() { + double value = 23_500; + assertThat(currencyWithChosenLocalisation(value, new Locale("en", "US"))).isEqualTo("$23,500.00"); + assertThat(currencyWithChosenLocalisation(value, new Locale("zh", "CN"))).isEqualTo("¥23,500.00"); + assertThat(currencyWithChosenLocalisation(value, new Locale("pl", "PL"))).isEqualTo("23 500 zł"); + } + +}