金币转换

//真心不容易,特殊情况太多,一不小心就会挂,很是纠结。幸亏这次是思绪如潮,灵感爆发,外加坚持不懈,终于搞定。发出来晒一晒,哈哈!



import java.util.ArrayList;


/**
 * 第十题: 金额转换,阿拉伯数字转换成中国传统形式。
 * 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
 * */
public class Test10 {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String number = "101000001010";
System.out.println(number);

checkNumber(number);//检测传入的字符串是否符合规则,全为阿拉伯数字,并且最多只保留了小数点后两位
transverter(number);

//***********************测试其他情况*******************
System.out.println();
System.out.println("******************测试数据******************");
String test_number = "102342001301.01";
System.out.println(test_number);
checkNumber(test_number);
transverter(test_number);

System.out.println();
System.out.println("******************测试数据******************");
String test_number1 = "0";
System.out.println(test_number1);
checkNumber(test_number1);
transverter(test_number1);

/*
String tryNumber = "103.234";//测试输入字符的精度大于分时,程序处理的结果
checkNumber(tryNumber);
*/
/*
String tryNumber = "103.b4";//测试输入字符中包含不是阿拉伯数字的字符时,程序处理的结果
checkNumber(tryNumber);
*/


}

public static void checkNumber(String number) {//定义检查函数,功能判断字符串中的字符是否符合实际要求
int indexPoint = number.indexOf('.');//定义变量存放小数点所在位置
int len = number.length();

if(indexPoint != -1){
len = number.length() - (number.length() - indexPoint);
if((number.length() - indexPoint - 1) > 2){//若精度大于分,则抛出异常,并提醒精度错误
throw new RuntimeException("精度错误,最多只能到分");
}
else{//当精度符合要求时,判断其整数部分是否符合要求
String reg = "[0-9]+.[0-9]+";//定义带小数的正则表达式
boolean isNumber = number.matches(reg);//使用正则表达式判断整数部分是否都为阿拉伯数字
if(!isNumber){
throw new RuntimeException("包含不是阿拉伯数字的字符,请重新输入");//若不是,则抛出异常,并输出提示信息
}
}
}
else{//当没有小数点时判断,其是是否都为阿拉伯数字

String reg = "[0-9]+";//定义不带小数的正则表达式
boolean isNumber = number.matches(reg);//使用正则表达式判断整数部分是否都为阿拉伯数字
if(!isNumber){
throw new RuntimeException("包含不是阿拉伯数字的字符,请重新输入");//若不是,则抛出异常,并输出提示信息
}

}

if(len > 12){//当输入的数字大于一万亿时,抛出异常,并提醒用户,输入数字太大
throw new RuntimeException("输入数字太大,此程序只能接受小于一万亿的数字");
}
//if(flag_big >2){
//
//}
}



public static void transverter(String number) {//定义转换函数,功能将阿拉伯数字转成中文大写数字,并带有元角分单位,而且输出其转换结果
ArrayList<String> china = new ArrayList<String>();//定义集合对象

String[] numberChina = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
String[] num_weight = {"","拾","佰","仟"};
String[] num_big = {"","万","亿"};
String[] renMinBi = {"元","角","分"};
int indexPoint = 0;//获取小数点后有几个数字
int len = number.length();//定义整数位的长度
int index_number;//字符串指定位置的字符的阿拉伯数字


//**********************处理小数点及小数点后面的部分*******************************************************

if(number.indexOf('.') ==-1){//当没有小数时,暂不操作

}
else {//当有小数时,程序对小数部分的处理情况
indexPoint =number.length() - number.indexOf('.') - 1;//小数部分的长度
if(indexPoint == 1 ){//小数点后有一位小数时的处理情况
china.add(renMinBi[1]);//向集合内添加“角”
   index_number = transtionNumber(number.charAt(number.length() - 1));//调用自定义转换器将字符转成阿拉伯数字
china.add(numberChina[index_number]);//向集合内添加与阿拉伯数字相对应的中文大写字母
len = number.length() - 2;//修改字符串中的整数部分的大小
}
else if(indexPoint == 2){//小数点后有一位小数时的处理情况
for(int i = 2; i > 0 ; i--){
china.add(renMinBi[i]);//向集合内添加与之对应的单位
   index_number = transtionNumber(number.charAt(number.length() - (3-i)));//调用自定义转换器将字符转成阿拉伯数字
china.add(numberChina[index_number]);//向集合内添加与阿拉伯数字相对应的中文大写字母
}
len = number.length() - 3;//修改字符串中的整数部分的大小***不要忘记小数点
}
}


        //******************************处理整数部分*************************************************************

if(number.indexOf('.') ==-1 && number.length() == 1 && number.charAt(0) == '0'){//判断其输入字符为整数0时发生的操作
System.out.println("好穷,一文没有");
}

else{
if(number.indexOf('.') ==-1){//若输入字符串为整数并且大于0时,向集合内添加字符“整”
china.add("整");
}

china.add(renMinBi[0]);//首先第一步向集合存入字符“元”

int flag_weight;//标记字符数组num_weight的下标
int flag_big = 0;//标记字符数组 num_big 的下标
int flag_start = 0;//标记当每组第一个数为0时,后面还有几个0
for(int i = len - 1 ; i >= 0 ; i = i - 4){//将整个数字整数部分从右向左依次分成4位一组,并向集合内存入其单位num_big【】

flag_weight = 0;
int flag = 0;//标记数字是否为0


if(flag_start == 4){
china.remove(china.size() - 1);
}
china.add(num_big[flag_big%3]);//并向集合内存入其单位num_big【】
flag_big++;

   w:for(int j = i ; j >= 0 ; j--){
    flag_start = 0;
index_number = transtionNumber(number.charAt(j));//调用自定义转换器将字符转成阿拉伯数字
if(index_number == 0){//当数字为0时
if(flag_weight == 0)//并且此数字为这一组的第一个数字
{
for(int k = j ; k >= 0 ; k-- ){//遍历记录从每组的第一个开始有几个连续都为0的数字
index_number = transtionNumber(number.charAt(k));//调用自定义转换器将字符转成阿拉伯数字
if(index_number == 0){
flag_start++;
}
else{
break;
}

if(flag_start == 4){//如果连续四个数字都为0,跳出这一组循环,直接进行下一组循环
break w;
}

}
flag_weight = flag_weight + flag_start;//修改被操作的第几个数
j = j - flag_start + 1;//修改循环变量
flag = 0;
}
else{//每组第一个数不为0并且其他位置有0时的情况,只添加一个”零“放入集合中
flag++;
if(flag == 1){
china.add(numberChina[0]);
}
flag_weight = flag_weight + flag ;
}

//flag_weight++;
if(flag_weight == 4)
break;
}
else{//当字符串中的数字不为0时
flag = 0;
china.add(num_weight[flag_weight]);//添加num_weight中对应的单位放入集合中
china.add(numberChina[index_number]);//添加与字符串中数字对应的中国大写数字到集合中
flag_weight++;
if(flag_weight == 4)
break;
}
}

}
}

//*********************************遍历集合china,逆向输出其元素**********************************************************
System.out.println();
System.out.print("人民币(大写):");
for(int i = china.size() - 1 ; i >= 0 ; i --){
System.out.print(china.get(i));
}

}


/自定义其他辅助功能函数
public static int transtionNumber(char number) {//自定义转换器将字符转成阿拉伯数字,并返回阿拉伯数字
int num = 0;
for(int i = 0 ; i <10 ; i ++){
if(('0' + i) == number){
num = i;
}
}
return num;
}



}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值