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; } }