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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. public static void main(String[] args) {
  2.                 System.out.println(changeToCN(101000001010D));

  3.         }
  4.         public static String changeToCN(double money){
  5.                 //大写数字
  6.                 String[] big = new String[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
  7.                 //段位内的单位
  8.                 String[] unit = new String[]{"","拾","佰","仟"};
  9.                 //段位单位
  10.                 String[] un = new String[]{"","萬","亿"};
  11.                 //只取2位小数
  12.                 String value = String.valueOf((long)(money*100));
  13.                 //整数部分
  14.                 String iValue = value.substring(0, value.length()-2);
  15.                 //小数部分
  16.                 String dValue = value.substring(value.length()-2);
  17.                
  18.                 //构造小数部分的大写数字
  19.                 String dValueSb = "";
  20.                 //如果两位小数都是0
  21.                 if(dValue.equals("00")){
  22.                         //添加“整”字
  23.                         dValueSb +="整";
  24.                 //如果小数点后1位是零
  25.                 }else if(dValue.charAt(0)=='0'){
  26.                         //添加格式为:零 "几" 分                 
  27.                         dValueSb +=big[0]+big[dValue.charAt(1)-'0']+"分";
  28.                 }else{
  29.                         //如果小数点后2位都不是零,添加格式为:"几"角 "几"分
  30.                         dValueSb +=big[dValue.charAt(0)-'0']+"角"+big[dValue.charAt(1)-'0']+"分";
  31.                 }
  32.                
  33.                 //构造整数部分的大写数字
  34.                 String iValueSb = "";
  35.                 //将整数部分拆散
  36.                 char[] iChar = iValue.toCharArray();
  37.                 // 标志当前位的上一位是否为有效0位(如万位的0对千位无效)
  38.                 boolean preZero = false;
  39.                 // 连续出现0的次数
  40.                 byte zeroTimes = 0;
  41.                 //对每位数进行操作
  42.                 for(int i=0;i<iChar.length;i++){
  43.                         //段位,4位数为一个段位,0段位表示万以下,1段位表示万,2段位表示亿
  44.                         int dex = (iChar.length-i-1)/4;
  45.                         //段位内的位置,0代表个,1代表十,2代表百,3代表千
  46.                         int index = (iChar.length-i-1)%4;
  47.                         //如果当前位置的数是0
  48.                         if(iChar[i]=='0'){
  49.                                 //记录前位是0
  50.                                 preZero = true;
  51.                                 //连续出现的0增加1
  52.                                 zeroTimes++;
  53.                                 //段位内个位数是0,只要段位内4位数不全是0,则添加段位单位:万、亿
  54.                                 if(index==0&&zeroTimes<4){
  55.                                         iValueSb +=un[dex];
  56.                                         // 不管上一位是否为0,置为无效0位
  57.                                         preZero = false;
  58.                                 }
  59.                                
  60.                         }else{
  61.                                 zeroTimes = 0;
  62.                                 // 当出现不是零的数,首先查看上一位是否为有效0位
  63.                                 if (preZero) {
  64.                                         // 添加零,并且只会在此处添加一次零,不会出现重复零
  65.                                         iValueSb += big[0];
  66.                                         //复位
  67.                                         preZero = false;
  68.                                 }
  69.                                 //添加该数字的大写
  70.                                 iValueSb += big[iChar[i]-'0'];
  71.                                 //如果是段位内的个位,添加段位单位:万、亿
  72.                                 if(index==0){
  73.                                         iValueSb +=un[dex];
  74.                                 //如果不是,添加段位内单位:十、百、千
  75.                                 }else{
  76.                                         iValueSb += unit[index];
  77.                                 }
  78.                         }
  79.                 }

  80.                 // 如果整数部分存在,则有圆的字样
  81.                 if (iValueSb.length() > 0)
  82.                         iValueSb += '圆';
  83.                
  84.                 // 返回拼接起来的值
  85.                 return iValueSb + dValueSb;
  86.         }
复制代码

5 个回复

倒序浏览
big[dValue.charAt(0)-'0'],请问这里边dValue.charAt(0)-'0'是什么意思
回复 使用道具 举报
厉害啊。。。
回复 使用道具 举报
菜鸟小白 发表于 2016-5-20 22:16
big[dValue.charAt(0)-'0'],请问这里边dValue.charAt(0)-'0'是什么意思

将字符转换成数字,char(At)得到的是字符不是int型数字所以要减去‘0的字符值’得到0
回复 使用道具 举报
看了略长   之前也做了这道题      上网搜索了一下    感觉自己就是个弱智
  1. public class Test9 {

  2.         /**
  3.          * 第九题: 金额转换,阿拉伯数字转换成中国传统形式。 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
  4.          *
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 //测试
  9.                 System.out.println(converse(640_0000_0023L));
  10.         }

  11.         private static String converse(long num) {
  12.                 //建立汉语数字数组
  13.                 char[] chineseNum = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
  14.                 //建立汉语量次数组
  15.                 char[] unite = { '圆', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰',
  16.                                 '仟' };
  17.                 int index = 0;
  18.                 long lastNum;
  19.                 //从尾到头将数字按位置转换成汉语数字,并在后面加入量词.
  20.                 StringBuffer sb = new StringBuffer();
  21.                 while (num != 0) {
  22.                         lastNum = num % 10;
  23.                         sb.insert(0, unite[index++]);
  24.                         sb.insert(0, chineseNum[(int) lastNum]);
  25.                         num /= 10;
  26.                 }
  27.                 //使用正则表达式去重
  28.                 return sb.toString().replaceAll("零[拾佰仟]", "零").replaceAll("零 *亿", "亿")
  29.                                 .replaceAll("零{4}万", "零").replaceAll("零*万", "万")
  30.                                 .replaceAll("零+圆", "圆").replaceAll("零+", "零")
  31.                                 + "整";
  32.         }

  33. }
复制代码
回复 使用道具 举报
父类使用方法的时候其实调用的是子类重写父类的方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马