金额转换,阿拉伯数字转换成中国传统形式。 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整

金额转换,阿拉伯数字转换成中国传统形式。


 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整





package com.itheima;

import java.util.ArrayList;


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

/**
 * 题目分析:本题实现比较复杂,主要是对连续零的判断,通过循环判断每一位以及
 * 前一位是否为零,来控制是否删除多余的零,实现字符串的金额转换
 * 
 * 
 */
public class Test10 {

	
	/**
	 * 主函数
	 * @param args
	 */
	public static void main(String[] args) {
		
		//定义一个阿拉伯数字的字符串数组
		String[] arr = {"101000001010","00101000000010","100","sdffd100"};
		//遍历数组
		for(int i=0;i<arr.length;i++)
		{
			String str = transform(arr[i]);		//调用函数,将阿拉伯数字金额 转换为中国传统形式金额
			System.out.println(arr[i]+" 转化后为: "+str);	//打印转换后的字符串内容
		}
	}
	
	/**
	 *  将字符串金额str转换为中国传统金额表示方式
	 * @param str
	 * @return
	 */
	public static String transform(String str){
		//使用正则表达式判断字符串格式是否为数字格式
		if(!str.matches("\\d+")){
			System.out.println("字符串" + str + "不是数字格式,无法转换!");
			return null;
		}
		//将字符串最前面的0去掉
		while(str.startsWith("0")){
			str = str.substring(1, str.length());
		}
		//将字符串数字替换成中文数字
		String[] num = new String[]{"0","1","2","3","4","5","6","7","8","9"};
		String[] cnNum = new String[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
		for(int i=0; i<10; i++){
			str = str.replace(num[i], cnNum[i]);
		}
		
		StringBuilder sb = new StringBuilder(str);//StringBuilder容器中存放字符串,用于插入删除操作
		int index = str.length()-1;   //从第index个字符从后往前开始操作,操作一次,index--
		//存放金额单位
		String[] unit = {"","拾","佰","仟"};
		String[] unit4 = {"萬","亿"};
		
		boolean flag = false;//判断前一个数是否为零的标记
		
		for(int i=0; i<str.length(); i++){//循环体内对容器sb进行操作
			
			//每4位插入万每8位插入亿,最低位先不设置单位
			if(i%4 == 0 && i != 0){
				//根据金额规则,单位万前面为4个零时,不插入万,并将index位置(最低位)的零删除
				if((i/4-1)%2 == 0 && index >= 3 && str.substring(index-3, index+1).equals("零零零零")){
					sb.deleteCharAt(index);
					index--;
					continue;
				}
				//否则在index+1位置插入相应的单位:万、亿
				sb.insert(index+1, unit4[(i/4-1)%2]);
			}
			//如果4位的最低位为零,删除最低位的零,将零标志置为true
			if(i%4 == 0 && str.charAt(index) == '零'){
				sb.deleteCharAt(index);
				flag = true;
				index--;
				continue;
			}
			//如果前一位为零并且这一位也为零,删除这一位的零
			if(flag && str.charAt(index) == '零'){
				sb.deleteCharAt(index);
				index--;
				continue;
			}
			//如果当前位为零,将零标志置为true
			if(str.charAt(index) == '零'){
				flag = true;
				index--;
				continue;
			}
			//当前位不为零,将零标志位置为false,插入金额单位
			flag = false;
			sb.insert(index+1, unit[i%4]);
			index--;
		}
		//完善金额表示形式
		sb.append("圆整");
		return sb.toString();
	}
	

}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值