前几天遇到的一道笔试题,将小写的人民币数值转换成大写形式,数值取值范围为: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();
}
分享到:
相关推荐
VB 将小写金额转换成大写金额,直接调用就可以了!!!
三个SQL函数:小写金额转换成人民币大写
在ACCESS中通过小写人民币转大写ACCESS函数可以把金额这项数据作为汉字显示或打印。支票、电汇凭证、记账凭证。
pb 小写数字转换成大写数字,支持到千万亿.
C语言成序设计__实现人民币小写金额与大写金额的转换
oracle中将小写金额转换为大写金额函数 oracle中将小写金额转换为大写金额函数
我的工作经常需要实现这个功能,以往需要手工转换,过去也找过一些小程序进行转换,不过在小程序中显示好好的字符拷进excel中竟成了乱码,现在有了这个公式,不用自己设置函数,直接拷贝+替换就完成。很棒! 在...
PB编写的把小写金额转换成大写金额的函数.
用c++语言将小写字母变大写字母 的代码
小写字母比大写字母ASCII码值大32,或写作ch=ch-‘a’+’A’
将随意给出的字符串中所有小写字母转换为大写字母。 【输入】 输入的文件为一个字符串,字符串的长度小于3000。 【输出】 全部为大写字母的字符串。 程序运行后结果示例: 【样例输入】 Founded in 1940, Chongqing ...
这是一个自己写的函数,用于将金额的小写转换为大写形式,用c++语言写的,但是思想可用于所有的语言中
实现人民币由数值转换成中文大写,其中包含进位、精确度的设置
excel小写数值如何转换为大写.doc
用MySQL函数实现 小写金额与大写金额的互转,用数据库来实现
汇编 从键盘输入一串英文字母,分别将其转换为大写、小写并输出,一个小程序 仅供初学者参考
给定一个字符串,将其中所有的小写字母转换成大写字母。 输入 输入一行,包含一个字符串(长度不超过100,可能包含空格)。 输出 输出转换后的字符串。 样例输入 helloworld123Ha 样例输出 HELLOWORLD123HA #...
VC++ 一个把小写金额转换成大写金额的函数。 如:¥12345.67元 -->壹万贰仟叁佰肆拾伍元陆角柒分。 ¥10001.02元 -->壹万零壹元零贰分 ¥10000.00元 -->壹万元整
create or replace function sf_get_money(p_num in number default null) 此函数处理数字小写金额转换为大写金额