编写一个小程序,将数字转换成中文大写。如,10.5转换结果为:拾点伍
解决方案 »
- 大家帮忙看一个继承的问题
- 菜鸟求教~~
- 求一正则表达式的写法,20分,答完既结
- 帮忙 new FileFilterDemo(); 老显示错误啊
- log4j可否支持这样的需求:DEBUG的打印到日志上,ERROR的写日志文件 这样可以实现吗?
- 请问java大牛,在java中是否有鼠标拖动控件,控件随着鼠标移动,直到放下的api??谢谢
- tomcat 出现找不到文件 -Djava.endorse.dirs= 求救
- 加入图象
- j2sdkee的初级问题
- 刚刚学习java便遇到问题, 请求帮助。
- Java中Vector类用法疑问?
- 求救,我做了一个发送图片的发送端和接收端,但是可能是因为接收端的一些问题导致不能让JTextPane按路径显示图片,在这里求救各位JAVA高手
/*
* 关于说明:
* 一、(123.45)读作(一佰贰拾叁)点(肆伍),整数部位与小数部位的读法是不同的,因此将两部份分开读;
* 二、小数部分是纯数字读取,不做深入说明;
* 三、整数部分读取方法 1 2 3 4 5 6 7 8 9
* 对应单位 亿 仟 佰 拾 萬 仟 佰 拾 元
* 由上下上下一组组读作:一亿贰仟叁佰肆拾伍萬陆仟柒佰捌拾玫元;
* 四、出现零时的情况:
* (103)读作一佰零叁,零的单位十没有读;
* (10003)读作一万零叁,多个零只读一次;
* (100003)读作一拾萬零叁,万位为零时单位也要读,且万之前的零都不读;
* (100000003)读作一亿零叁,此时万位为零,单位不读;
* 五、最多只读10亿以内的数;
*/
// 定义其整数部分;
private String integerPart;
// 定义其小数部分;
private String pointPart;
// 中文大写数字定义 ;
private static final char num[] = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒',
'捌', '玖' };
// 单位定义;至于为什么这样定义,请参照说明二;
private static final char unit[] = { '元', '拾', '佰', '仟', '萬', '拾', '佰',
'仟', '亿' };
// 假设要转换的数通过字符串形式传入构造方法中,或者其他,不多说了。
public NumToCn(String numString) {
integerPart = "";
pointPart = "";
//判断这数是不是真的合格的数字;
if(numString.startsWith("0")) {
System.out.println("大哥,你这是什么数字啊。");
System.exit(-1);
}
// 判断是否是小数;
if (numString.contains(".")) {
// 定位点的位置;
int pointLoc = numString.indexOf(".");
// 得到整数部分;substring方法自查API;
integerPart = numString.substring(0, pointLoc);
// 得到小数部分;
pointPart = numString.substring(pointLoc + 1);
} else {
integerPart = numString;
}
if(integerPart.length() > 9) {
System.out.println("你丫的,搞这么大的数干什么啊?我只给你读最多9位的数,其它靠边");
System.exit(-1);
}
}
//用于判断万位,十万位,百万位,千万位是不是都为零;
public boolean searchNum() {
boolean allIsZero = true;
//只有九个数的数,才有可能都为零。如900002222;
if(integerPart.length() == 9) {
for(int i=1; i<5; i++) {
int number = Integer.parseInt(String.valueOf(integerPart.charAt(i)));
if(number != 0) {
allIsZero = false;
break;
}
}
}
return allIsZero;
}
//将数字转中文的主要逻辑;
public String getString() {
StringBuffer sb = new StringBuffer();
//用于判断前一位数是不是为零;
boolean isZeroBefore = false;
for (int i = 0; i < integerPart.length(); i++) {
// 从左到右,得到相应的数字;本来应该写个方法明白点,时间有限,不好意思。这里是先将拿到的字符转成字符串,再转成整型。同理,自查API;
int number = Integer.parseInt(String.valueOf(integerPart.charAt(i)));
if (number != 0) {
isZeroBefore = false;
// 得到数是多少,加入的中文大写就是多少;
sb.append(num[number]);
// 紧接着加入相应的单位;
sb.append(unit[integerPart.length() - i - 1]);
//这里的条件需要说明:对应的数为零,且之前一位不是零,但万位特殊处理;
}else if (number == 0 && !isZeroBefore && i != (integerPart.length()-5)) {
isZeroBefore = true;
sb.append(num[number]);
//关于对万位的处理;
}else if (number == 0 && i==(integerPart.length()-5) && !searchNum()) {
//万位之前的零都去掉;
while(sb.toString().endsWith("零")) {
sb.deleteCharAt(sb.length()-1);
}
sb.append(unit[integerPart.length() - i - 1]);
isZeroBefore = false;
}
}
//小数部份,直接加数字就行了。
if (pointPart.length() > 0) {
sb.append("点");
for (int i = 0; i < pointPart.length(); i++) {
int number = Integer.parseInt(String.valueOf(pointPart
.charAt(i)));
sb.append(num[number]);
}
}
if (pointPart.length() == 0) {
sb.append("整");
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(new NumToCn("104.19").getString());
System.out.println(new NumToCn("1004.29").getString());
System.out.println(new NumToCn("10004.39").getString());
System.out.println(new NumToCn("100004.49").getString());
System.out.println(new NumToCn("1000004.59").getString());
System.out.println(new NumToCn("10000004.69").getString());
System.out.println(new NumToCn("100000004.79").getString());
System.out.println(new NumToCn("234534.69").getString());
System.out.println(new NumToCn("324563634").getString());
System.out.println(new NumToCn("324456").getString());
System.out.println(new NumToCn("456").getString());
}
}