题解 | #人民币转换#
人民币转换
https://www.nowcoder.com/practice/00ffd656b9604d1998e966d555005a4b
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextDouble()) { // 注意 while 处理多个 case
double d = in.nextDouble();
LogI("d:" + d);
String chinese = changeToChinese(d);
LogI("chinese:" + chinese);
String unit = addUnit(chinese);
LogI("unit:" + unit);
String nozero = removeZero(unit);
LogI("nozero:" + nozero);
String noYishi = removeYiShi(nozero);
LogI("noYishi:" + noYishi);
String noZeroYuan = removeZeroYuan(noYishi);
String fix = addPreFixEndEndFix(noZeroYuan);
LogI("fix:" + fix);
System.out.print(fix);
}
}
public static String changeToChinese(double d) {
String strD = d + "";
int indexPoint = strD.indexOf('.');
if (indexPoint > -1 && indexPoint + 2 < strD.length()) {
strD = strD.subSequence(0, indexPoint + 3).toString();
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < strD.length(); i++) {
sb.append(getChineseCap(strD.charAt(i)));
}
return sb.toString();
}
public static String addUnit(String s) {
int indexOfYuan = s.indexOf('.');
StringBuilder sb = new StringBuilder(s);
if (indexOfYuan + 2 < sb.length()) {
sb.insert(indexOfYuan + 3, "分");
}
if (indexOfYuan + 1 < sb.length()) {
sb.insert(indexOfYuan + 2, "角");
}
sb.replace(indexOfYuan, indexOfYuan + 1, "元");
for (int i = indexOfYuan - 2; i >= 0; i--) {
char c = sb.charAt(i);
sb.insert(i + 1, getUnit(indexOfYuan - i));
LogI(" addUnit c:" + c + " i " + i + " indexOfYuan:" + indexOfYuan);
}
return sb.toString();
}
public static String removeZero(String s) {
int indexOfYuan = s.indexOf('元');
StringBuilder sb = new StringBuilder(s);
int findIndex = -1;
if ((findIndex = sb.indexOf("零分")) > -1 ) {
sb.delete(findIndex, findIndex + 2);
}
if ((findIndex = sb.indexOf("零角")) > -1 ) {
sb.delete(findIndex, findIndex + 2);
}
for (int i = 0; i < indexOfYuan - 2; i++) {
char c = sb.charAt(i);
if (c == '零' && isUnit(sb.charAt(i + 1))) {
if (sb.charAt(i + 1) == '万' || sb.charAt(i + 1) == '亿') {
continue;
}
sb.delete(i + 1, i + 2) ;
indexOfYuan -= 1;
}
}
indexOfYuan = sb.indexOf("元");
for (int i = 0; i < indexOfYuan - 2; i++) {
char c = sb.charAt(i);
if (c == '零' && sb.charAt(i + 1) == '零') {
sb.delete(i + 1, i + 2);
indexOfYuan -= 1;
}
}
int index = -1 ;
while((index = sb.indexOf("零万")) > -1) {
sb.delete(index, index + 1);
}
while((index = sb.indexOf("零亿")) > -1) {
sb.delete(index, index + 1);
}
while((index = sb.indexOf("亿万")) > -1) {
sb.delete(index+1, index + 2);
}
return sb.toString();
}
public static String removeYiShi(String s) {
StringBuilder sb = new StringBuilder(s);
int index = -1;
while ((index = sb.indexOf("壹拾")) > -1) {
sb.delete(index, index + 1);
}
return sb.toString();
}
public static String removeZeroYuan(String s) {
StringBuilder sb = new StringBuilder(s);
int index = sb.indexOf("零元");
if(index == 0 && sb.length() != 2) {
sb.delete(index, index + 2);
}
if(index > 0) {
sb.delete(index, index + 1);
}
return sb.toString();
}
public static String addPreFixEndEndFix(String s) {
StringBuilder sb = new StringBuilder("人民币");
sb.append(s);
if (s.endsWith("元")) {
sb.append("整");
}
return sb.toString();
}
public static String getChineseCap(char n) {
switch (n) {
case '0' :
return "零";
case '1' :
return "壹";
case '2' :
return "贰";
case '3' :
return "叁";
case '4' :
return "肆";
case '5':
return "伍";
case '6':
return "陆";
case '7':
return "柒";
case '8' :
return "捌";
case '9' :
return "玖";
case '.':
return ".";
default:
return "";
}
}
public static String getUnit(int l) {
if (l > 0 && l % 9 == 0) return "亿";
if (l > 8) {
l = l % 8 ;
}
if (l > 0 && l % 5 == 0) return "万";
if (l > 4) {
l = l % 4 ;
}
switch (l) {
case -2 :
return "分";
case -1 :
return "角";
case 1 :
return "元";
case 2 :
return "拾";
case 3 :
return "佰";
case 4:
return "仟";
case 5:
return "万";
case 9:
return "亿";
default:
return "";
}
}
public static Boolean isUnit(char c) {
if (c == '分' || c == '角' || c == '元'
|| c == '拾' || c == '佰' || c == '仟'
|| c == '万' || c == '亿' ) {
return true;
}
return false;
}
public static boolean onlyZero(String s) {
if (s == null || s.length() <= 0) return false;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) != '0') return false;
}
return true;
}
public static void LogE(String msg) {
System.out.println("Error:" + msg);
}
public static void LogI(String msg) {
// System.out.println("Info:" + msg);
}
}
查看30道真题和解析