A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一晚上就写了这么个程序到现在,虽然冗长,毕竟做出来了,鼓励下自己
  1. public class Test10 {

  2.         @SuppressWarnings("resource")
  3.         public static void main(String[] args) throws Exception{
  4.                
  5.                 //定义一个双列集合一一对应数字0-9
  6.                 Map<String, String> map=new HashMap<String, String>();
  7.                 map.put("0", "零");
  8.                 map.put("1", "壹");
  9.                 map.put("2", "貳");
  10.                 map.put("3", "叁");
  11.                 map.put("4", "肆");
  12.                 map.put("5", "伍");
  13.                 map.put("6", "陸");
  14.                 map.put("7", "柒");
  15.                 map.put("8", "捌");
  16.                 map.put("9", "玖");
  17.                
  18.                 //定义交互方式,键盘键入一列数字
  19.                 Scanner sc = new Scanner(System.in);
  20.                 System.out.println("金额转换,请输入一串阿拉伯数字,转化为中文传统形式(本功能设计范围小于1万亿):");
  21.                 String str = sc.nextLine();
  22.                
  23.                 //定义可变字符串以便后续增删字符
  24.                 StringBuffer stb = new StringBuffer();
  25.                
  26.                 //首先把所有数字转换为对应中文并存入字符串缓冲区
  27.                 for(int i=0;i<str.length();i++)
  28.                 {
  29.                         char in=str.charAt(i);
  30.                         String zh=map.get(in+"");               
  31.                         stb.append(zh);               
  32.                 }
  33.                 //----------以上代码完成了数字转汉字的功能
  34.                
  35.                
  36.                 //----------以下代码完成添加单位的功能
  37.                
  38.                 int j=0;
  39.                 for(int k=str.length();k>0;k=k-4)
  40.                 {
  41.                         String[] arr={"元整","万","亿","拾","佰","仟"};
  42.                         stb.insert(k, arr[j++]);
  43.                         if(k-1>0)
  44.                         {
  45.                                 stb.insert(k-1, arr[3]);
  46.                         }
  47.                         if(k-2>0)
  48.                         {
  49.                                 stb.insert(k-2, arr[4]);
  50.                         }
  51.                         if(k-3>0)
  52.                         {
  53.                                 stb.insert(k-3, arr[5]);
  54.                         }
  55.                                
  56.                 }

  57.                
  58.                 //以下代码完成修正不合格语法功能
  59.                 for(int k=0;k<stb.length()-1;k++)
  60.                 {

  61.                         if(stb.charAt(k)=="零".charAt(0)&&(stb.charAt(k+1)=="元整".charAt(0)))
  62.                         {
  63.                                 stb.deleteCharAt(k);
  64.                                 k-=2;
  65.                         }
  66.                         if(stb.charAt(k)=="零".charAt(0)&&(stb.charAt(k+1)=="拾".charAt(0)))
  67.                         {
  68.                                 stb.deleteCharAt(k+1);
  69.                                 k--;
  70.                         }
  71.                         if(stb.charAt(k)=="零".charAt(0)&&(stb.charAt(k+1)=="佰".charAt(0)))
  72.                         {
  73.                                 stb.deleteCharAt(k+1);
  74.                                 k--;
  75.                         }
  76.                         if(stb.charAt(k)=="零".charAt(0)&&(stb.charAt(k+1)=="仟".charAt(0)))
  77.                         {
  78.                                 stb.deleteCharAt(k+1);
  79.                                 k--;
  80.                         }
  81.                         if(stb.charAt(k)=="零".charAt(0)&&(stb.charAt(k+1)=="万".charAt(0)))
  82.                         {
  83.                                 stb.deleteCharAt(k);
  84.                                 k-=2;
  85.                         }
  86.                         if(stb.charAt(k)=="零".charAt(0)&&(stb.charAt(k+1)=="亿".charAt(0)))
  87.                         {
  88.                                 stb.deleteCharAt(k);
  89.                                 k-=2;
  90.                         }
  91.                 }
  92.                
  93.                
  94.                 //以下完成是去除相邻零的功能
  95.                 for(int p=0;p<stb.length()-1;p++)
  96.                 {
  97.                         if(stb.charAt(p)=="零".charAt(0)&&(stb.charAt(p+1)=="零".charAt(0)))
  98.                         {
  99.                                 stb.deleteCharAt(p+1);
  100.                                 p--;
  101.                         }
  102.                 }
  103.                
  104.                
  105.                 //以下功能实现日常叫法习惯的功能
  106.                 for(int d=0;d<stb.length();d++)
  107.                 {
  108.                         if(stb.charAt(d)=="亿".charAt(0)&&(stb.charAt(d+1)=="仟".charAt(0)))
  109.                         {
  110.                                 stb.deleteCharAt(d+1);
  111.                         }
  112.                         if(stb.charAt(d)=="亿".charAt(0)&&(stb.charAt(d+1)=="佰".charAt(0)))
  113.                         {
  114.                                 stb.deleteCharAt(d+1);
  115.                         }
  116.                         if(stb.charAt(d)=="亿".charAt(0)&&(stb.charAt(d+1)=="拾".charAt(0)))
  117.                         {
  118.                                 stb.deleteCharAt(d+1);
  119.                         }
  120.                         if(stb.charAt(d)=="亿".charAt(0)&&(stb.charAt(d+1)=="万".charAt(0)))
  121.                         {
  122.                                 stb.deleteCharAt(d+1);
  123.                         }
  124.                         if(stb.charAt(d)=="仟".charAt(0)&&(stb.charAt(d+1)=="佰".charAt(0)))
  125.                         {
  126.                                 stb.deleteCharAt(d+1);
  127.                         }
  128.                         if(stb.charAt(d)=="仟".charAt(0)&&(stb.charAt(d+1)=="拾".charAt(0)))
  129.                         {
  130.                                 stb.deleteCharAt(d+1);
  131.                         }
  132.                         if(stb.charAt(d)=="佰".charAt(0)&&(stb.charAt(d+1)=="拾".charAt(0)))
  133.                         {
  134.                                 stb.deleteCharAt(d+1);
  135.                         }
  136.                        
  137.                         if(stb.charAt(d)=="亿".charAt(0)&&(stb.charAt(d+1)!="零".charAt(0)))
  138.                         {
  139.                                 stb.insert(d+1, "零");
  140.                         }
  141.                         if(stb.charAt(d)=="万".charAt(0)&&(stb.charAt(d+1)!="零".charAt(0)))
  142.                         {
  143.                                 stb.insert(d+1, "零");
  144.                         }
  145.                 }
  146.                
  147.                
  148.                 //以下属于调试时候的代码修正
  149.                 for(int f=0;f<stb.length();f++)
  150.                 {
  151.                         if(stb.charAt(f)=="零".charAt(0)&&(stb.charAt(f+1)=="元整".charAt(0)))
  152.                         {
  153.                                 stb.deleteCharAt(f);
  154.                                 f--;
  155.                         }
  156.                 }
  157.                
  158.                
  159.                 //打印转换完成的字符串
  160.                 System.out.println(stb.toString());
  161.                
  162.         }
  163. }

复制代码


感觉好像还有bug,测试出来请指明;谁有简明的算法可以相互交流

16 个回复

倒序浏览
用查表法然后用正则处理字符串比较简单
  1. import java.util.Scanner;

  2. //接收键盘录入的一个整数转化为金额形式
  3. /*//思路:读取键盘录入,建立查表数组进行查表,存入字符串缓存区,用正则来处理不合格格式
  4. 最大到万亿*/
  5. public class DigitalConversion {

  6.         public static void main(String[] args) {
  7.                 //接收键盘录入的一个整数
  8.                 Scanner in=new Scanner(System.in);
  9.                 //定义接收类型为一个Long的数
  10.                 Long digital=in.nextLong();
  11.                 System.out.println(conversion(digital));
  12.         }
  13.         //定义查表功能,返回字符串
  14.         public static String conversion(Long num)
  15.         {
  16.                 //定义大写查表数组
  17.                 char[] arr1={'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
  18.                 //定义金额数组
  19.                 String[] arr2={"","整","拾","佰","仟","萬","拾","佰","仟","亿","拾","佰","仟","萬"};
  20.                 //获取数字的字符数组
  21.                 char[] arr=(num+"").toCharArray();
  22. //                创建字符缓存区
  23.                 StringBuilder sb=new StringBuilder();
  24.                 //反向遍历数组
  25.                 for(int i=0;i<arr.length;i++)
  26.                 {
  27.                         //将每个字符转为数字
  28.                         int count=Integer.parseInt(arr[i]+"");
  29.                         //查表,对应的中文数字、金额数字
  30.                         sb.append(arr1[count]+arr2[arr.length-i]);
  31.                 }
  32.                 //处理不符合规则字符串,零亿、零萬、改为亿、萬
  33.                
  34.                 String str1=sb.toString().replaceAll("零[仟佰拾]","零");
  35.                 str1=str1.replaceAll("零+", "零");
  36.                 str1=str1.replaceAll("零+亿", "亿").replaceAll("零+萬", "萬").replaceAll("零+整", "整");
  37.                 str1=str1.replaceAll("亿萬", "萬");
  38.                 return str1;
  39.         }

  40. }
复制代码
回复 使用道具 举报
还是用正则方便:
  1.   public static void main(String[] args) {
  2.         // 测试
  3.         long L = 101000001010L;
  4.         System.out.println(convert(L));
  5.     }

  6.     public static String convert(long number) {
  7.         // 定义字符数组存储中国数字写法格式
  8.         final char[] chinese = new char[] { '零', '壹', '贰', '叁', '肆', '伍',
  9.                 '陆', '柒', '捌', '玖' };
  10.         // 定义字符数组存储中国数字的单位
  11.         final char[] units = new char[] { '圆', '拾', '佰', '仟', '万', '拾', '佰',
  12.                 '仟', '亿', '拾', '佰', '仟' };
  13.         // 定义一个字符串缓冲区对字符进行存储
  14.         StringBuilder sb = new StringBuilder();
  15.         int index = 0;
  16.         long lastNumber = 0;
  17.         while (number != 0) {
  18.             lastNumber = number % 10;
  19.             sb.insert(0, units[index++]);
  20.             sb.insert(0, chinese[(int) lastNumber]);
  21.             number = number / 10;
  22.         }
  23.         // 去零操作,通过正则表达式
  24.         return sb.toString().replaceAll("零[拾佰仟]", "零").replaceAll("零+亿", "亿")
  25.                 .replaceAll("零{4}万", "零").replaceAll("零+万", "万")
  26.                 .replaceAll("零+圆", "圆").replaceAll("零+", "零")
  27.                 + "整";
  28.     }
  29. }
复制代码

回复 使用道具 举报
本来我也想发一个自己写的,看到楼上俩大神不好意思发了,还是继续学去吧..:L
回复 使用道具 举报
邓士林 发表于 2015-1-10 10:26
还是用正则方便:

抛砖引玉哪,你们的简洁多了
回复 使用道具 举报
邓士林 发表于 2015-1-10 10:26
还是用正则方便:

抛砖引玉哪,你们的简洁多了
回复 使用道具 举报
是考枚举的吧?
回复 使用道具 举报
jant60 中级黑马 2015-1-10 12:53:22
8#
用到集合了,,想法很独特,欣赏中
回复 使用道具 举报
学习下LZ
回复 使用道具 举报
jant60 发表于 2015-1-10 12:53
用到集合了,,想法很独特,欣赏中

独特没有用,代码不简洁,我看的都头大
回复 使用道具 举报
godmmm 发表于 2015-1-10 10:14
用查表法然后用正则处理字符串比较简单

零+还有零+亿中加号怎么产生的?
回复 使用道具 举报
godmmm 发表于 2015-1-10 10:14
用查表法然后用正则处理字符串比较简单

零+还有零+亿中加号怎么产生的?
回复 使用道具 举报
phil 中级黑马 2015-1-10 20:31:19
13#
学习一下楼上几位大神!!
回复 使用道具 举报
这代码,我第一次我也是用各种循环加判断,特别麻烦。
后来知道有个东西叫正则表达式。
回复 使用道具 举报
当我遇上你 发表于 2015-1-10 20:13
零+还有零+亿中加号怎么产生的?

这个是正则里面的数量词,零+ 表示有一个或多个零
回复 使用道具 举报
大神厉害!
回复 使用道具 举报
学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马