[공통] util → framework 유틸 (ACM-CM-002)
This commit is contained in:
parent
56c791f0af
commit
2757f6a51b
1 changed files with 105 additions and 0 deletions
|
|
@ -0,0 +1,105 @@
|
||||||
|
package com.klaro.acquirecore.framework.util;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static utility class for monetary amount operations migrated from legacy C code.
|
||||||
|
* Provides parsing, formatting, and arithmetic for BigDecimal amounts.
|
||||||
|
*/
|
||||||
|
public final class AmountUtil {
|
||||||
|
|
||||||
|
public static final String DEFAULT_CURRENCY = "KRW";
|
||||||
|
private static final int DEFAULT_SCALE = 2;
|
||||||
|
private static final RoundingMode DEFAULT_ROUNDING = RoundingMode.HALF_UP;
|
||||||
|
|
||||||
|
private AmountUtil() {
|
||||||
|
// Utility class - prevent instantiation
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BigDecimal parse(String str) {
|
||||||
|
if (str == null || str.isBlank()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
String cleaned = str.trim().replaceAll(",", "");
|
||||||
|
cleaned = cleaned.replaceAll("[A-Z]{3}\\s*", "");
|
||||||
|
return new BigDecimal(cleaned).setScale(DEFAULT_SCALE, DEFAULT_ROUNDING);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String format(BigDecimal amount, String currency) {
|
||||||
|
if (amount == null) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String curr = (currency != null && !currency.isBlank()) ? currency : DEFAULT_CURRENCY;
|
||||||
|
return String.format("%s %s", curr, amount.setScale(DEFAULT_SCALE, DEFAULT_ROUNDING).toPlainString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String format(BigDecimal amount) {
|
||||||
|
return format(amount, DEFAULT_CURRENCY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BigDecimal add(BigDecimal a, BigDecimal b) {
|
||||||
|
if (a == null || b == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return a.add(b).setScale(DEFAULT_SCALE, DEFAULT_ROUNDING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BigDecimal subtract(BigDecimal a, BigDecimal b) {
|
||||||
|
if (a == null || b == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return a.subtract(b).setScale(DEFAULT_SCALE, DEFAULT_ROUNDING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BigDecimal multiply(BigDecimal amount, int factor) {
|
||||||
|
if (amount == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return amount.multiply(BigDecimal.valueOf(factor)).setScale(DEFAULT_SCALE, DEFAULT_ROUNDING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BigDecimal multiply(BigDecimal amount, BigDecimal factor) {
|
||||||
|
if (amount == null || factor == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return amount.multiply(factor).setScale(DEFAULT_SCALE, DEFAULT_ROUNDING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BigDecimal divide(BigDecimal amount, BigDecimal divisor) {
|
||||||
|
if (amount == null || divisor == null || divisor.compareTo(BigDecimal.ZERO) == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return amount.divide(divisor, DEFAULT_SCALE, DEFAULT_ROUNDING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isPositive(BigDecimal amount) {
|
||||||
|
return amount != null && amount.compareTo(BigDecimal.ZERO) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isNegative(BigDecimal amount) {
|
||||||
|
return amount != null && amount.compareTo(BigDecimal.ZERO) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isZero(BigDecimal amount) {
|
||||||
|
return amount != null && amount.compareTo(BigDecimal.ZERO) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BigDecimal abs(BigDecimal amount) {
|
||||||
|
if (amount == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return amount.abs().setScale(DEFAULT_SCALE, DEFAULT_ROUNDING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BigDecimal negate(BigDecimal amount) {
|
||||||
|
if (amount == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return amount.negate().setScale(DEFAULT_SCALE, DEFAULT_ROUNDING);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in a new issue