Java浮点数转人民币读法

Java浮点数转人民币读法

  • 把【整数部分】的数字,由个位开始,4个数字分为一组,最高位没有数字就补0,并记录总共的数组个数,总共有3组,也就3*4的二维数组;
  • 对于每个数组统一处理,当读取到0时,检查它的上一位是否为0,如果上一位是0,则不做处理,如果上一位不是0或者上一位不存在,均记下“零”;
  • 读取每个数字,转换为对应的大写汉字,并加上权重“仟、佰、拾”,根据读取的是第几个数组,后面添加相应的“亿”、“万”、“元”;
  • 最后将最开头的“零去掉”,将“亿”、“万”、“元”字前面的“零”去掉;
  • 把【小数部分】做一维数组处理,仅保留两位小数,对应“角”和“分”,数字0不处理;
  • 测试数字『120, 3005, 7600.89』,读作:壹佰贰拾亿叁仟零伍万柒仟陆佰元捌角玖分。

package theTest;
public class NumToRmb {
   
    private String[] hanArr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
   
    private String[] unitArr={"仟","佰","拾"};
   
    /**
      * 把一个浮点数分解成整数部分和小数部分字符串
      * @param num 需要被分解的浮点数
      * @return 分解出来的整数部分和小数部分,第1个数组元素是整数部分,第2个数组元素是小数部分。
      */
    private String[] divide(double num){
          //将一个浮点数强制转换为long型,即得到它的整数部分
          long zheng=(long)num;
         
          //浮点数减去整数部分,得到小数部分,小数部分乘以100取整得到两位小数
          long xiao=Math.round((num-zheng)*100);
         
          //这里使用两种方法将整数转换为字符串
          return new String[]{String.valueOf(zheng),xiao+""};
    }
    /**
      * 将整数分成4个数字为一组的字符串处理,转化成大写数字再将它们连接起来,得到最终的人民币读法
      * @param num 需要被转化为大写数字的浮点数
      * @return 返回整个数字的人民币读法
      */
    private String conHanStr(double num){
         
          //存储整数结果、小数结果
          String resZheng="";
          String resXiao="";
         
          //存储最终结果
          String result="";
         
          //分别存储整数部分和小数部分字符串
          String zhengStr=divide(num)[0];
          String xiaoStr=divide(num)[1];
         
          /*小数部分的处理*/
          if(xiaoStr.length()==1){
                xiaoStr="0"+xiaoStr;
          }
         
          resXiao=xiao2Han(xiaoStr);
         
          /*整数部分的处理*/
          //记录字符串个数,是第几个数组
          int countArr=0;
          String tempStr="";
         
          //记录位数
          int countNum=0;
         
          for(int i=zhengStr.length()-1;i>=0;i--){
                countNum++;
                tempStr=zhengStr.charAt(i)+tempStr;
               
                if(i-1<0){
                    //i已经是最后一个数字,不够的位,补0
                    while(tempStr.length()<4){
                          tempStr="0"+tempStr;
                    }
                    countArr++;
                    resZheng=zheng2Han(countArr,tempStr)+" "+resZheng;
                }else{
                    if(countNum==4){
                          countArr++;
                          resZheng=zheng2Han(countArr,tempStr)+" "+resZheng;
                          countNum=0;
                          tempStr="";
                    }   
                }
          }
         
          //去掉开头的零
          if(resZheng.charAt(0)=='零'){
                resZheng=resZheng.substring(1,resZheng.length());
          }
         
          /*整数和小数的连接*/
          //表示整数部分为0
          if(resZheng.charAt(0)=='元'){
                resZheng="零"+resZheng;
          }
         
          result=resZheng+resXiao;
         
          return result;
    }
   
    /**
      * 每个4位的整数组转化为大写的数字
      * @param count 记录是第几个数组(1-3)
      * @param str 需要被转换的数组
      * @return 返回该数组人民币读法
      */
    private String zheng2Han(int count,String str){
         
          String result="";
          for(int j=0;j<4;j++){
                int tempNum=str.charAt(j)-48;
                if(tempNum!=0){
                    if(j!=3){
                          result+=hanArr[tempNum]+unitArr[j];
                    }else{
                          result+=hanArr[tempNum];
                    }
                }else{
                    if((j-1<0)||(str.charAt(j-1)-48!=0)){
                          result+=hanArr[tempNum];
                    }
                }
          }
         
          //去掉末尾的零
          if(result.charAt(result.length()-1)=='零'){
                result=result.substring(0, result.length()-1);
          }
         
          //去零之后添加“亿、万、元、角、分”。
          switch(count){
          case 1:
                result+="元";
                break;
          case 2:
                result+="万";
                break;
          case 3:
                result+="亿";
                break;
          default:
                System.out.println("仅支持不大于9999,9999,9999.99的数字!");
                return "";
          }
          return result;
    }
   
    /**
      * 小数转化为大写的数字
      * @param str 需要被转换的数组
      * @return 返回该小数人民币读法
      */
    private String xiao2Han(String str){
          String result="";
          if(!str.equals("00")){
                for(int i=0;i<2;i++){
                    int tempNum=str.charAt(i)-48;
                    if((tempNum!=0)&&(i==0)){
                          result+=hanArr[tempNum]+"角";
                    }
                    if((tempNum!=0)&&(i==1)){
                          result+=hanArr[tempNum]+"分";
                    }
                }
          }
          return result;
    }
   
    /**
      * 主函数
      * @param args
      */
    public static void main(String[] args) {
          NumToRmb nr=new NumToRmb();
          System.out.println(nr.conHanStr((double)12030060078.95));
    }
}

猜你喜欢

转载自www.linuxidc.com/Linux/2018-03/151275.htm