金额转换成RMB大写

来源:互联网 发布:淘宝订单可以不清洗吗 编辑:程序博客网 时间:2024/05/14 09:12
public class TestToChinessCurrency {public static void main(String[] args) {TestToChinessCurrency tcc = new TestToChinessCurrency();System.out.println(tcc.transfNumToCString("108010001800.01"));}/** * 将数字转换成大写金额 * @param number * 待转换的数字 * @return * 大写金额 */private String transfNumToCString(String number) {// 校验是否数字try {Double.parseDouble(number);} catch (NumberFormatException e) {return null;}// 转换操作try {String result = ""; // 返回值// 是否含有小数部分,默认falseboolean bHasDot = false;int dotIdx = number.indexOf(".");if (dotIdx == -1) {// 没有小数点,将小数点的位置设置成末尾dotIdx = number.length();} else {bHasDot = true;}// 获取整数部分、小数部分String beforeDot = number.substring(0, dotIdx).trim();String afterDot = number.substring(dotIdx);/* 处理整数部分 *//** * 圆、拾圆、佰圆、仟圆、万、拾万、佰万、仟万、亿、拾亿、佰亿、仟亿 * 分为3大级:"圆", "万", "亿",每大级下又有4小级 */String[] unit = { "圆", "万", "亿"};String[] subunit = { "拾", "佰", "仟" };// 定义所需变量int count = 0;                // 循环处理计数器int subunitCnt = 0;           // 小级计数器int unitCnt = 0;              // 大级计数器char oldC = '3';              // 上一处理字符,默认3char cc = '0';                // 当前处理字符,默认0String zero = "零";           // 0转换字符int len = beforeDot.length(); // 整数部分长度boolean hasN = false;         // 一次小级循环处理下来是否有非0数字boolean oldHasN = false;      // 上一次小级循环处理下来是否有非0数字boolean allZero = true;       // 是否全零// 开始让,加上大级最低单位,result="圆"result = unit[0] + result;    // 循环处理每位数for (count = 0; count < len; ++count) {// 如果小级计数器到0且循环计数器非0,即万级、亿级开始if ((subunitCnt == 0) && (count != 0)) {// 上一大级循环没有非0数字if (!hasN) { // 如果亿级,这时万级都是0,截去result中“万”if (unitCnt % 2 == 0) {result = result.substring(1);}} else if (oldC == '0') {// 上一大级循环存在非0数字,且上一处理位0,即小级循环中仟为为零result = zero + result;}// 加上本次大级单位result = unit[unitCnt] + result;// 先将hasN值赋予oldHasN,然后重置hasN为falseoldHasN = hasN;hasN = false;}// 从个位开始处理cc = beforeDot.charAt(len - count - 1);// 上一处理字符、当前处理字符是否都为0,且本次大级循环已出现非0数字if (oldC == '0' && cc != oldC && hasN) {result = zero + result;}// 当前处理字符不为0if (cc != '0') {// 小级到“拾”及以后,加上小级单位if (subunitCnt != 0) {result = subunit[subunitCnt - 1] + result;}// 当前数字转换成大写String ccStr = this.convertNum(cc);// 连接上result = ccStr + result;// hasN应置为truehasN = true;// allZero应置为falseallZero = false;}// 当前处理字符cc赋予oldColdC = cc;// 小级计数器++++subunitCnt;// 如果小级计数器到4,则大级计数器++且小级计数器置零if (subunitCnt == 4) {++unitCnt;subunitCnt = 0;}}// 对上述处理结果再处理if (allZero) {// 全0,对result赋值result = "零圆";} else {// 截去result第一个字符可能出现的零int zeroCnt = 0;// 亿、万级全是0(不需要考虑第一级)if (!hasN) {++zeroCnt;if (!oldHasN) {++zeroCnt;}}if (zeroCnt != 0) {result = result.substring(zeroCnt);}// 如果result第一个字符还是零,截去,38646对应“零”if (result.charAt(0) == (char)38646) {result = result.substring(1);}}// 处理小数部分if (bHasDot) {// 干掉小数点afterDot = afterDot.substring(1).trim();// 小数部分单位 String[] cornunit = { "角", "分" };// 小数部分长度,最多两位len = afterDot.length();// 用于存小数数值char[] corn = new char[2];// 角corn[0] = afterDot.charAt(0);// 分,不存在赋值0if (len > 1) {corn[1] = afterDot.charAt(1);} else {corn[1] = '0';}// 如果角、分都为0,为整圆if (corn[0] == '0' && corn[1] == '0') {return result += "整";}// 处理小数部分之前,如果整数部分全0, 先置result为空串if (allZero) {result = "";}for (int i = 0; i < 2; ++i) {// 处理角、分char curchar = corn[i];String curStr = this.convertNum(curchar);result = result + curStr;// 角if (i == 0) {if (curchar != '0') {// 存在角值,加上单位result = result + cornunit[0];} else if (allZero) {// 没角值,且整数部分全0,置result为空串result = "";}}// 分,肯定存在值,否则到不了这if (i == 1) {result = result + cornunit[1];}}} else {result = result + "整";}return result;} catch (Exception e) {e.printStackTrace();}return null;}/** * 将1、2、3...转换成壹、贰、叁 * @param num * 数字 * @return * 大写中文数字 */private String convertNum(char num) {String numStr = "";switch (num) {case '1':numStr = "壹";break;case '2':numStr = "贰";break;case '3':numStr = "叁";break;case '4':numStr = "肆";break;case '5':numStr = "伍";break;case '6':numStr = "陆";break;case '7':numStr = "柒";break;case '8':numStr = "捌";break;case '9':numStr = "玖";case '0':numStr = "零";}return numStr;}}

0 0