public class NumberUtility {
private static final Log LOG = LogFactory.getLog(NumberUtility.class);
public static final BigDecimal INT_MIN_IN_BIGDECIMAL = new BigDecimal(Integer.MIN_VALUE);
public static final BigDecimal INT_MAX_IN_BIGDECIMAL = new BigDecimal(Integer.MAX_VALUE);
public static final BigDecimal LONG_MIN_IN_BIGDECIMAL = new BigDecimal(Long.MIN_VALUE);
public static final BigDecimal LONG_MAX_IN_BIGDECIMAL = new BigDecimal(Long.MAX_VALUE);
/**
* 생성 금지
*/
private NumberUtility(){}
/**
* Object를 매개변수로 받아서 int로 리턴한다.<br>
* <br>
* float나 double이 들어올 경우에는 소수점 이하의 숫자가 버려진다.<br>
* <br>
* @param src
* @return
*/
public static int convertInt(Object src){
if(isZeroValue(src)){ return 0; }
BigDecimal b = castBigDecimal(src);
//유효한 범위를 벗어난 casting은 잘못된 값을 반환하게 되므로 exception을 throw 한다.
if (b.compareTo(INT_MIN_IN_BIGDECIMAL) < 0 || b.compareTo(INT_MAX_IN_BIGDECIMAL) > 0) {
throw new IllegalArgumentException("int range exceed: " + String.valueOf(b));
}
return b.intValue();
}
/**
* Object를 매개변수로 받아서 long으로 리턴한다.<br>
* <br>
* float나 double이 들어올 경우에는 소수점 이하의 숫자가 버려진다.<br>
* <br>
* @param src
* @return
*/
public static long convertLong(Object src){
if(isZeroValue(src)){ return 0; }
BigDecimal b = castBigDecimal(src);
//유효한 범위를 벗어난 casting은 잘못된 값을 반환하게 되므로 exception을 throw 한다.
if (b.compareTo(LONG_MIN_IN_BIGDECIMAL) < 0 || b.compareTo(LONG_MAX_IN_BIGDECIMAL) > 0) {
throw new IllegalArgumentException("long range exceed: " + String.valueOf(b));
}
return b.longValue();
}
/**
* Object를 BigDecimal로 변환하여 리턴한다.<br>
* <br>
* - src가 null 이 아니라는 전제 하에 수행한다.<br>
* <br>
* @param src
* @return
*/
private static BigDecimal castBigDecimal(Object src){
BigDecimal b = null; //정수형 데이터의 유효범위를 비교하기 위해서 가장 범위가 넓은 BigDecimal 객체로 형변환한다.
if(src instanceof BigDecimal) {
b = (BigDecimal)src;
}else{
b = new BigDecimal(src.toString());
}
if(LOG.isTraceEnabled()) {
LOG.trace("## NumberUtility.castBigDecimal(): "+String.valueOf(b));
}
return b;
}
/**
* 인수로 들어온 값이 숫자상으로 빈 값일 경우 true, 아닐 경우 false를 리턴한다.<br>
* <br>
* @param src
* @param methodName
* @return
*/
private static boolean isZeroValue(Object src){
boolean isZero = false;
if(src == null){
isZero = true;
}else if((src instanceof String) && StringUtils.isBlank((String)src)){ //빈문자 "" 일 경우
isZero = true;
}
if(isZero){
if(LOG.isTraceEnabled()) {
LOG.trace("NumberUtility.isZeroNumber() > src is null or blank");
}
}
return isZero;
}
}