做的是将整数做一个汉字表达,算上面这两个的结合。若是作业一则需要改静态数组即可;若是作业二则需要将字串分解判断,以小数点分割,分成两个部分做,然后拼接即可。
先贴代码,注释有解释
1、从后往前,8个8个分为一组,一组表示单位亿
2、由于我们是从后往前处理,而结果是从前往后读,因此根据栈的先进后出结构,每组保留结果入栈,保证最后一组虽然是先计算,但是最后被读出来。
public class myNum2Rmb {
public static void main(String[] args) {
TransferReader f = new TransferReader();
String result = f.simpleTransfer("90000");
System.out.println(result);
}
}
class TransferReader{
private static final String numArr[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private static final String unitsArr[] = {"","拾","佰","仟","萬","拾","佰","仟"};
public String simpleTransfer(String moneyStr){
//由于我们是从后往前先存后面的,所以需要一个先进后出的栈
Stack<String> retStack = new Stack<>();
//保存最终结果的StringBuilder
StringBuilder ret = new StringBuilder("");
//总字串的长度
int length = moneyStr.length();
//每组取8个 进行for循环 总共循环(length + 7) / 8 次 每次循环完 length - 8
for (int i = 0; i < (length + 7) / 8; length -= 8){
//从后往前截取字符串 每次8个 同时加上最后不足8的一组的下标判断
String string = moneyStr.substring(length - 8 > 0 ? length - 8 : 0,length);
//将每个分组转换为char数组
char numChar[] = string.toCharArray();
//测试用 System.out.println(string);
//每一组的结果拼接
StringBuilder tempRet = new StringBuilder("");
//因为每组是以亿为分割 在组间需要加上一个亿为单位
//如果当前不是最后一个分组,则先加上一个亿单位
if (length - 8 > 0){
tempRet.append("亿");
}
//对每组遍历
for (int j = 0; j < numChar.length; j ++){
//每次判断完操作完都进行continue 进行下一次循环 避免重复判断
//如果开头就是0 那么就是零
if (numChar[j] - 48 == 0 && j == 0){
tempRet.append("零");
continue;
}
//中间的零 填充零
if ((numChar[j] - 48) == 0 && j != 0 && (numChar[j -1] - 48 != 0)){
tempRet.append("零");
continue;
}
//这个是0 前面还是0 连续的零不用重复读 所以跳过
if ((numChar[j] - 48) == 0 && j != 0 && (numChar[j -1] - 48 == 0)){
continue;
}
//非 0 数字 进行数字和单位的拼接
if (numChar[j] - 48 != 0){
// numChar[j] - 48 就是这个数字本身 numArr是该数字下标对应的汉字
// numChar.length - 1 - j 是对应单位的下标
tempRet.append(numArr[numChar[j] - 48]).append(unitsArr[numChar.length - 1 - j]);
continue;
}
}
//根据上面的流程,如果是 90000 则会出现 九万零 所以如果一直到最后一个都是零的话 要去除最后一个“零”汉字
if (numChar[numChar.length - 1] - 48 == 0){
tempRet.deleteCharAt(tempRet.length() -1 );
}
System.out.println("这一组的tempR 为 " + tempRet);
//将一组结果入栈
retStack.push(tempRet.toString());
}
// 以此出栈
while (!retStack.empty()){
ret.append(retStack.pop());
}
//返回最终结果
return ret.toString();
}
}
主要步骤
1、如何对数字和单位的拼接,由于单位不能通过算法来扩张,单位上的限制需要自己来编写,由此需要编写一个单位数组unitsArr[]
,还有一个中文数字数组numArr[]
2、其次就是对非结尾和结尾### 零 ###的处理,对每个数字的判断逻辑。
3、对于每个分组的处理,最后拼接
end
这里没有对字符串合法性进行检查,比如“090”则会输出“零九十”;如果有需求,在输入前进行正则表达式检查即可。