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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

// 金额转换,阿拉伯数字转换成中国传统形式。
//扩展就是十万亿以上可以直接在zhengShuPart那个函数str数据中继续往前加。
package com.itheima;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test10 {

public static void main(String[] args) {
  System.out.println("请输入要转换的金额(over代表结束):");
  //调用输入金额方法:
  InputMoney();
}
//用户输入金额方法
public static void InputMoney(){
  BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  
  try{
   String line = null;
   while((line = bufr.readLine())!=null){
    if("over".equals(line))
     break;
    //用于判断输入的是否是合法金额
    Double.parseDouble(line);
    //调用转换大写方法
    String fmoney = formatMoney(line);
   
    //屏蔽回车操作显示的无效信息
    if(!fmoney.equals("整")){
     System.out.println(line+"的大写格式为:"+fmoney);
    }
   }
  }
  catch(IOException ioe){
   System.out.println("读取失败!");
  }
  catch(Exception e){
   System.out.println(new RuntimeException("请输入有效金额:1.有效数字 2.金额小于10万亿"));
  }
  finally{
   try{
    if(bufr!=null)
     bufr.close();
   }
   catch(IOException e){
    System.out.println("读入流关闭失败。");
   }
  }
}
//主要函数。用于将金额转换为大写
public static String formatMoney(String money){
  //判断金额是否带分角
  if(money.contains(".")){
   String[] str = money.split("\\.");
   //调用元部分函数
   if(!str[0].equals("0")){
    str[0] = zhengShuPart(str[0]);
    //调用分角部分函数
    str[1] = xiaoShuPart(str[1]);
    //将两部分大写连接并返回
    return str[0]+str[1];
   }
   else{
    return xiaoShuPart(str[1]);
   }
  }
  else{
   //调用元部分函数并和"整"字相连,满足大写金额的规范化书写
   return zhengShuPart(money)+"整";
  }
}
//分角部分转换函数
public static String xiaoShuPart(String money){
  //考虑用户输入角分的多样化,如果角分位为00,直接返回整
  if("00".equals(money))
   return "整";
  char[] ch = money.toCharArray();
  //如果角分位只有角,返回角数
  if(ch.length == 1)
   return getNum(ch[0])+"角整";  
  //角分位都有数
  if(ch.length == 2){
   //返回分位为0时
   String regJiao = "[1-9][0]";
   if(money.matches(regJiao)){
    return getNum(ch[0])+"角整";
   }
   //角位为0时
   String regFen = "[0][1-9]";
   if(money.matches(regFen)){
    return getNum(ch[1])+"分";
   }
  }
  //其他情况正常
  return getNum(ch[0])+"角"+getNum(ch[1])+"分";
}
public static String zhengShuPart(String money){
  StringBuilder sb = new StringBuilder();
  //采用两个数组想结合,构成一个新的字符串,着重处理字符串规范化打印。
  char[] ch = money.toCharArray();
  String[] str = {"万","仟","佰","拾","亿","仟","佰","十","万","仟","佰","拾","元"};
  for(int x=1; x<=ch.length; x++){
   String temp = ch[ch.length-x]+str[str.length-x];
   //将两个结合后的数组内容按照部分一点点加入到sb中,且放在头部
   sb.insert(0,temp);
  }
  //依次调用各项方法,获得整数部分的规范化字符串
  return formatNum(dropSomeZero(dropZero(sb.toString())));
}
//去除字符串中多个0和空格字符
public static String dropSomeZero(String str){
  String reg1 = "[0]{2,}";//检索多个0
  String reg2 = " +";//检索1到多个空格
  str = str.replaceAll(reg1,"0");
  str = str.replaceAll(reg2,"");
  char[] ch = str.toCharArray();
  //如果亿,万,元前边只有零,则可省略0
  for(int x=0; x<ch.length; x++){
   switch(ch[x]){
   case '亿':
   case '万':
   case '元':
    if(ch[x-1]=='0'){
     ch[x-1] = ' ';
     continue;
    }
    else
     continue;
   default:continue;
   }
  }
  //再次去掉空格
  str = new String(ch).replaceAll(reg2,"");
  return str;
}
//将除了亿,万,元单位的其他0的部分都替换为0,如百位为0,则将"佰"字符替换为0
public static String dropZero(String str){
  char[] ch = str.toCharArray();
  for(int x=0; x<ch.length; x++){
   if(ch[x]!='元'){
    if(ch[x]=='0'){
     switch(ch[x+1]){
     case '亿':
     case '万':
     case '元':ch[x] = ' ';continue;
     default:ch[x+1] = '0';x++;continue;
     }
    }
   }
  }
  return new String(ch);
}
//遍历将字符串中的数字用大写代替
public static String formatNum(String str){
  char[] ch = {'0','1','2','3','4','5','6','7','8','9'};
  for(int x=0; x<ch.length; x++){
   str = str.replace(ch[x],getNum(ch[x]));
  }
  return str;
}
//大写代替函数
public static char getNum(char ch){
  switch(ch){
  case '0':return '零';
  case '1':return '壹';
  case '2':return '贰';
  case '3':return '叁';
  case '4':return '肆';
  case '5':return '伍';
  case '6':return '陆';
  case '7':return '柒';
  case '8':return '捌';
  case '9':return '玖';
  default: return ' ';
  }
}
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马