java实现人民币数字和大写转换

avatar 2017年03月19日22:35:10 1 3811 views
博主分享免费Java教学视频,B站账号:Java刘哥
直接上代码了,下面代码经测试完美。能解决数字中带0的特例

方法一、

  1. /*文件名:RMB.java*/
  2. import java.math.BigDecimal;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Scanner;
  6.     public class RMB{
  7.         public static void main(String[] args) throws Exception {
  8.             Scanner sc = new Scanner(System.in);
  9.             while(true){
  10.                 System.out.print("请输入需要转换的数字:");
  11.                 String i = sc.nextLine();
  12.                 System.out.println(digitUppercase(i));
  13.             }
  14.         }
  15.         /** 
  16.          * 处理的最大数字达千万亿位 精确到分 
  17.          * @return 
  18.          */
  19.         public static String digitUppercase(String num) throws Exception{
  20.             String fraction[] = {"角""分"};
  21.             String digit[] = { "零""壹""贰""叁""肆""伍""陆""柒""捌""玖" };
  22.             String unit1[] = {"""拾""佰""仟"};//把钱数分成段,每四个一段,实际上得到的是一个二维数组  
  23.             String unit2[] = {"元""万""亿","万亿"}; //把钱数分成段,每四个一段,实际上得到的是一个二维数组  
  24.             BigDecimal bigDecimal =  new BigDecimal(num);
  25.             bigDecimal=bigDecimal.multiply(new BigDecimal(100));
  26.     //        Double bigDecimal = new Double(name*100);     存在精度问题 eg:145296.8  
  27.             String strVal = String.valueOf(bigDecimal.toBigInteger());
  28.             String head = strVal.substring(0,strVal.length()-2);         //整数部分  
  29.             String end = strVal.substring(strVal.length()-2);              //小数部分  
  30.             String endMoney="";
  31.             String headMoney = "";
  32.             if("00".equals(end)){
  33.                 endMoney = "整";
  34.             }else{
  35.                 if(!end.substring(0,1).equals("0")){
  36.                     endMoney+=digit[Integer.valueOf(end.substring(0,1))]+"角";
  37.                 }else if(end.substring(0,1).equals("0") && !end.substring(1,2).equals("0")){
  38.                     endMoney+= "零";
  39.                 }
  40.                 if(!end.substring(1,2).equals("0")){
  41.                     endMoney+=digit[Integer.valueOf(end.substring(1,2))]+"分";
  42.                 }
  43.             }
  44.             char[] chars = head.toCharArray();
  45.             Map<String,Boolean> map = new HashMap<String,Boolean>();//段位置是否已出现zero  
  46.             boolean zeroKeepFlag = false;//0连续出现标志  
  47.             int vidxtemp = 0;
  48.             for(int i=0;i<chars.length;i++){
  49.                 int idx = (chars.length-1-i)%4;//段内位置  unit1  
  50.                 int vidx = (chars.length-1-i)/4;//段位置 unit2  
  51.                 String s = digit[Integer.valueOf(String.valueOf(chars[i]))];
  52.                 if(!"零".equals(s)){
  53.                     headMoney += s +unit1[idx]+unit2[vidx];
  54.                     zeroKeepFlag = false;
  55.                 }else if(i==chars.length-1 || map.get("zero"+vidx)!=null){
  56.                     headMoney += "" ;
  57.                 }else{
  58.                     headMoney += s;
  59.                     zeroKeepFlag = true;
  60.                     map.put("zero"+vidx,true);//该段位已经出现0;  
  61.                 }
  62.                 if(vidxtemp!=vidx || i==chars.length-1){
  63.                     headMoney = headMoney.replaceAll(unit2[vidx],"");
  64.                     headMoney+=unit2[vidx];
  65.                 }
  66.                 if(zeroKeepFlag && (chars.length-1-i)%4==0){
  67.                     headMoney = headMoney.replaceAll("零","");
  68.                 }
  69.             }
  70.             return headMoney+endMoney;
  71.         }
  72.     }

方法二、

  1. /*文件名:RMB.java*/
  2. import java.text.DecimalFormat;
  3. import java.util.Scanner;
  4. public class RMB {
  5.     public static String toChineseCurrency(Number o) {
  6.         String s = new DecimalFormat("#.00").format(o);  //格式化数字
  7.         System.out.println(s);
  8.         s = s.replaceAll("\\.""");
  9.         char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
  10.         String unit = "仟佰拾兆仟佰拾亿仟佰拾万仟佰拾元角分";
  11.         int l = unit.length();
  12.         StringBuffer sb = new StringBuffer(unit);
  13.         for (int i = s.length() - 1; i >= 0; i--)
  14.             sb = sb.insert(l - s.length() + i, digit[(s.charAt(i) - 0x30)]);
  15.         s = sb.substring(l - s.length(), l + s.length());
  16.         s = s.replaceAll("零[拾佰仟]""零").replaceAll("零{2,}""零").replaceAll("零([兆万元])""$1").replaceAll("零[角分]""");
  17.         if (s.endsWith("角"))
  18.             s += "零分";
  19.         if (!s.contains("角") && !s.contains("分") && s.contains("元"))
  20.             s += "整";
  21.         if (s.contains("分") && !s.contains("整") && !s.contains("角"))
  22.             s = s.replace("元""元零");
  23.         return s;
  24.     }
  25.     public static void main(String[] args) {
  26.         Scanner s = new Scanner(System.in);
  27.         System.out.println("请输入人民币金额:");
  28.         double number = 1;
  29.         while (number > 0.000000001) {
  30.             number = s.nextDouble();
  31.             System.out.println(toChineseCurrency(new Double(number)));
  32.         }
  33.     }
  34. }
  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:1   待审核评论数:0
  1. avatar 星空游戏

    沙发