转载

Java实现人民币大写精讲

想要实现人民币大写,在发票等场景中使用?? 1234.56显示为:壹仟贰佰叁拾肆元伍角陆分,那就往下看看吧!

本程序可以实现 0 到 9999 9999 9999.994 以内的人民币大写转换,精确到分

经典测试数据:

0

希望转换出来的结果为:

零元零角零分

1234

希望转换出来的结果为:

壹仟贰佰叁拾肆元零角零分

9999

希望转换出来的结果为:

玖仟玖佰玖拾玖元零角零分

1234.5

希望转换出来的结果为:

壹仟贰佰叁拾肆元伍角零分

1234.9

希望转换出来的结果为:

壹仟贰佰叁拾肆元玖角零分

1234.56

希望转换出来的结果为:

壹仟贰佰叁拾肆元伍角陆分

1234.99

希望转换出来的结果为:

壹仟贰佰叁拾肆元玖角玖分

1234.994

希望转换出来的结果为:

壹仟贰佰叁拾肆元玖角玖分

1234.999

希望转换出来的结果为:

壹仟贰佰叁拾伍元零角零分

999999999999.999

希望转换出来的结果为:

数据过大,无法进行转换,请重新输入!

程序源码如下,含注释:

 package com.tfj.algorithm;  import java.util.Scanner;  public class RenMingBi {     private boolean zero;     String[] strHan = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };     String[] moneyCount = { "", "拾", "佰", "仟" };      RenMingBi() {         zero = false;     }      private String[] divide(double digitalRmbValue) {         // 处理整数         long intPart = (long) (digitalRmbValue);         // 处理小数,把小数转换成整数形式处理,并进行四舍五入,此时小数四舍五入之后为100的应该另外加一层处理         long decimalPart = Math                 .round((double) Math.round((digitalRmbValue - intPart) * 10000) / 100);         // System.out.println("整数部分为:" + intPart + "小数部分为:" + (digitalRmbValue - intPart));         if (decimalPart == 100) {             intPart += 1;         }         // System.out.println("四舍五入之后整数部分为:" + intPart + "小数部分为:" + decimalPart);          String strIntPart = "";         if (intPart == 0)             strIntPart = "0";         else {             strIntPart = "" + intPart;         }          String strDecimalPart = "";         if (decimalPart < 10 && decimalPart >= 0)             strDecimalPart = "0" + decimalPart;         else {             strDecimalPart = "" + decimalPart;         }         // 处理输入为0的时候         if (intPart == 0 && decimalPart == 0) {             zero = true;         }         // System.out.println("准换为String后,整数部分为:" + strIntPart + "小数部分为:" + strDecimalPart);         return new String[] { strIntPart, strDecimalPart };     }      // 用来转换小数部分     private String transDecimal(String str) {         if (str.equals("100") || str.equals("00")) {             return "零角零分";         } else {             String strResult;             char[] strRmb = new char[20];             strRmb = str.toCharArray();             if (strRmb[0] == '0' && strRmb[1] == '0') {                 strResult = "";             } else {                 int dm = strRmb[0] - '0';                 int dn = strRmb[1] - '0';                 strResult = strHan[dm] + "角" + strHan[dn] + "分";             }             return strResult;         }     }      // 用来转换整数部分     private String transInt(String str) {         char[] firstFourBitRmb = new char[20];         firstFourBitRmb = str.toCharArray();         int len = firstFourBitRmb.length;         String strResult = "";         for (int i = 0; i < len; i++) {             /**              * 这里开启之后会显示成通俗易懂的格式,例如1001,会转化为:壹仟零壹元,而不是:壹仟零佰零拾壹元, 但我希望得到的是后面这种,因为发票所需显示的就是后面这种              **/              // if (firstFourBitRmb[i] == '0' && i < len) {             // boolean zeroFlag = false;             // while (i < len && firstFourBitRmb[i] == '0') {             // zeroFlag = true;             // i++;             // }             // if (i != len && zeroFlag == true)             // strResult += "零";             // i--;             // } else {             // int m = firstFourBitRmb[i] - '0';             // strResult += strHan[m] + moneyCount[len - i - 1];             // }             int m = firstFourBitRmb[i] - '0';             strResult += strHan[m] + moneyCount[len - i - 1];         }         return strResult;     }      public String transComb() {         String[] strTempRmb = new String[2];         double strValue = 0D;         Scanner sc = new Scanner(System.in);          System.out.println("请输入具体金额,结果会精确到分:");         strValue = sc.nextDouble();         RenMingBi nr = new RenMingBi();         strTempRmb = nr.divide(strValue);         // 转换小数部分         String result1 = nr.transDecimal(strTempRmb[1]);          // 转换整数部分         String result2 = "";         int len = strTempRmb[0].length();         if (len > 12)             return "数据过大,无法进行转换,请重新输入!";         else {             if (len >= 9) {                 String strBit1 = strTempRmb[0].substring(0, len - 8);                 String strBit2 = strTempRmb[0].substring(len - 8, len - 4);                 String strBit3 = strTempRmb[0].substring(len - 4, len);                 String strResult1 = nr.transInt(strBit1) + "亿";                 String strResult2 = nr.transInt(strBit2) + "万";                 String strResult3 = nr.transInt(strBit3) + "元";                 result2 = strResult1 + strResult2 + strResult3;             } else if (len >= 5) {                 String strBit1 = strTempRmb[0].substring(0, len - 4);                 String strBit2 = strTempRmb[0].substring(len - 4, len);                 String strResult1 = nr.transInt(strBit1) + "万";                 String strResult2 = nr.transInt(strBit2) + "元";                 result2 = strResult1 + strResult2;             } else if (len >= 1) {                 if (nr.zero == true) {                     result2 = "零元";                 } else                     result2 = nr.transInt(strTempRmb[0]) + "元";             }             return result2 + result1;         }     }      public static void main(String[] args) {         RenMingBi rmb = new RenMingBi();         while (true) {             System.out.println(rmb.transComb());         }     } } 

注:输出注释可自行打开,以供测试

运行结果如下:

Java实现人民币大写精讲

正文到此结束
Loading...