金額換算(数字変換)

4318 ワード

/**
 *             
 * 
 * @since version1.0
 */
public class MoneyToChinese {

	public MoneyToChinese() {
		super();
	}

	private final static String HanDigiStr[] = new String[] { " ", " ", " ", " ", " ", " ", " ",
			" ", " ", " " };

	private final static String HanDiviStr[] = new String[] { "", " ", " ", " ", " ", " ", " ", " ",
			" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
			" ", " ", " " };

	/**
	 *               
	 * 
	 * @param String NumStr
	 * @return String
	 */
	public static String PositiveIntegerToHanStr(String NumStr) { //           ,       (     ),      
		String RMBStr = "";
		boolean lastzero = false;
		boolean hasvalue = false; //  、         
		int len, n;
		len = NumStr.length();
		if (len > 15)
			return "    !";
		for (int i = len - 1; i >= 0; i--) {
			if (NumStr.charAt(len - i - 1) == ' ')
				continue;
			n = NumStr.charAt(len - i - 1) - '0';
			if (n < 0 || n > 9)
				return "        !";

			if (n != 0) {
				if (lastzero)
					RMBStr += HanDigiStr[0]; //          ,      
				//                
				if (!(n == 1 && (i % 4) == 1 && i == len - 1)) //             
					RMBStr += HanDigiStr[n];
				RMBStr += HanDiviStr[i]; //        ,    
				hasvalue = true; //          

			} else {
				if ((i % 8) == 0 || ((i % 8) == 4 && hasvalue)) //               
					RMBStr += HanDiviStr[i]; // “ ” “ ”
			}
			if (i % 8 == 0)
				hasvalue = false; //             
			lastzero = (n == 0) && (i % 4 != 0);
		}

		if (RMBStr.length() == 0)
			return HanDigiStr[0]; //       "0",  " "
		return RMBStr;
	}

	/**
	 *                 (   ¥)
	 * 
	 * @param double val(     )
	 * @return String(                )
	 */
	public static String NumToRMBStr(double val) {
		String SignStr = "";
		String TailStr = "";
		long fraction, integer;
		int jiao, fen;

		if (val < 0) {
			val = -val;
			SignStr = " ";
		}
		if (val > 99999999999999.999 || val < -99999999999999.999)
			return "      !";
		//       
		long temp = Math.round(val * 100);
		integer = temp / 100;
		fraction = temp % 100;
		jiao = (int) fraction / 10;
		fen = (int) fraction % 10;
		if (jiao == 0 && fen == 0) {
			TailStr = " ";
		} else {
			TailStr = HanDigiStr[jiao];
			if (jiao != 0)
				TailStr += " ";
			if (integer == 0 && jiao == 0) //         
				TailStr = "";
			if (fen != 0)
				TailStr += HanDigiStr[fen] + " ";
		}

		//              ,0.03   “  ”   “    ”
		// if( !integer ) return SignStr+TailStr;

		return "¥" + SignStr + PositiveIntegerToHanStr(String.valueOf(integer))
				+ " " + TailStr;
	}

	/**
	 *                 
	 * 
	 * @param double val(     )
	 * @return String(                )
	 */
	public static String NumToCNMoney(double val) {
		String SignStr = "";
		String TailStr = "";
		long fraction, integer;
		int jiao, fen;

		if (val < 0) {
			val = -val;
			SignStr = " ";
		}
		if (val > 99999999999999.999 || val < -99999999999999.999)
			return "      !";
		//       
		long temp = Math.round(val * 100);
		integer = temp / 100;
		fraction = temp % 100;
		jiao = (int) fraction / 10;
		fen = (int) fraction % 10;
		if (jiao == 0 && fen == 0) {
			TailStr = " ";
		} else {
			TailStr = HanDigiStr[jiao];
			if (jiao != 0)
				TailStr += " ";
			if (integer == 0 && jiao == 0) //         
				TailStr = "";
			if (fen != 0)
				TailStr += HanDigiStr[fen] + " ";
		}

		//              ,0.03   “  ”   “    ”
		// if( !integer ) return SignStr+TailStr;

		return SignStr + PositiveIntegerToHanStr(String.valueOf(integer))
				+ " " + TailStr;
	}
	
	public static void main(String[] args) {
		String amount = MoneyToChinese.NumToCNMoney(456465145);
		System.out.println(amount);
		String rmb = MoneyToChinese.NumToRMBStr(8754);
		System.out.println(rmb);
	}
}