黑马程序员技术交流社区
标题:
把金钱转换为大写.
[打印本页]
作者:
BackGaoz
时间:
2016-4-27 23:18
标题:
把金钱转换为大写.
package com.itheima;
import java.util.Scanner;
public class Test10 {
/*
* 第10题:
*
* 金额转换,阿拉伯数字转换成中国传统形式。
*
* 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
*
* 分析:
* 1.先定义字符数组,里边存储了中文数组.中文整数单位,中文小数单位
* 2.键盘录入一个金额,并转换成数字字符串
* 3.对字符串进行判断.如果超过了能转换的最大单位,提示金额过大
* 4.数字字符分为两部分,整数和小数
*/
private static final String[] chNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; //中文的数字
private static final String[] iunit = {"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟"}; //整数部分单位,最多十六位
private static final String[] dunit = { "角", "分", "厘" }; //小数部分的单位
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入金额");
String num = sc.nextLine();
System.out.println(toChineseNum(num));
}
private static String toChineseNum(String num) {
String integerLine; // 整数部分数字
String decimalLine; // 小数部分数字
//分别截取整数部分和小数部分
if (num.indexOf(".") > 0) { //做判断,有小数点并且小数点在0索引后边
integerLine = num.substring(0, num.indexOf(".")); //截取从第一个字符开始到小数点前一个字符,也就是整数部分
decimalLine = num.substring(num.indexOf(".") + 1); //截取从小数点后一位开始到字符串尾,就是小数部分
} else if (num.indexOf(".") == 0) { //判断如果该数字字符,第一位就是小数点
integerLine = "";
decimalLine = num.substring(1); //从小数点后一位开始截取小数部分
} else {
integerLine = num; //另外就是没有小数点,也就是只有整数部分
decimalLine = "";
}
//去掉整数部分的首0
if (!integerLine.equals("")) { //如果整数部分不为空串
integerLine = Long.toString(Long.parseLong(integerLine)); //就去掉首位的0
if (integerLine.equals("0")) { //如果整数部分为0
integerLine = ""; //将整数部分置位空串
}
}
//判断有没有超出转换的范围
if (integerLine.length() > iunit.length) { //能处理最长的长度是十六位
System.out.println("您输入的数字过大!");
return num;
}
//将整数部分和小数部分都转换为int数组
int[] integer = toArray(integerLine); //将整数部分转换为int数组
int[] decimal = toArray(decimalLine); //将小数部分转换为int数组
//获取整数部分的中文金额
String getChineseInteger = getChineseInteger(integer);
//获取小数部分的中文金额
String getChineseDecimal = getChineseDecimal(decimal);
return getChineseInteger + getChineseDecimal;
}
private static String getChineseDecimal(int[] decimal) {
StringBuffer chineseDe = new StringBuffer("");
for (int i = 0; i < decimal.length; i++) {
if (i == 3){ //如果小数有三为,第三位舍弃
break;
}
chineseDe.append(decimal[i] == 0 ? "" : (chNum[decimal[i]] + dunit[i])); //同整数部分一样添加单位和转换为中文数字
}
return chineseDe.toString();
}
private static String getChineseInteger(int[] integer) {
StringBuffer chineseIn = new StringBuffer(""); //创建一个StringBuffer来存储转换后的金额,因为Stringbuffer有添加功能
int len = integer.length; //获取传入金额数组的长度
/*
* 分析:
* 1.遍历数组,对每一个数字进行判断,并且声明一个String变量用于存储单位
* 2.如果说等于integer[i] == 0,就进行下一步判断
* 3.考虑如果是关键的地方为0,例如万,十万等等,就要做相应判断,看需要加哪个单位
* 4.如果不为0,就将对应的中文添加到String字符串
* 5.最后将Stringbuffer转换为字符串返回
*/
for (int i = 0; i < len; i++) {
String s = "";
if (integer[i] == 0) { //判断匹配上0才进入下层判断
if ((len - i) == 13) //len - i == 13,说明这是在万(亿)单位,接着把万单位放在String变量中
s = iunit[4];
else if ((len - i) == 9) //同上,说明是在亿单位
s = iunit[8];
else if ((len - i) == 5/* && b*/) // 万(不必填)
s = iunit[4];
else if ((len - i) == 1) //如果出现关键单位,就用零代替,例如万,十万....
s = iunit[0];
if ((len - i) > 1 && integer[i + 1] != 0) //如果遇到0就补上一个零,不包含最后一位
s += chNum[0];
}
chineseIn.append(integer[i] == 0 ? s : (chNum[integer[i]] + iunit[len - i - 1])); //如果匹配不是0,就用将中文字符添加到新定义的StringBuffer字符串
}
return chineseIn.toString(); //最后返回一个字符串,用到Stringbuffer中的toString()方法
}
private static int[] toArray(String s) {
int[] arr = new int[s.length()]; //创建一个和传入的字符串等长度的数组
for (int i = 0; i < arr.length; i++) { //遍历数组
arr[i] = Integer.parseInt(s.substring(i, i + 1)); //从字符串中第一个字符开始往数组中添加
}
return arr;
}
}
复制代码
注释已经写在代码后了,希望大家能看懂我写的注释
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2