主要是加深对数组的理解在,这个程序原来是《疯狂java讲义》低第103页上的一个例子,但是例子并不完整,对0的处理和对末位包括小数点后面处理不完整,因此这里进行了完善。考虑到人民币通俗叫法,浮点数格式为(XXXX.XX),转换为字符串格式为(x千x百x十x元x角x分),当然还要考虑末位开始位和零的处理。
程序如下:
public class Num2Rmb {
private String[] hanArr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] unitArr={"分","角","元","十","百","千"};
/**
* 把一个浮点数分解成整数部分和小数部分字符串
* @param num 需要被分界飞浮点数
* @return 分解出来的整数部分和小数部分,第一部分是整数部分,第二部分是小数部分
*/
private String[] divide(double num){
long zheng=(long)num; //通过强制转型得到整数部分
long xiao=Math.round((num-zheng)*100); //浮点数减去整数部分得到小数部分,小数部分乘以100后得到2位小数值
return new String[]{""+zheng,String.valueOf(xiao)}; //整数转换为字符串(2种方法)
}
/**
* 把一个四位的数字字符串变成汉字字符串
* @param numStr 需要被转换的四位数字字符串
* @return 四位字符串被转换为汉字字符串
*/
private String toHanStr(String[] numStr){
String result="";
int numLen0=numStr[0].length();
int numLen1=numStr[1].length();
for(int i=0;i<numLen0;i++){
int num=numStr[0].charAt(i)-48; //将char变成对应的int数字
if(num!=0){ //非零情况
result+=hanArr[num]+unitArr[1+numLen0-i];
}
else if(i!=numLen0-1&&i!=0&&num==0){ //中间位数是零
result+=hanArr[num];
}
else if(i==numLen0-1&&num==0) { //个位是零
result+=unitArr[1+numLen0-i];
}
else if(i==0&&num==0) { //最高位是零
result+="";
}
}
for(int j=0;j<numLen1;j++) { //小数点后位的处理,角和分
int num=numStr[1].charAt(j)-48;
if(num!=0){
result+=hanArr[num]+unitArr[1-j];
}
if(num==0) {
result+="";
}
}
return result;
}
public static void main(String[] arg){
Num2Rmb nr=new Num2Rmb();
String[] test=nr.divide(323.23);
//String[] test2= {"0325","25"};
System.out.println(nr.toHanStr(test));
}
}
今天下午看了一下,感觉上面程序还有些问题,比如在3003这种数据,中间位数有两个0的时候结果不对,改进如下
public class Num2Rmb {
private String[] hanArr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] unitArr={"分","角","元","十","百","千"};
/**
* 把一个浮点数分解成整数部分和小数部分字符串
* @param num 需要被分界飞浮点数
* @return 分解出来的整数部分和小数部分,第一部分是整数部分,第二部分是小数部分
*/
private String[] divide(double num){
long zheng=(long)num; //通过强制转型得到整数部分
long xiao=Math.round((num-zheng)*100); //浮点数减去整数部分得到小数部分,小数部分乘以100后得到2位小数值
return new String[]{""+zheng,String.valueOf(xiao)}; //整数转换为字符串(2种方法)
}
/**
* 把一个四位的数字字符串变成汉字字符串
* @param numStr 需要被转换的四位数字字符串
* @return 四位字符串被转换为汉字字符串
*/
private String toHanStr(String[] numStr){
String result="";
int numLen0=numStr[0].length();
int numLen1=numStr[1].length();
int[] num0=new int[numLen0];
int[] num1=new int[numLen1];
//赋值
for(int i=0;i<numLen0;i++) {
num0[i]=numStr[0].charAt(i)-48;
}
for(int j=0;j<numLen1;j++) {
num1[j]=numStr[1].charAt(j)-48;
}
for(int i=0;i<numLen0;i++){
if(num0[i]!=0){ //非零情况
result+=hanArr[num0[i]]+unitArr[1+numLen0-i];
}
else if(i==0&&num0[i]==0) { //最高位是零
result+="";
}
//中间位是零
else if(i!=numLen0-1&&i!=0&&num0[i]==0&&num0[i+1]!=0){ //中间位数是只有一个零
result+=hanArr[num0[i]];
}
else if(i!=numLen0-1&&i!=0&&num0[i]==0&&num0[i+1]==0){ //中间位数是只有一个零
result+="";
}
else if(i==numLen0-1&&num0[i]==0) { //个位是零
result+=unitArr[1+numLen0-i];
}
}
for(int j=0;j<numLen1;j++) {
if(num1[j]!=0){
result+=hanArr[num1[j]]+unitArr[1-j];
}
if(num1[j]==0) {
result+="";
}
}
return result;
}
public static void main(String[] arg){
Num2Rmb nr=new Num2Rmb();
String[] test=nr.divide(3003.10);
//String[] test2= {"3005","25"};
System.out.println(nr.toHanStr(test));
}
}
改进中将判断是否连续出现了0