/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JCHbatBCDUtil
*	ソースファイル名	：JCHbatBCDUtil.java
*	作成者				：富士通　
*	作成日				：2011年09月04日
*＜機能概要＞
*　2進化10進部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/09/04  富士通		新規作成
*********************************************************************/
package eo.business.common;

import eo.common.util.JPCCommonUtil;

/**
 * 2進化10進部品です。<p>
 * <BR>
 * @author 富士通
 */
public class JCHbatBCDUtil extends JPCCommonUtil
{
	/** 正規表現：数値（マイナス含む） */
	private static final String REGEX_SIGN = "[\\+\\-]";

	/** 正規表現：プラス */
	private static final String REGEX_PLUS = "[\\+]";
	
	/** 変換用16進数 */
	private static final char HEX_7B = '{';
	private static final char HEX_7D = '}';
	private static final char HEX_70 = '\u0070';
	private static final char HEX_09 = '\u0009';
	private static final char HEX_60 = '\u0060';
	private static final char HEX_07 = '\u0007';

	/**
     * 取得した数値文字列を、SJIS→EBCDICに変換できるように考慮して符号付2進化10進に変換する。<BR>
     * <BR>
     * @param src 変換元数値
     * @return 返却文字列
     */
	public static String toBCDString(String src)
	{
		// 引数に値が未設定の場合、NULLを返却
		if (!isValidParameter(src))
		{
			return null;
		}
		
		// 属性が数値以外の場合、NULLを返却
		if (!isNumber(src))
		{
			return null;
		}
		
		// 作業文字列領域
		String workStr = src.substring(0, src.length() - 1);
		// 文字領域
		char workChar = src.charAt(src.length() - 1);
		
		// 計算領域
		int tmp = 0;
		
		// 変換元文字列がプラス数値の場合
		if (0 <= Long.parseLong(src.replaceFirst(REGEX_PLUS, "")))
		{
			// 文字領域が0の場合
			if ('0' == workChar)
			{
				workChar = HEX_7B;
			}
			else
			{
				// 上位4ビットを、"&h40"に置換
				tmp = workChar ^ HEX_70;
				workChar = (char) tmp;
			}
		}
		// 変換元文字列がマイナス数値の場合
		else
		{
			// 文字領域が'0'の場合
			if ('0' == workChar)
			{
				workChar = HEX_7D;
			}
			// 文字領域が'1'〜'6'の場合
			else if ('1' <= workChar && workChar <= '6')
			{
				// 上位4ビットを、"&h4"に置換
				tmp = workChar ^ HEX_70;
				// 下位4ビットを、"&hA"〜"&hF" 領域に割り当てるため、"&h9"を加算
				tmp = tmp + HEX_09;
				workChar = (char) tmp;
			}
			// 上記以外（'7'〜'9'の場合）
			else
			{
				// 上位4ビットを、"&h5"に置換
				tmp = workChar ^ HEX_60;
				// 下位4ビットを、"&h0"〜"&h2" 領域に割り当てるため、"&h7"を減算
				tmp = tmp - HEX_07;
				workChar = (char) tmp;
			}
		}
		
		// 符号を除去
		workStr = workStr.replaceFirst(REGEX_SIGN, "");
		
		return workStr + String.valueOf(workChar);
	}
	
	/**
	 * 引数の属性が数値か判定します。
	 * @param src チェック対象文字列
	 * @return 結果（true:数値、false:数値ではない）
	 */
	private static boolean isNumber(String src)
	{
		try
		{
			Long.parseLong(src.replaceFirst(REGEX_PLUS, ""));
		}
		catch (NumberFormatException e)
		{
			return false;
		}
		
		return true;
	}
}
