题解 | #阿拉伯数字转中文#
阿拉伯数字转中文
https://www.nowcoder.com/practice/6eec992558164276a51d86d71678b300
import java.util.*;
/**
* NC340 阿拉伯数字转中文
* @author d3y1
*/
public class Solution {
private HashMap<Integer, String> numMap = new HashMap<Integer, String>(){{
put(0, "零");
put(1, "一");
put(2, "二");
put(3, "三");
put(4, "四");
put(5, "五");
put(6, "六");
put(7, "七");
put(8, "八");
put(9, "九");
}};
private HashMap<Integer, String> map = new HashMap<Integer, String>(){{
put(0, "");
put(1, "十");
put(2, "百");
put(3, "千");
put(4, "万");
put(5, "亿");
}};
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return string字符串
*/
public String num2cn (int n) {
if(n == 0){
return "零";
}
String numStr = String.valueOf(n);
StringBuilder result = new StringBuilder();
boolean isNegative = false;
if(numStr.startsWith("-")){
isNegative = true;
if(numStr.length() > 1){
numStr = numStr.substring(1);
}
}
// 按4位分隔处理
int len = numStr.length();
int parts = (int)Math.ceil(len/4.0);
int start, end;
String partResult = "";
String partNum;
for(int i=0; i<parts; i++){
start = len-(i+1)*4;
if(start < 0){
start = 0;
}
end = len-i*4;
partNum = numStr.substring(start, end);
if(partNum.equals("0000")){
continue;
}
partResult = partNum2CN(partNum);
if(i > 0){
partResult += map.get(i+3);
}
result.insert(0, partResult);
}
if(isNegative){
result.insert(0, "负");
}
return result.toString();
}
private String partNum2CN(String numStr){
StringBuilder sb = new StringBuilder();
// 从左到右 第一个非零索引 first non-zero index
int FNZIndex = -1;
// 从右到左 第一个非零索引 last non-zero index
int LNZIndex = -1;
if(numStr.length() > 0){
for(int i=0; i<numStr.length(); i++){
if(numStr.charAt(i) != '0'){
FNZIndex = i;
break;
}
}
if(FNZIndex == -1){
return "";
}
for(int i=numStr.length()-1; i>=0; i--){
if(numStr.charAt(i) != '0'){
LNZIndex = i;
break;
}
}
char ch;
boolean hasZero = false;
int len = numStr.length();
for(int i=0; i<len; i++){
ch = numStr.charAt(i);
if(ch == '0'){
if(FNZIndex<i && i<LNZIndex && !hasZero){
sb.append("零");
hasZero = true;
}
if(i<FNZIndex && !hasZero){
sb.append("零");
hasZero = true;
}
}else{
// 十位为一的情况 1011->一千零十一 1000000000->十亿
if(ch=='1' && len-1-i==1){
if(i > 0){
if(numStr.charAt(i-1)=='0'){
sb.append(map.get(len-1-i));
}else{
sb.append(numMap.get(ch-'0')).append(map.get(len-1-i));
}
}
else{
sb.append(map.get(len-1-i));
}
}else{
sb.append(numMap.get(ch-'0')).append(map.get(len-1-i));
}
}
}
}
return sb.toString();
}
}
