虽然比较地繁琐,但是性能还可以
public class Solution {
public String num2cn (int n) {
// write code here
boolean negative = false;
if(n==0){
return "零";
}
//变负为正
if(n<0){
n=Math.abs(n);
negative=true;
}
StringBuilder stringBuilder = new StringBuilder();
//整数转字符串
String res = String.valueOf(n);
String[] splits = res.split("");
int length = splits.length;
//构建单位集合,注意重量级的单位要倒过来写
HashMap<Integer,String> unitMap = new HashMap<>();
unitMap.put(1,"十");
unitMap.put(2,"百");
unitMap.put(3,"千");
unitMap.put(4,"万");
unitMap.put(5,"万十");
unitMap.put(6,"万百");
unitMap.put(7,"万千");
unitMap.put(8,"亿");
unitMap.put(9,"亿十");
//构建数字集合
HashMap<String,String> numberMap = new HashMap<>();
numberMap.put("0","零");
numberMap.put("1","一");
numberMap.put("2","二");
numberMap.put("3","三");
numberMap.put("4","四");
numberMap.put("5","五");
numberMap.put("6","六");
numberMap.put("7","七");
numberMap.put("8","八");
numberMap.put("9","九");
//将阿拉伯数字转为中文
for (int i = length - 1; i >= 0; i--) {
String temp = splits[i];
if(!temp.equals("0")){
stringBuilder.append(unitMap.getOrDefault(length-i-1,""));
stringBuilder.append(numberMap.get(temp));
} else {
stringBuilder.append("零");
}
}
//去除最左边连续的零
while (stringBuilder.charAt(0)=='零'){
stringBuilder.deleteCharAt(0);
}
//去除中间部分连续的零,只保留一个零
for (int i = stringBuilder.length()-1; i >=0; i--) {
if(stringBuilder.charAt(i)=='零'&&stringBuilder.charAt(i+1)=='零'){
stringBuilder.deleteCharAt(i);
}
}
//去掉最前面的一十中的一
if(stringBuilder.charAt(stringBuilder.length()-1)=='一'&&
stringBuilder.charAt(stringBuilder.length()-2)=='十'){
stringBuilder.deleteCharAt(stringBuilder.length()-1);
}
//如果是负数还要添加负字
if(negative){
stringBuilder.append("负");
}
StringBuilder reverseStringBuilder = stringBuilder.reverse();
//因为亿字有重复,所以要去掉多余的亿,只留一个亿字
int index = 0;
for (int i = 0; i < reverseStringBuilder.length(); i++) {
if(reverseStringBuilder.charAt(i)=='亿'){
index++;
}
}
while (index>1){
for (int i = 0; i < reverseStringBuilder.length(); i++) {
if(reverseStringBuilder.charAt(i)=='亿'){
reverseStringBuilder.deleteCharAt(i);
break;
}
}
index--;
}
//因为万字有多余,所以要去掉多余的万字,只留一个万字
index = 0;
for (int i = 0; i < reverseStringBuilder.length(); i++) {
if(reverseStringBuilder.charAt(i)=='万'){
index++;
}
}
while (index>1){
for (int i = 0; i < reverseStringBuilder.length(); i++) {
if(reverseStringBuilder.charAt(i)=='万'){
reverseStringBuilder.deleteCharAt(i);
break;
}
}
index--;
}
return reverseStringBuilder.toString();
}
}