package com.test.util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public final class ChangeRMB {
// 每个数字对应的大写
private static final String[] num = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
"柒", "捌", "玖", };
// 从低到高排列的单位
private static final String[] bit = { "圆", "拾", "佰", "仟", "万", "拾", "佰",
"仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" };
// 金额里面的角和分
private static final String[] jf = { "角", "分" };
/**
* 处理金额的整数部分,返回"...圆整"
*
* @param integer
* @return String
* @throws Exception
*/
public static String praseUpcaseRMB(String integer) throws Exception {
StringBuilder sbdr = new StringBuilder("");
int j = integer.length();
if (j > bit.length) {
throw new Exception("\n只能处理亿万亿以内的数据(含亿万亿)!");
}
char[] rmb = integer.toCharArray();
for (int i = 0; i < rmb.length; i++) {
int numLocate = Integer.parseInt("" + rmb[i]); // 大写数字位置
int bitLocate = j - 1 - i; // 数字单位的位置
/*
* 连续大写零只添加一个
*/
if (numLocate == 0) {
if (!sbdr.toString().endsWith(num[0])) {
sbdr.append(num[numLocate]);
}
continue;
}
/*
* 下面的if语句保证 10065004583.05-->壹佰亿陆仟伍佰万肆仟伍佰捌拾叁圆零伍分
*/
if (bit[bitLocate].equals("仟")) {
String s = sbdr.toString();
if (!s.endsWith(bit[bitLocate + 1]) && s.length() > 0) {
if (s.endsWith(num[0])) {
sbdr.deleteCharAt(sbdr.length() - 1);
}
sbdr.append(bit[bitLocate + 1]);
}
}
sbdr.append(num[numLocate]);
sbdr.append(bit[bitLocate]);
}// end for
/*
* 去掉结尾"零"后,补全
*/
if (sbdr.toString().endsWith(num[0])) {
sbdr.deleteCharAt(sbdr.length() - 1);
sbdr.append("圆整");
} else {
sbdr.append("整");
}
return sbdr.toString();
}
/**
* 处理带小数的金额,整数部分交由上一个方法处理,小数部分自己处理
*
* @param integer
* @param decimal
* @return String
* @throws Exception
*/
public static String praseUpcaseRMB(String integer, String decimal)
throws Exception {
String ret = ChangeRMB.praseUpcaseRMB(integer);
ret = ret.split("整")[0]; // 处理整数部分
StringBuilder sbdr = new StringBuilder("");
sbdr.append(ret);
char[] rmbjf = decimal.toCharArray();
for (int i = 0; i < rmbjf.length; i++) {
int locate = Integer.parseInt("" + rmbjf[i]);
if (locate == 0) {
if (!sbdr.toString().endsWith(num[0])) {
sbdr.append(num[locate]);
}
continue;
}
sbdr.append(num[locate]);
sbdr.append(jf[i]);
}
return sbdr.toString();
}
/**
* 将double形式的字符串(有两位小数或无小数)转换成人民币的大写格式
*
* @param doubleStr
* @return String
* @throws Exception
*/
public static String doChangeRMB(String doubleStr) throws Exception {
String result = null;
if (doubleStr.contains(".")) { // 金额带小数
int dotloc = doubleStr.indexOf(".");
int strlen = doubleStr.length();
String integer = doubleStr.substring(0, dotloc);
String decimal = doubleStr.substring(dotloc + 1, strlen);
result = ChangeRMB.praseUpcaseRMB(integer, decimal);
} else { // 金额是整数
String integer = doubleStr;
result = ChangeRMB.praseUpcaseRMB(integer);
}
return result;
}
/**
* 将double数值(有两位小数或无小数)转换成人民币的大写格式
*
* @param rmbDouble
* @return String
* @throws Exception
*/
public static String doChangeRMB(double rmbDouble) throws Exception {
String result = null;
double theInt = Math.rint(rmbDouble);
if (theInt > rmbDouble) {
theInt -= 1;
}
double theDecimal = rmbDouble - theInt;
String integer = new Long((long) theInt).toString();
String decimal = "" + Math.round(theDecimal * 100);
if (decimal.equals("0")) {
result = ChangeRMB.praseUpcaseRMB(integer);
} else {
result = ChangeRMB.praseUpcaseRMB(integer, decimal);
}
return result;
}
public static void main(String[] args) throws Exception {
System.out.print("输入小写人民币金额:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String in = br.readLine();
String result = ChangeRMB.doChangeRMB(in);
System.out.println("\n" + "------------转换结果------------");
System.out.println(result);
double d = 54628569856.68;
String ret = ChangeRMB.doChangeRMB(d);
System.out.println("\n" + "------------转换结果------------");
System.out.println(ret);
}
}