第一版
package com.demo;
/**
* @author Administrator
* @date 2018/11/29 22:46
*/
public class NumToChinese {
private String[] suffixArr = new String[]{"", "拾", "佰", "仟", "万", "拾万", "佰万", "仟万", "亿", "拾亿", "佰亿", "仟亿"};
private String[] prefixArr = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
private String operateNum(int num) {
String value = String.valueOf(num);
StringBuilder result = new StringBuilder();
for (int i = 0; i < value.length(); i++) {
result.append(prefixArr[(int) value.charAt(i) - 48]);
result.append(suffixArr[value.length() - 1 - i]);
}
return result.toString();
}
public static void main(String[] args) {
System.out.println(new NumToChinese().operateNum(12345));
}
}
输出结果
壹万贰仟叁佰肆拾伍
缺点:
1.不支持小数
2.如果末尾为小数,则会出现零
3.如果连续两个零,会出现零零等
第二版
更新功能:1.支持小数的输入2.支持连续两个零的输入3.对小数点后的连续零不做过滤
package com.demo;
/**
* @author Administrator
* @date 2018/11/29 22:46
*/
public class NumToChinese {
private String[] suffixArr = new String[]{"", "拾", "佰", "仟", "万", "拾万", "佰", "仟", "亿", "拾", "佰", "仟"};
private String[] prefixArr = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
private String operateNum(double num) {
String value = String.valueOf(num);
String prefixValue = value.split("\\.")[0];
String suffixValue = value.contains(".") ? value.split("\\.")[1] : "";
StringBuilder result = new StringBuilder();
//计算小数前后的数字变大写
for (int i = 0; i < prefixValue.length(); i++) {
result.append(prefixArr[(int) prefixValue.charAt(i) - 48]);
result.append(suffixArr[prefixValue.length() - 1 - i]);
}
result = new StringBuilder(result.toString().replaceAll("零.?零.?", "零"));
//计算小数点后的数字变大写
for (int i = 0; i < suffixValue.length(); i++) {
if (i == 0) {
result.append("点");
}
result.append(prefixArr[(int) suffixValue.charAt(i) - 48]);
}
return result.toString();
}
public static void main(String[] args) {
System.out.println(new NumToChinese().operateNum(1200345.001));
}
}
输出结果
壹佰贰拾万零叁佰肆拾伍点零零壹
缺点:1.对于两个以上的零则还无法过滤2.double如果数字过大,会自动转为科学计数法,造成下标溢出
第三版
更新功能:1.支持多个零的过滤2.Java中输入数字会造成精度丢失,因此采用输入前缀与后缀进行判别
package com.demo;
import java.math.BigDecimal;
/**
* @author Administrator
* @date 2018/11/29 22:46
*/
public class NumToChinese {
private String[] suffixArr = new String[]{"", "拾", "佰", "仟", "万", "拾万", "佰", "仟", "亿", "拾", "佰", "仟"};
private String[] prefixArr = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
private String operateNum(long prefix, long suffix) {
String prefixValue = String.valueOf(prefix);
String suffixValue = String.valueOf(suffix);
String result = "";
//计算小数前后的数字变大写
for (int i = 0; i < prefixValue.length(); i++) {
result += prefixArr[(int) prefixValue.charAt(i) - 48];
result += suffixArr[prefixValue.length() - 1 - i];
}
result = result.replaceAll("零.?零.?(零.?)*", "零");
//计算小数点后的数字变大写
for (int i = 0; i < suffixValue.length(); i++) {
if (i == 0) {
result += "点";
}
result += prefixArr[(int) suffixValue.charAt(i) - 48];
}
return result;
}
public static void main(String[] args) {
System.out.println(new NumToChinese().operateNum(120000045,12345));
}
}