/* * Copyright 2008-2009 MOPAS(Ministry of Public Administration and Security). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package egovframework.rte.fdl.string; import java.math.BigDecimal; /** * 숫자의 연산을 처리하는 유틸 클래스 * * <p><b>NOTE:</b> 숫자와 관련된 여러 기능을 제공하는 유틸이다. 숫자의 연산 및 올림, 내림 등의 기능을 제공한다.</p> * <pre> * ----------------------------------------------------------------------- * BigDecimal의 Field * ----------------------------------------------------------------------- * ROUND_FLOOR : 무조건 내림 (음수일 경우에 무조건 올림) * ROUND_DOWN : 무조건 내림 * ROUND_HALF_DOWN : 반올림 (5보다 크면 올림) * ROUND_HALF_UP : 반올림 (5보다 크거나 같으면 올림) * ROUND_HALF_EVEN : 반올림 (좌측의 수가 홀수면 HALF_UP, 짝수면 HALF_DOWN) * ROUND_UP : 무조건 올림 * ROUND_CEILING : 무조건 올림 (음수일 경우에 무조건 내림) * </pre> * * @author 실행환경 개발팀 윤성종 * @since 2009.06.01 * @version 1.0 * @see <pre> * == 개정이력(Modification Information) == * * 수정일 수정자 수정내용 * ------- -------- --------------------------- * 2009.06.01 윤성종 최초 생성 * * </pre> */ public class EgovNumericUtil { /** * 올림 */ public static final int ROUND_UP = BigDecimal.ROUND_UP; /** * 내림(절사) */ public static final int ROUND_DOWN = BigDecimal.ROUND_DOWN; /** * 반올림 */ public static final int ROUND_HALF_UP = BigDecimal.ROUND_HALF_UP; /** * 사용하지 않음 */ public static final int ROUND_UNNECESSARY = BigDecimal.ROUND_UNNECESSARY; /** * <p> * <strong>NumericHelper</strong>의 default 컨스트럭터(Constructor). * </p> */ protected EgovNumericUtil() { } /** * <p> * 문자열의 Number형 문자열인지 여부 (- 기호나 소수점도 포함) * </p> * @param source 검증 하고자 하는 문자열 * @return 숫자형 문자열 여부 (true : 숫자형) */ public static boolean isNumber(String source) { if (EgovStringUtil.isNull(source)) { return false; } try { Double db = new Double(source); return !db.isNaN(); } catch (NumberFormatException ex) { return false; } } /** * <p> * String형 값의 기본덧셈을 실행한다. * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @return 결과 값 * @see #isPlus(String, String, int) * @see #isPlus(String, String, int, int) */ public static String plus(String thisVal, String addVal) { String result = null; BigDecimal one = new BigDecimal(thisVal == null ? "0" : thisVal); BigDecimal two = new BigDecimal(addVal == null ? "0" : addVal); result = one.add(two).toString(); return result; } /** * <p> * 덧셈한 결과값의 소숫점 자릿수만 지정한다. * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @param scale <code>int</code> 자리수지정 * @return 결과 값 * @see #isPlus(String, String, int, int) * @see #isPlus(String, String) */ public static String plus(String thisVal, String addVal, int scale) { return plus(thisVal, addVal, scale, ROUND_UNNECESSARY); } /** * <p> * 덧셈한 결과값의 자릿수와 올림,내림,절삭여부 지정한다. * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @param scale <code>int</code> 자리수지정 * @param roundMode <code>int</code> Round 여부 <br> * 올 림 : {@link #ROUND_UP} <br> * 내 림 : {@link #ROUND_DOWN} <br> * 반올림 : {@link #ROUND_HALF_UP} * @return 결과 값 * @see #isPlus(String, String, int) * @see #isPlus(String, String) */ public static String plus(String thisVal, String addVal, int scale, int roundMode) { String result = null; BigDecimal one = new BigDecimal(thisVal == null ? "0" : thisVal); BigDecimal two = new BigDecimal(addVal == null ? "0" : addVal); result = one.add(two).setScale(scale, roundMode).toString(); return result; } /** * <p> * 기본뺄셈을 실행한다. * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @return 결과 값 * @see #isMinus(String, String, int) * @see #isMinus(String, String, int, int) */ public static String minus(String thisVal, String addVal) { String result = null; BigDecimal one = new BigDecimal(thisVal == null ? "0" : thisVal); BigDecimal two = new BigDecimal(addVal == null ? "0" : addVal); result = one.subtract(two).toString(); return result; } /** * <p> * 뺄셈한 결과값의 자릿수만 지정한다. * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @param scale <code>int</code> 자리수지정 * @return 결과 값 * @see #isMinus(String, String, int, int) * @see #isMinus(String, String) */ public static String minus(String thisVal, String addVal, int scale) { return minus(thisVal, addVal, scale, ROUND_UNNECESSARY); } /** * <p> * 뺄셈한 결과값의 자릿수와 올림,내림,절삭여부 지정한다. * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @param scale <code>int</code> 자리수지정 * @param roundMode <code>int</code> Round 여부 <br> * 올 림 : {@link #ROUND_UP} <br> * 내 림 : {@link #ROUND_DOWN} <br> * 반올림 : {@link #ROUND_HALF_UP} * @return 결과 값 * @see #isMinus(String, String, int) * @see #isMinus(String, String) */ public static String minus(String thisVal, String addVal, int scale, int roundMode) { String result = null; BigDecimal one = new BigDecimal(thisVal == null ? "0" : thisVal); BigDecimal two = new BigDecimal(addVal == null ? "0" : addVal); result = one.subtract(two).setScale(scale, roundMode).toString(); return result; } /** * <p> * 기본곱셈을 실행한다. * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @return 결과 값 * @see #isMultiply(String, String, int) * @see #isMultiply(String, String, int, int) */ public static String multiply(String thisVal, String addVal) { String result = null; BigDecimal one = new BigDecimal(thisVal == null ? "0" : thisVal); BigDecimal two = new BigDecimal(addVal == null ? "0" : addVal); result = one.multiply(two).toString(); return result; } /** * <p> * 곱셈한 결과값의 자릿수만 지정한다. * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @param scale <code>int</code> 자리수지정 * @return 결과 값 * @see #isMultiply(String, String, int, int) * @see #isMultiply(String, String) */ public static String multiply(String thisVal, String addVal, int scale) { return multiply(thisVal, addVal, scale, ROUND_UNNECESSARY); } /** * <p> * 곱셈한 결과값의 자릿수와 올림,내림,절삭여부 지정한다. * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @param scale <code>int</code> 자리수지정 * @param roundMode <code>int</code> Round 여부 <br> * 올 림 : {@link #ROUND_UP} <br> * 내 림 : {@link #ROUND_DOWN} <br> * 반올림 : {@link #ROUND_HALF_UP} * @return 결과 값 * @see #isMultiply(String, String, int) * @see #isMultiply(String, String) */ public static String multiply(String thisVal, String addVal, int scale, int roundMode) { String result = null; BigDecimal one = new BigDecimal(thisVal == null ? "0" : thisVal); BigDecimal two = new BigDecimal(addVal == null ? "0" : addVal); result = one.multiply(two).setScale(scale, roundMode).toString(); return result; } /** * <p> * 기본나눗셈을 실행한다. * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @return 결과 값 * @see #isDivide(String, String, int) * @see #isDivide(String, String, int, int) */ public static String divide(String thisVal, String addVal) { String result = null; BigDecimal one = new BigDecimal(thisVal == null ? "0" : thisVal); BigDecimal two = new BigDecimal(addVal == null ? "0" : addVal); result = one.divide(two).toString(); return result; } /** * <p> * 나눗셈의 결과값이 정수 * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @param roundMode <code>int</code> Round 여부 <br> * 올 림 : {@link #ROUND_UP} <br> * 내 림 : {@link #ROUND_DOWN} <br> * 반올림 : {@link #ROUND_HALF_UP} * @return 결과 값 * @see #isDivide(String, String, int, int) */ public static String divide(String thisVal, String addVal, int roundMode) { String result = null; BigDecimal one = new BigDecimal(thisVal == null ? "0" : thisVal); BigDecimal two = new BigDecimal(addVal == null ? "0" : addVal); result = one.divide(two, roundMode).toString(); return result; } /** * <p> * 나눗셈 결과값의 자릿수와 올림,내림,절삭여부 지정한다 * </p> * @param thisVal <code>String</code> * @param addVal <code>String</code> * @param scale <code>int</code> 자리수지정 * @param roundMode <code>int</code> Round 여부 <br> * 올 림 : {@link #ROUND_UP} <br> * 내 림 : {@link #ROUND_DOWN} <br> * 반올림 : {@link #ROUND_HALF_UP} * @return String * @see #isDivide(String, String, int) */ public static String divide(String thisVal, String addVal, int scale, int roundMode) { String result = null; BigDecimal one = new BigDecimal(thisVal == null ? "0" : thisVal); BigDecimal two = new BigDecimal(addVal == null ? "0" : addVal); result = one.divide(two, scale, roundMode).toString(); return result; } /** * <p> * 기본값을 scale 자릿수만큼 ROUND한다. * </p> * @param thisVal <code>String</code> * @param scale <code>int</code> 자리수지정 * @param roundMode <code>int</code> Round 여부 <br> * 올 림 : {@link #ROUND_UP} <br> * 내 림 : {@link #ROUND_DOWN} <br> * 반올림 : {@link #ROUND_HALF_UP} * @return String */ public static String setScale(String thisVal, int scale, int roundMode) { BigDecimal one = new BigDecimal(thisVal == null ? "0" : thisVal); return one.setScale(scale, roundMode).toString(); } }