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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zfgrinm 中级黑马   /  2015-3-8 09:29  /  987 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima;
  2. /*
  3. *
  4. 10、  金额转换,阿拉伯数字转换成中国传统形式。

  5. 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
  6. */
  7. public class Test10 {

  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                 double d=101000001010.12;
  11.                 System.out.println(getChineseMoney(d));
  12.                
  13.                
  14.         }
  15.         /*
  16.          * 金额转换函数:
  17.          * 将金额粉整数和小数部分,小数部分好读,整数部分转为字符串并反转,这样从左往右读取时和单位变化一直,便于读取单位;
  18.          * 每四维分一段,每个数字读取其大写数字和对应的段中单位,并在每一段加段单位;
  19.          * 最后通过正则和字符串的操作去除多余的大写数字。
  20.          *
  21.          */
  22.         public static String getChineseMoney(double d){
  23.                
  24.                 String [] numbers={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};//建立每个数字的大写数组
  25.                 String [] units={"","拾","佰","仟"};//每一段中的单位
  26.                 String [] divs={"","万","亿"};//每一段的单位(只考虑千亿以内的金额,千亿之外方法类似)
  27.                 String [] sufdivs={"角","分"};//小数后面部分(取两位)
  28.                
  29.                 long l=(long)d;//获取金额整数部分
  30.                 int sufI=(int)(d*100%100);//获取金额小数部分
  31.                
  32.                 String str=String.valueOf(l);//整数部分转为字符串
  33.                
  34.                 //通过StringBuilder反转字符串,这样从左忘右读取,这样角标对应的单位(段中单位,每一段单位)在
  35.                 //units,divs中也是从左往右变化,这样便于读取单位
  36.                 StringBuilder strb=new StringBuilder(str);
  37.                 strb.reverse();
  38.                 str=strb.toString();
  39.                
  40.                 StringBuilder sb=new StringBuilder();//创建StringBuilder用于存储读到的每一位数字转为大写数字。
  41.                 int []arrInt=new int[str.length()];//int型数字用于存储每一位的数字
  42.                 for(int i=0;i<str.length();i++){
  43.                         arrInt[i]=Integer.valueOf(str.substring(i,i+1));//字符串中每一位数字赋给数组arrInt中每一位;
  44.                        
  45.                         //读取每一位并添加到sb中
  46.                         if(i==4){//读取到第五位时加上段单位”万“
  47.                                         sb.insert(0, numbers[arrInt[i]]+divs[i/4]);
  48.                         }else if(i==8){//"读取到"第九位时加上段单位”亿“
  49.                                         sb.insert(0, numbers[arrInt[i]]+divs[i/4]);
  50.                         }else{
  51.                                 //其他位的读取
  52.                                 if(arrInt[i]==0){//为零时,只读取零,不读取段中单位”拾佰仟“
  53.                                         sb.insert(0, numbers[arrInt[i]]);
  54.                                 }else//不为零时,读取数字和段中单位
  55.                                         sb.insert(0, numbers[arrInt[i]]+units[i%4]);
  56.                         }       
  57.                 }
  58.                 //读取完整数部分读取小数部分
  59.                 if(sufI==0){//小数部分为0,则直接添加”圆整“,读取完毕
  60.                         sb.append("圆整");
  61.                 }else{//小数部分不为0,则添加”圆“并读取小数部分
  62.                         sb.append("圆");
  63.                         int i1=sufI/10;//去小数部分第一位
  64.                         int i2=sufI%10;//小数部分第二位
  65.                         //下属部分的两位只要某一位为0,则不读取,不为0,则读取数字和对应的单位”角分“
  66.                         if(i1!=0){
  67.                                 sb.append(numbers[i1]+sufdivs[0]);
  68.                         }
  69.                         if(i2!=0){
  70.                                 sb.append(numbers[i2]+sufdivs[1]);
  71.                         }
  72.                        
  73.                 }
  74.                
  75.                 String strChina=sb.toString();//读取的sb转成字符串,以便于操作
  76.                 strChina=strChina.replaceAll("(.)\\1+","$1");//去除叠词”零“,只取一个”零“
  77.                 strChina=strChina.replace("亿零万", "亿零");//万位全为0,则不读取”万“
  78.                 strChina=strChina.replace("零亿", "亿");//整拾、整百、整千亿时,去掉亿前面的零
  79.                 strChina=strChina.replace("零万", "万");//整拾、整百、整千万时,去掉万前面的零
  80.                 strChina=strChina.replace("零圆", "圆");//整拾、整百、整千时,去掉圆前面的零
  81.                 return strChina;
  82.         }

  83. }
复制代码


3 个回复

倒序浏览
本帖最后由 wdhm5423 于 2015-3-8 09:40 编辑

赋值100000000000d,输出壹仟亿零圆整。待优化
回复 使用道具 举报
恩,还有一种情况没考虑到啊..谢谢提醒啊,亿零万零圆整,还有一个零没去掉..
回复 使用道具 举报
在81,82行之间再添加句去叠词的就可以了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马