/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JPCStringUtil
*	ソースファイル名：JPCStringUtil.java
*	作成者			：富士通
*	日付			：2011年02月16日
*＜機能概要＞
*	文字列編集を行う共通機能を提供する。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/02/16	富士通		新規作成
*
**********************************************************************/
package eo.common.util;

import java.io.UnsupportedEncodingException;

/**
 * 文字列編集を行うクラスです。<p>
 * <br>
 * @author 富士通
 */
public class JPCEditString extends JPCCommonUtil 
{
	/**
	 * 指定された桁数まで半角空白を充填します。
	 * <br>
	 * @param arg0 調整する文字列
	 * @param arg1 調整する長さ
	 * @param arg2 空白埋め左右判断フラグ（true：右埋め、false：左埋め）
	 * @return String 空白充填後の文字列
	 */
	public static String fillHalfSpace(String arg0, int arg1, boolean arg2) 
	{
		return fillMoji(arg0, arg1, arg2, ' ');
	}

	/**
	 * 指定された桁数まで全角空白を充填します。
	 * <br>
	 * @param arg0 調整する文字列
	 * @param arg1 調整する長さ
	 * @param arg2 空白埋め左右判断フラグ（true：右埋め、false：左埋め）
	 * @return String 空白充填後の文字列
	 */
	public static String fillSpace(String arg0, int arg1, boolean arg2) 
	{
		return fillMoji(arg0, arg1, arg2, '　');
	}

	/**
	 * 指定された桁数まで0を充填します。
	 * <br>
	 * @param arg0 調整する文字列
	 * @param arg1 調整する長さ
	 * @param arg2 空白埋め左右判断フラグ（true：右埋め、false：左埋め）
	 * @return String 0文字充填後の文字列
	 */
	public static String fillZero(String arg0, int arg1, boolean arg2) 
	{
		return fillMoji(arg0, arg1, arg2, '0');
	}

	/**
	 * 前後空白文字（全角、半角）を削除します。
	 * <br>
	 * @param arg0 対象文字列
	 * @return String 前後の空白を削除した文字列
	 */
	public static String trim(String arg0) 
	{
		if(JPCEditString.isNull(arg0)) 
		{
			return "";
		}

		StringBuffer buf = new StringBuffer(arg0);

		// 前方の空白（半角・全角）の削除
		buf = trimFontMoji(buf);

		if(JPCEditString.isNull(buf)) 
		{
			return "";
		}

		buf = trimBackMoji(buf);

		return buf.toString();
	}

	/**
	 * 前空白文字（全角、半角）を削除します。
	 * <br>
	 * @param arg0	対象文字列
	 * @return String 先頭の空白を削除した文字列
	 */
	public static String Ltrim(String arg0) 
	{
		if(JPCEditString.isNull(arg0)) 
		{
			return "";
		}

		StringBuffer buf = new StringBuffer(arg0);

		buf = trimFontMoji(buf);

		return buf.toString();
	}

	/**
	 * 後空白文字（全角、半角）を削除します。
	 * <br>
	 * @param arg0 対象文字列
	 * @return String 後ろの空白を削除した文字列を返却する。
	 */
	public static String Rtrim(String arg0) 
	{
		if(JPCEditString.isNull(arg0)) 
		{
			return "";
		}

		StringBuffer buf = new StringBuffer(arg0);

		buf = trimBackMoji(buf);

		return buf.toString();
	}

	/**
	 * 指定された桁数まで充填します。
	 * <br>
	 * @param arg0 編集する文字列
	 * @param arg1 編集する長さ
	 * @param arg2 左右判断フラグ
	 * @param arg3 充填する文字
	 * @return String 編集した文字列を返却
	 */
	private static String fillMoji(String arg0, int arg1, boolean arg2, char arg3) 
	{
		if(JPCEditString.isNull(arg0)) 
		{
			return "";
		}

		if(arg1 <= 0) 
		{
			return "";
		}

		String strRep = arg0;

		if (arg0.length() < arg1) 
		{
			StringBuffer buf = new StringBuffer(arg0);

			if (arg2) 
			{
				for (int i = buf.length(); i < arg1; i++) 
				{
					buf.append(arg3);
				}

			}
			else 
			{
				for (int i = buf.length(); i < arg1; i++) 
				{
					buf.insert(0, arg3);
				}
			}

			strRep = buf.toString();
		}

		return strRep;
	}

	/**
	 * 文字列前空白のTrimを行います。
	 * <br>
	 * @param arg0 編集を行う文字列
	 * @return String 編集された文字列
	 */
	private static StringBuffer trimFontMoji(StringBuffer arg0) 
	{
		// 前方の空白（半角・全角）の削除
		while (arg0.substring(0, 1).equals(" ") || arg0.substring(0, 1).equals("　")) 
		{
			arg0.deleteCharAt(0);

			if (arg0.length() <= 0) 
			{
				break;
			}
		}

		return arg0;
	}

	/**
	 * 文字列後空白のTrimを行います。
	 * <br>
	 * @param arg0 編集を行う文字列
	 * @return String 編集された文字列
	 */
	private static StringBuffer trimBackMoji(StringBuffer arg0) 
	{
		while (arg0.substring(arg0.length() - 1, arg0.length()).equals(" ") 
				|| arg0.substring(arg0.length() - 1, arg0.length()).equals("　")) 
		{
			arg0.deleteCharAt(arg0.length() - 1);

			if(JPCEditString.isNull(arg0)) 
			{
				break;
			}
		}

		return arg0;
	}

	/**
	 * <p>
	 * 年月日文字列(yyyyMMdd)から年(yyyy)の文字列を取得します。
	 * </p>
	 * @param ymd 年月日文字列(yyyyMMdd)
	 * @return 年月日文字列(yyyyMMdd)の年(yyyy)
	 */
	public static String toYearFromYmd(String ymd)
	{
		if (isNull(ymd))
		{
			return null;
		}

		if (8 != ymd.length())
		{
			return null;
		}

		String year = ymd.substring(0, 4);
		return year;
	}

	/**
	 * <p>
	 * 年月日文字列(yyyyMMdd)から月(MM)の文字列を取得します。
	 * </p>
	 * @param ymd 年月日文字列(yyyyMMdd)
	 * @return 年月日文字列(yyyyMMdd)の月(MM)
	 */
	public static String toMonthFromYmd(String ymd)
	{
		if (isNull(ymd))
		{
			return null;
		}

		if (8 != ymd.length())
		{
			return null;
		}

		String month = ymd.substring(4, 6);
		return month;
	}

	/**
	 * <p>
	 * 年月日文字列(yyyyMMdd)から日(dd)の文字列を取得します。
	 * </p>
	 * @param ymd 年月日文字列(yyyyMMdd)
	 * @return 年月日文字列(yyyyMMdd)の日(dd)
	 */
	public static String toDayFromYmd(String ymd)
	{
		if (isNull(ymd))
		{
			return null;
		}

		if (8 != ymd.length())
		{
			return null;
		}

		String day = ymd.substring(6, 8);
		return day;
	}

	/**
	 * <p>
	 * 年月文字列(yyyyMM)から年(yyyy)の文字列を取得します。
	 * </p>
	 * @param ym 年月文字列(yyyyMMdd)
	 * @return 年月文字列(yyyyMMdd)の年(yyyy)
	 */
	public static String toYearFromYm(String ym)
	{
		if (isNull(ym))
		{
			return null;
		}

		if (6 != ym.length())
		{
			return null;
		}

		String year = ym.substring(0, 4);
		return year;
	}

	/**
	 * <p>
	 * 年月文字列(yyyyMM)から月(MM)の文字列を取得します。
	 * </p>
	 * @param ym 年月文字列(yyyyMM)
	 * @return 年月文字列(yyyyMM)の年(MM)
	 */
	public static String toMonthFromYm(String ym)
	{
		if (isNull(ym))
		{
			return null;
		}

		if (6 != ym.length())
		{
			return null;
		}

		String month = ym.substring(4, 6);
		return month;
	}

	/**
	 * <p>
	 * 年月日時分秒文字列(yyyyMMddHHmmssSSS)から年月日(yyyyMMdd)の文字列を取得します。
	 * </p>
	 * @param ym 年月日時分秒文字列(yyyyMMddHHmmssSSS)
	 * @return 年月日時分秒文字列(yyyyMMddHHmmssSSS)の年月日(yyyyMMdd)
	 */
	public static String toYmdFromDtm(String dtm)
	{
		if (isNull(dtm))
		{
			return null;
		}

		if (17 != dtm.length())
		{
			return null;
		}

		String ymd = dtm.substring(0, 8);
		return ymd;
	}

	/**
	 * <p>
	 * 郵便番号文字列(7桁)から上3桁の文字列を取得します。
	 * </p>
	 * @param pcd 郵便番号文字列(7桁)
	 * @return 郵便番号文字列(7桁)の上3桁
	 */
	public static String toTopThreeDigitFromPcd(String pcd)
	{
		if (isNull(pcd))
		{
			return null;
		}

		if (7 != pcd.length())
		{
			return null;
		}

		String top = pcd.substring(0, 3);
		return top;
	}

	/**
	 * <p>
	 * 郵便番号文字列(7桁)から下4桁の文字列を取得します。
	 * </p>
	 * @param pcd 郵便番号文字列(7桁)
	 * @return 郵便番号文字列(7桁)の下4桁
	 */
	public static String toUnderFourDigitFromPcd(String pcd)
	{
		if (isNull(pcd))
		{
			return null;
		}

		if (7 != pcd.length())
		{
			return null;
		}

		String bottom = pcd.substring(3, 7);
		return bottom;
	}

	/**
	 * <p>
	 * 郵便番号上3桁、郵便番号下4桁の文字列を結合します。
	 * </p>
	 * @param top 郵便番号上3桁
	 * @param under 郵便番号下4桁
	 * @return 郵便番号上3桁、郵便番号下4桁を結合した文字列
	 */
	public static String concatPcd(String top, String under)
	{
		StringBuffer pcd = new StringBuffer();

		if (!isNull(top))
		{
			pcd.append(top);
		}

		if (!isNull(under))
		{
			pcd.append(under);
		}

		String ret = pcd.toString();

		if (0 == ret.length())
		{
			return null;
		}

		return ret;
	}

	/**
	 * <p>
	 * 年(yyyy)、月(MM)、日(dd)の文字列を結合します。
	 * </p>
	 * @param year 年(yyyy)
	 * @param month 月(MM)
	 * @param day 日(dd)
	 * @return 年(yyyy)、月(MM)、日(dd)を結合した文字列
	 */
	public static String concatYmd(String year, String month, String day)
	{
		StringBuffer ymd = new StringBuffer();

		if (!isNull(year))
		{
			ymd.append(year);
		}

		if (!isNull(month))
		{
			ymd.append(month);
		}

		if (!isNull(day))
		{
			ymd.append(day);
		}

		String ret = ymd.toString();

		if (0 == ret.length())
		{
			return null;
		}

		return ret;
	}

	/**
	 * <p>
	 * 年(yyyy)、月(MM)の文字列を結合します。
	 * </p>
	 * @param year 年(yyyy)
	 * @param month 月(MM)
	 * @return 年(yyyy)、月(MM)を結合した文字列
	 */
	public static String concatYm(String year, String month)
	{
		StringBuffer ymd = new StringBuffer();

		if (!isNull(year))
		{
			ymd.append(year);
		}

		if (!isNull(month))
		{
			ymd.append(month);
		}

		String ret = ymd.toString();

		if (0 == ret.length())
		{
			return null;
		}

		return ret;
	}

	/**
	 * <p>
	 * 文字列の文字数を算出します。
	 * </p>
	 * @param value 文字数を算出する文字列
	 * @return 文字列の文字数
	 */
	public static int getLength(String value)
	{
		if (isNull(value))
		{
			return 0;
		}

		return value.length();
	}
	
	/**
	 * 文字列を指定されたサイズに調整します。
	 * <br>
	 * @param arg0 調整前の文字列
	 * @param arg1 指定サイズ（バイト数）
	 * @param arg2 文字コード（ＯＳ準拠の場合は""（空）を指定）
	 * @return String 調整後の文字列
	 * @throws UnsupportedEncodingException 文字コード指定にて、例外が発生した場合
	 */
	public static String adjustCharSize(String arg0, int arg1, String arg2) throws UnsupportedEncodingException
	{
		String retStr = "";

		byte[] paraByte = null;

		if (arg0 == null) 
		{
			return retStr;
		}

		if (arg1 <= 0) 
		{
			return retStr;
		}

		// 入力文字列のバイト配列を取得する
		if ("".equals(arg2)) 
		{
			// 文字コードＯＳ準拠
			paraByte = arg0.getBytes();
		}
		else 
		{
			// 文字コード指定
			paraByte = arg0.getBytes(arg2);
		}

		// 入力文字列のバイトサイズを取得する
		int paraByteSize = paraByte.length;

		// 入力文字列のバイトサイズ ≦ 指定サイズの場合
		if (paraByteSize <= arg1) 
		{
			StringBuffer buf = new StringBuffer(arg0);

			// 指定サイズになるまで半角スペースを補充する
			for (int i = paraByteSize; i < arg1; i++) 
			{
				buf.append(" ");
			}

			retStr = buf.toString();
		}
		// 入力文字列のバイトサイズ ＞ 指定サイズの場合
		else 
		{ 
			// 指定サイズ分の文字列を生成する
			if ("".equals(arg2)) 
			{
				// 文字コードＯＳ準拠
				retStr = new String(paraByte, 0, arg1);
			}
			else 
			{
				// 文字コード指定
				retStr = new String(paraByte, 0, arg1, arg2);
			}
		}

		return retStr;
	}
}
