前几天遇到的一道笔试题,将小写的人民币数值转换成大写形式,数值取值范围为:0.00-999999999999.99。如输入102411050126.08,则输出:壹仟零贰拾肆亿壹仟壹佰零伍万零壹佰贰拾陆元零角捌分。以下为我编的程序,欢迎各位批评指教。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.regex.Pattern;
/**
* 将小写的人民币数值转换成大写形式,数值取值范围为:0.00-999999999999.99
* 如输入102411050126.08,则输出:壹仟零贰拾肆亿壹仟壹佰零伍万零壹佰贰拾陆元零角捌分
* @author mcqueen
*
*/
public class TestC {
public static void main(String[] args){
double money = getRMB();
String moneyStr=new DecimalFormat("0.00").format(money);//将double的数值转为非科学记数法,且保证只含两位小数
Pattern pattern = Pattern.compile("[.]");
String[] strs = pattern.split(moneyStr);//切割分开整数与小数部分
String moneyBig=strs[0];//整数部分字符表示形式
String moneySmall=strs[1];//小数部分字符表示形式
StringBuffer result=new StringBuffer();
String high="亿";
String middle="万";
String low="元";
String zero="零";
Double operNumber=Double.valueOf(moneyBig);//整数部分
if (operNumber>10E7) {//亿级别
Double wan=operNumber%10E7;//前八位
Double qian=operNumber%10E7%10E3;//前四位
result.append(getNumString((operNumber-wan)/10E7));
result.append(high);//亿
if ((wan-qian)/10E3<1000) result.append(zero);//若千万位为零,添加"零"
result.append(getNumString((wan-qian)/10E3));
result.append(middle);//万
if (qian<1000)result.append(zero);//若千位数为零,添加"零"
result.append(getNumString(qian));
result.append(low);//元
}else if (operNumber>1*10E3) {//万级别
Double qian=operNumber%10E3;//前四位
result.append(getNumString((operNumber-qian)/10E3));
result.append(middle);//万
if (qian<1000) {
result.append(zero);//若千位数为零,添加"零"
}
result.append(getNumString(operNumber%10E3));
result.append(low);//元
}else {//千级别
result=getNumString(operNumber);
result.append(low);//元
}
Double operFloat=Double.valueOf(moneySmall);
result.append(getFloatString(operFloat));
System.out.print("转换成大写格式后为:");
System.out.println(result);
System.out.println("*********************************");
}
/**
* 从键盘接收用户输入
*/
private static double getRMB() {
double money=0;
System.out.println("*********************************");
System.out.print("请输入人民币数:");
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
try {
money=Double.valueOf(reader.readLine());
while(money>10E11){
System.out.println("你输入的数值太大!请重输!");
money=Double.valueOf(reader.readLine());
}
} catch (NumberFormatException e) {
System.out.println("请正确输入数值!");
System.exit(-1);
} catch (IOException e) {
e.printStackTrace();
}
return money;
}
/**
* 得到人民币整数数值对应的大写表示方式
*/
private static StringBuffer getNumString(Double operNumber) {
StringBuffer result=new StringBuffer();
if (operNumber>1000) {
double tmp=operNumber;
int qian=(int)tmp/1000;
result.append(getString(qian)+"仟");
tmp=tmp-qian*1000;
if (tmp>100) {
int bai=(int)tmp/100;
result.append(getString(bai)+"佰");
tmp=tmp-bai*100;
if (tmp>10) {
int shi=(int)tmp/10;
result.append(getString(shi)+"拾");
tmp=tmp-shi*10;
if (tmp>0) {
int ge=(int)tmp;
result.append(getString(ge));
}
}else {
result.append("零");//十位为零
int ge=(int)tmp;
result.append(getString(ge));
}
}else {
result.append("零");//百位为零
if (tmp>10) {
int shi=(int)tmp/10;
result.append(getString(shi)+"拾");
tmp=tmp-shi*10;
if (tmp>0) {
int ge=(int)tmp;
result.append(getString(ge));
}
}else {
int ge=(int)tmp;
result.append(getString(ge));
}
}
}else if (operNumber>100) {
double tmp=operNumber;
int bai=(int)tmp/100;
result.append(getString(bai)+"佰");
tmp=tmp-bai*100;
if (tmp>10) {
int shi=(int)tmp/10;
result.append(getString(shi)+"拾");
tmp=tmp-shi*10;
if (tmp>0) {
int ge=(int)tmp;
result.append(getString(ge));
}
}else {
result.append("零");//十位为零
if (tmp>0) {
int ge=(int)tmp;
result.append(getString(ge));
}
}
}else if(operNumber>10){
double tmp=operNumber;
int shi=(int)tmp/10;
result.append(getString(shi)+"拾");
tmp=tmp-shi*10;
if (tmp>0) {
int ge=(int)tmp;
result.append(getString(ge));
}
}else {
double tmp=operNumber;
int ge=(int)tmp;
if(ge==0)
result.append("零");//处理输入的值为零的情况
else
result.append(getString(ge));
}
return result;
}
/**
* 得到人民币小数部分对应的大写表示方式
*/
private static StringBuffer getFloatString(Double operNumber) {
StringBuffer result=new StringBuffer();
if (operNumber>0) {
if (operNumber>10){
double tmp=operNumber;
int jiao=(int)tmp/10;
result.append(getString(jiao)+"角");
tmp=tmp-jiao*10;
if (tmp>0) {
int fen=(int)tmp;
result.append(getString(fen)+"分");
}
}else {
double tmp=operNumber;
int fen=(int)tmp;
result.append("零角"+getString(fen)+"分");
}
}else if (operNumber==0) {
result.append("零角零分");
}
return result;
}
/**
* 得到数字对应的汉字
*/
public static String getString(int number){
switch (number) {
case 1:
return Change.YI.getName();
case 2:
return Change.ER.getName();
case 3:
return Change.SAN.getName();
case 4:
return Change.SI.getName();
case 5:
return Change.WU.getName();
case 6:
return Change.LIU.getName();
case 7:
return Change.QI.getName();
case 8:
return Change.BA.getName();
case 9:
return Change.JIU.getName();
}
return null;
}
}
/**
* 每个数字对应的汉字
* @author mcqueen
*/
enum Change{
YI{public String getName(){
return "壹";
}
},
ER{public String getName(){
return "贰";
}
},
SAN{public String getName(){
return "叁";
}
},
SI{public String getName(){
return "肆";
}
},
WU{public String getName(){
return "伍";
}
},
LIU{public String getName(){
return "陆";
}
},
QI{public String getName(){
return "柒";
}
},
BA{public String getName(){
return "捌";
}
},
JIU{public String getName(){
return "玖";
}
},
SHI{public String getName(){
return "拾";
}
};
public abstract String getName();
}