/*
* 需求:金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出,
* (¥1011.04)->(一千零一拾一元零肆分)输出。
* 分析:
* 1. judge(String str)判断输入数字格式是否合法:
* 小数部分:(.\\d{1,2})? (有.有小数部分,没有.就没有小数部分 )
* 整数部分:(小于一元时,整数位只有一个0) ¥[0]
* (大于或等于一元时,整数部分第一位非0) ¥[1-9]\\d*
* 2. delete(String str0,String str1) 删除str0中的str1,用以删除.和¥
* 3. toLong() 将字符串统一补成小数后两位,删除.和¥后,将新的字符串装换成Long型
* 4. changeToChina(long number) 将输入Long型数值转换成中国传统数字格式
*/
public class MoneyFormatConversion {
public static void main(String[] args) {
String format1="¥?[0](.\\d{1,2})?"; //小于一元时,输入的格式
String format2="¥?[1-9]\\d*(.\\d{1,2})?"; //大于一元时,输入的格式
String moneyString="¥9980553555757511.00";
Money money=new Money(moneyString);
if(money.judge(format1)||money.judge(format2)){
System.out.println("输入合法! 输入字符串为: "+moneyString);
long moneyNumber;
try {
moneyNumber = money.toLong();
System.out.println(money.changeToChina(moneyNumber));
} catch (Exception e) {
System.out.println("错误: 输入数字过大!量纲数组角标越界");
}
}else{
System.out.println("输入不合法!");
}
}
}
class Money{
private String moneyString;
public Money(String moneyString){
this.moneyString=moneyString;
}
//判断字符串是否符合某种格式
public boolean judge(String format){
Pattern p=Pattern.compile(format);
Matcher m=p.matcher(this.moneyString);
if(m.matches())
return true;
else
return false;
}
//将输入的字符串按照中国传统格式转换
public String changeToChina(long number){
char[] num=new char[]{'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
char[] units=new char[]{'分','角','元','拾','佰','仟','万','拾','佰','仟','亿','拾','佰','仟','万','拾','佰','仟'};
StringBuffer sb=new StringBuffer();
int unit=0;
boolean flag=true;//保证连续出现0时,只输出一个零
int s=(int)(number%10);//用来标记最小位是否为0,为0则不添加最小位上的0,不为0则按要求添加
while(number!=0){
if(number%10!=0){
s=1;
flag=true;
sb.insert(0, units[unit++]);
sb.insert(0, num[(int)(number%10)]);//此时需要将number%10整体转型为int,单独转number时,如果数字太大,则会出现溢出的错误
}else{ //无论几个0,只输出一个零
if(flag){
if(s!=0&&unit!=2){
sb.insert(0, num[0]);
}
}
if((unit==2||unit==6||unit==10||unit==14)&&number/10>0){
sb.insert(0, units[unit]);
}
flag=false;
++unit;
}
number=number/10;
}
return sb.toString();
}
// 先将字符串统一变换成小数点后有两位数的形式,再删除.和¥,最后将新的字符串转变成相应的Long型
public long toLong(){
String newString0=this.moneyString;
if(this.moneyString.contains(".")){
if((this.moneyString.length()-this.moneyString.indexOf("."))==2){
System.out.println("11");
newString0=this.moneyString+"0";
}
}else{
newString0=this.moneyString+"00";
}
System.out.println("补零后的: "+newString0);
System.out.println("删除 : . ");
//删除字符¥和.
String newString1=deleteString(newString0,".");
System.out.println("删除 : ¥");
String newString2=deleteString(newString1,"¥");
//将新的字符串转变成数字
long moneyNumber=Long.valueOf(newString2);
System.out.println("转换成整形后: "+moneyNumber);
return moneyNumber;
}
//删除字符串中指定的字符串
public String deleteString(String str0,String str1){
String newString=str0;
System.out.println("str0删除之前: "+str0);
if(str0.contains(str1)){
StringBuffer sb=new StringBuffer(str0);
char[] ch0=str0.toCharArray();
char ch1=str1.charAt(0);
for(int i=0;i<str0.length()-str1.length();i++){
if(ch0[i]==ch1){
sb.delete(i, str1.length()+i);
newString=sb.toString();
}
}
}
System.out.println("str0删除之后: "+newString);
return newString;
}
}
|