最近学习了字符串相关的知识,想写了一个程序来巩固一下。就选了数字金额转大写金额这个题。不多说,看代码。
import java.text.*;
import java.util.*;
public class ConvertMoney {
private static final String[] STR_UNIT ={"","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"};
private static final String[] STR_NUMBER ={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner scan=new Scanner(System.in);
System.out.println("请输入一个数字金额");
String s=convert(scan.nextDouble());
System.out.println(s);
}
public static String convert(Double a){
//把输入的浮点型转化为字符串型
String s=new DecimalFormat("#.00").format(a);
//如果输入的数字金额有小数点
if(s.indexOf(".")!=-1){
String z_num=s.substring(0,s.indexOf(".")); //取整数部分
if(z_num.length()>12){
System.out.println("数字太大不能转化");
return "";
}
}
String point;
if(s.indexOf(".")!=-1){
point="元";
}else{
point="元整";
}
String result=getInteger(s)+point+getDecimal(s);
if(result.startsWith("元")){
result=result.substring(1, result.length());
}
return result;
}
public static String getInteger(String a){
if(a.indexOf(".")!=-1){
a=a.substring(0,a.indexOf(".")); //取整数部分
}
a=new StringBuffer(a).reverse().toString(); //反转字符串
StringBuffer temp=new StringBuffer();
//String为不可变对象,StringBuffer为可变对象
//StringBuffer.append()在连接多个对象的时候会比String的“+”快
for(int i=0;i<a.length();i++){
temp.append(STR_UNIT[i]); //添加位
temp.append(STR_NUMBER[Character.getNumericValue(a.charAt(i))]); //添加大写数字,Character.getNumericValue()把char转为int
}
a=temp.reverse().toString(); //再次反转字符串 4
a=numreplace(a,"零拾","零"); //根据命名方式来替换
a=numreplace(a,"零佰","零");
a=numreplace(a,"零仟","零");
a=numreplace(a,"零万","万");
a=numreplace(a,"零亿","亿");
a=numreplace(a,"零零","零");
a=numreplace(a,"亿万","亿");
//如果个位上为零,那么除去字符“零”
if(a.lastIndexOf("零")==a.length()-1){
a=a.substring(0,a.length()-1);
}
return a;
}
public static String getDecimal(String a){
if(a.indexOf(".")==-1){
return "";
}
a=a.substring(a.indexOf(".")+1,a.length()); //取小数部分
a=new StringBuffer(a).reverse().toString(); //反转字符串
StringBuffer temp=new StringBuffer();
for(int i=0;i<2;i++){
if(i==0)
temp.append("分");
if(i==1)
temp.append("角");
temp.append(STR_NUMBER[Character.getNumericValue(a.charAt(i))]);
}
a=temp.reverse().toString(); //反转字符串
a=numreplace(a,"零分","零");
a=numreplace(a,"零角","零");
if(a.lastIndexOf("零")==a.length()-1){ //两个相同的if,既可以处理有一个零的情况,又可以处理2个零的情况
a=a.substring(0,a.length()-1);
}
if(a.lastIndexOf("零")==a.length()-1){
a=a.substring(0,a.length()-1);
}
return a;
}
public static String numreplace(String num,String a,String b){ //多次替换函数,根据此题,循环4级即可
for(int i=0;i<4;i++){
num=num.replace(a, b);
}
return num;
}
}
测试结果:
这里关键点就是如何解决数字和大写金额之间的对应,我们分两部分处理:整数部分和小数部分。
首先先不管其他,先把数字转为汉字数字和相应的位。其次,要处理是否有零,能不能缺少万和亿等问题
具体替换方案如代码注释。
其实我这个代码有点小毛病,就是只能精确到分,下一位直接舍弃了,没有进位处理。所以在精确度方面有所欠缺。