294 lines
9.6 KiB
Java
294 lines
9.6 KiB
Java
/**
|
||
* @Class Name : EgovEhgtCalcUtil.java
|
||
* @Description : 대한민국, 미국,유럽연합, 일본, 중국연합 사이의 환율계산기능을
|
||
* 제공하는 Business Interface class
|
||
* @Modification Information
|
||
* @
|
||
* @ 수정일 수정자 수정내용
|
||
* @ ------- -------- ---------------------------
|
||
* @ 2009.01.13 박정규 최초 생성
|
||
*
|
||
* @author 공통 서비스 개발팀 박정규
|
||
* @since 2009. 01. 13
|
||
* @version 1.0
|
||
* @see
|
||
*
|
||
*/
|
||
|
||
package egovframework.com.cmm.util;
|
||
|
||
import java.io.IOException;
|
||
import java.io.InputStream;
|
||
import java.io.InputStreamReader;
|
||
import java.math.BigDecimal;
|
||
import java.net.HttpURLConnection;
|
||
import java.net.MalformedURLException;
|
||
import java.net.URL;
|
||
|
||
import egovframework.com.cmm.util.EgovResourceCloseHelper;
|
||
|
||
import javax.swing.text.html.HTMLEditorKit;
|
||
import javax.swing.text.html.parser.ParserDelegator;
|
||
|
||
public class EgovEhgtCalcUtil {
|
||
|
||
// 환율....
|
||
static final char EGHT_USD = 'U'; // 미국
|
||
static final char EGHT_JPY = 'J'; // 일본
|
||
static final char EGHT_EUR = 'E'; // 유럽연합
|
||
static final char EGHT_CNY = 'C'; // 중국연합
|
||
|
||
static final char EGHT_KWR = 'K'; // 대한민국
|
||
|
||
static StringBuffer sb = new StringBuffer();
|
||
|
||
/**
|
||
* 대한민국(KRW), 미국(USD), 유럽연합(EUR), 일본(JPY), 중국원화(CNY) 사이의 환율을 계산하는 기능이다
|
||
* 환율표 - 매매기준율 => 미국(USD) - 1485.00(USD), 일본-100(JPY) - 1596.26(JPY)
|
||
* 계산법: 대한민원(KRW) - 1,000원 -> 미국(USD)로 변환 시 => 1,000(원)/1485(매매기준율) = 0.67(URS)
|
||
* 계산법: 일본(JPY) - 100,000원 -> 대한민국(KRW) 변환 시 => (100,000(원) * 1596.26(매매기준율)) / 100(100엔당 기준표이므로) = 1,596,260.00 (KRW)
|
||
* 계산법: 일본(JPY) - 100,000원 -> 미국(USD) 변환 시 => (
|
||
* (100,000(원) * 1596.26(매매기준율)) / 100(100엔당 기준표이므로) = 1,596,260.00 (KRW)) / 1,485.00 = 1,074.92 (USD)
|
||
* @param srcType - 환율기준
|
||
* @param srcAmount - 금액
|
||
* @param cnvrType - 변환환율
|
||
* @return 환율금액
|
||
* @exception MyException
|
||
* @see
|
||
*/
|
||
public void readHtmlParsing(String str) {
|
||
HttpURLConnection con = null;
|
||
InputStream is = null;
|
||
InputStreamReader reader = null;
|
||
try {
|
||
//입력받은 URL에 연결하여 InputStream을 통해 읽은 후 파싱 한다.
|
||
URL url = new URL(str);
|
||
|
||
con = (HttpURLConnection) url.openConnection();
|
||
|
||
is = con.getInputStream();
|
||
reader = new InputStreamReader(is, "euc-kr");
|
||
//InputStreamReader reader = new InputStreamReader(con.getInputStream(), "utf-8");
|
||
|
||
new ParserDelegator().parse(reader, new CallbackHandler(), true);
|
||
|
||
con.disconnect();
|
||
|
||
} catch (MalformedURLException e) {
|
||
throw new RuntimeException(e);
|
||
} catch (IOException e) {
|
||
throw new RuntimeException(e);
|
||
} finally {
|
||
EgovResourceCloseHelper.close(reader, is);
|
||
|
||
if (con != null) {
|
||
con.disconnect();
|
||
}
|
||
}
|
||
}
|
||
|
||
//파서는 콜백 형식으로 되어 있다. 각 태그가 들어 올때 적절한 메소드가 호출됨
|
||
private class CallbackHandler extends HTMLEditorKit.ParserCallback {
|
||
|
||
public void handleText(char[] data, int pos) {
|
||
|
||
String srcStr = new String(data);
|
||
|
||
srcStr = EgovStringUtil.strip(srcStr, " ");
|
||
|
||
sb.append(srcStr).append("/");
|
||
}
|
||
}
|
||
|
||
public static String getEhgtCalc(String srcType, long srcAmount, String cnvrType) throws Exception {
|
||
|
||
String rtnStr = null;
|
||
|
||
String[] eghtStdrRt = null; // Html에서 파싱한 환율매매기준율을 저장하기 위한 문자열배열
|
||
|
||
double srcStdrRt = 0.00; // 원래 매매기준율
|
||
double cnvrStdrRt = 0.00; // 변환 매매기준율
|
||
|
||
//double cnvrAmount = 0.00; // 변환금액
|
||
String sCnvrAmount = null; // 변환금액
|
||
|
||
String srcStr = null;
|
||
String cnvrStr = null;
|
||
|
||
String srcTypeCnvr = srcType.toUpperCase();
|
||
String cnvrTypeCnvr = cnvrType.toUpperCase();
|
||
|
||
EgovEhgtCalcUtil parser = new EgovEhgtCalcUtil();
|
||
|
||
parser.readHtmlParsing("http://community.fxkeb.com/fxportal/jsp/RS/DEPLOY_EXRATE/4176_0.html");
|
||
|
||
if (sb == null) {
|
||
throw new RuntimeException("StringBuffer is null!!");
|
||
}
|
||
|
||
eghtStdrRt = EgovStringUtil.split(sb.toString(), "/");
|
||
|
||
if (eghtStdrRt == null || (eghtStdrRt.length == 0))
|
||
throw new RuntimeException("String Split Error!");
|
||
|
||
char srcChr = srcTypeCnvr.charAt(0);
|
||
char cnvrChr = cnvrTypeCnvr.charAt(0);
|
||
|
||
// 원래 환율기준 정의
|
||
switch (srcChr) {
|
||
|
||
case EGHT_USD: // 미국
|
||
srcStr = "USD";
|
||
break;
|
||
|
||
case EGHT_JPY: // 일본
|
||
srcStr = "JPY";
|
||
break;
|
||
|
||
case EGHT_EUR: // 유럽연합
|
||
srcStr = "EUR";
|
||
break;
|
||
|
||
case EGHT_CNY: // 중국연합
|
||
srcStr = "CNY";
|
||
break;
|
||
|
||
default:
|
||
srcStr = "USD";
|
||
break;
|
||
}
|
||
|
||
// 변환하고자 하는 환율기준 정의
|
||
switch (cnvrChr) {
|
||
|
||
case EGHT_USD: // 미국
|
||
cnvrStr = "USD";
|
||
break;
|
||
|
||
case EGHT_JPY: // 일본
|
||
cnvrStr = "JPY";
|
||
break;
|
||
|
||
case EGHT_EUR: // 유럽연합
|
||
cnvrStr = "EUR";
|
||
break;
|
||
|
||
case EGHT_CNY: // 중국연합
|
||
cnvrStr = "CNY";
|
||
break;
|
||
|
||
default:
|
||
cnvrStr = "KRW";
|
||
break;
|
||
}
|
||
|
||
// 변환하고자 하는 국가의 환율매매기준율 추출...
|
||
for (int i = 0; i < eghtStdrRt.length; i++) {
|
||
|
||
// 원래 매매기준율 추출
|
||
if (eghtStdrRt[i].equals(srcStr)) {
|
||
srcStdrRt = Double.parseDouble(eghtStdrRt[i + 1]);
|
||
|
||
if (i == (eghtStdrRt.length - 1))
|
||
break;
|
||
}
|
||
|
||
// 변환 매매기준율 추출
|
||
if (eghtStdrRt[i].equals(cnvrStr)) {
|
||
cnvrStdrRt = Double.parseDouble(eghtStdrRt[i + 1]);
|
||
|
||
if (i == (eghtStdrRt.length - 1))
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 정확한 계산을 위한 BigDecimal 형태로 구현.
|
||
BigDecimal bSrcAmount = new BigDecimal(String.valueOf(srcAmount)); // 변환하고자 하는 금액
|
||
BigDecimal bSrcStdrRt = new BigDecimal(String.valueOf(srcStdrRt)); // 원래 매매 비율
|
||
BigDecimal bCnvrStdrRt = new BigDecimal(String.valueOf(cnvrStdrRt)); // 변환 매매 비율
|
||
BigDecimal bStdr = new BigDecimal("100"); // 변환 매매 비율
|
||
|
||
// 원래 매매기준율 및 변환매매기준율 기준으로 환율금액 계산
|
||
switch (srcChr) {
|
||
|
||
case EGHT_KWR: // 대한민국
|
||
if (cnvrChr == 'K')
|
||
//변환금액 = 변환대상금액;
|
||
sCnvrAmount = bSrcAmount.toString();
|
||
else if (cnvrChr == 'J')
|
||
//변환금액 = (변환대상금액 / 변환매매비율) * 100;
|
||
sCnvrAmount = (bSrcAmount.divide(bCnvrStdrRt, 4, 4)).multiply(bStdr).setScale(2, 4).toString();
|
||
else
|
||
//변환금액 = (변환대상금액 / 변환매매비율);
|
||
sCnvrAmount = bSrcAmount.divide(bCnvrStdrRt, 2, 4).toString();
|
||
break;
|
||
|
||
case EGHT_USD: // 미국
|
||
if (cnvrChr == 'U')
|
||
//변환금액 = 변환대상금액;
|
||
sCnvrAmount = bSrcAmount.toString();
|
||
else if (cnvrChr == 'K')
|
||
//변환금액 = 변환대상금액 * 원래 매매 비율;
|
||
sCnvrAmount = bSrcAmount.multiply(bSrcStdrRt).setScale(2, 4).toString();
|
||
else if (cnvrChr == 'J')
|
||
//cnvrAmount = ((변환대상금액 * 원래 매매 비율) / 변환 매매 비율) * 100;
|
||
sCnvrAmount = ((bSrcAmount.multiply(bSrcStdrRt).setScale(4, 4)).divide(bCnvrStdrRt, 2, 4)).multiply(bStdr).setScale(2, 4).toString();
|
||
else
|
||
//cnvrAmount = (변환대상금액 * 원래 매매 비율) / 변환 매매 비율;
|
||
sCnvrAmount = (bSrcAmount.multiply(bSrcStdrRt).setScale(4, 4)).divide(bCnvrStdrRt, 2, 4).toString();
|
||
break;
|
||
|
||
case EGHT_EUR: // 유럽연합
|
||
if (cnvrChr == 'E')
|
||
//변환금액 = 변환대상금액;
|
||
sCnvrAmount = bSrcAmount.toString();
|
||
else if (cnvrChr == 'K')
|
||
//cnvrAmount = 변환대상금액 * 원래 매매 비율;
|
||
sCnvrAmount = bSrcAmount.multiply(bSrcStdrRt).setScale(2, 4).toString();
|
||
else if (cnvrChr == 'J')
|
||
//cnvrAmount = ((변환대상금액 * 원래 매매 비율) / 변환 매매 비율) * 100;
|
||
sCnvrAmount = ((bSrcAmount.multiply(bSrcStdrRt).setScale(4, 4)).divide(bCnvrStdrRt, 2, 4)).multiply(bStdr).setScale(2, 4).toString();
|
||
else
|
||
//cnvrAmount = (변환대상금액 * 원래 매매 비율) / 변환 매매 비율;
|
||
sCnvrAmount = (bSrcAmount.multiply(bSrcStdrRt).setScale(4, 4)).divide(bCnvrStdrRt, 2, 4).toString();
|
||
break;
|
||
|
||
case EGHT_JPY: // 일본
|
||
if (cnvrChr == 'J')
|
||
//변환금액 = 변환대상금액;
|
||
sCnvrAmount = bSrcAmount.toString();
|
||
else if (cnvrChr == 'K')
|
||
//cnvrAmount = (변환대상금액 * 원래 매매 비율) / 100;
|
||
sCnvrAmount = (bSrcAmount.multiply(bSrcStdrRt).setScale(4, 4)).divide(bStdr, 2, 4).toString();
|
||
else
|
||
//cnvrAmount = ((변환대상금액 * 원래 매매 비율) / 100) / 변환 매매 비율;
|
||
sCnvrAmount = ((bSrcAmount.multiply(bSrcStdrRt).setScale(4, 4)).divide(bStdr, 2, 4)).divide(bCnvrStdrRt, 2, 4).toString();
|
||
break;
|
||
|
||
case EGHT_CNY: // 중국연합
|
||
if (cnvrChr == 'C')
|
||
//변환금액 = 변환대상금액;
|
||
sCnvrAmount = bSrcAmount.toString();
|
||
else if (cnvrChr == 'K')
|
||
//cnvrAmount = 변환대상금액 * 원래 매매 비율;
|
||
sCnvrAmount = bSrcAmount.multiply(bSrcStdrRt).setScale(2, 4).toString();
|
||
else if (cnvrChr == 'J')
|
||
//cnvrAmount = ((변환대상금액 * 원래 매매 비율) / 변환 매매 비율) * 100;
|
||
sCnvrAmount = ((bSrcAmount.multiply(bSrcStdrRt).setScale(4, 4)).divide(bCnvrStdrRt, 2, 4)).multiply(bStdr).setScale(2, 4).toString();
|
||
else
|
||
//cnvrAmount = (변환대상금액 * 원래 매매 비율) / 변환 매매 비율;
|
||
sCnvrAmount = (bSrcAmount.multiply(bSrcStdrRt).setScale(4, 4)).divide(bCnvrStdrRt, 2, 4).toString();
|
||
break;
|
||
|
||
default:
|
||
//변환금액 = (변환대상금액 / 변환매매비율);
|
||
sCnvrAmount = bSrcAmount.divide(bCnvrStdrRt, 2, 4).toString();
|
||
break;
|
||
}
|
||
|
||
rtnStr = sCnvrAmount + " " + cnvrStr;
|
||
|
||
return rtnStr;
|
||
}
|
||
|
||
} |