// 金额转换,阿拉伯数字转换成中国传统形式。
//扩展就是十万亿以上可以直接在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 ' ';
}
}
}
|
|