import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Scanner;
public class AmountOfConversion {
//定義HashMap的value值
public static final String EMPTY = "";
public static final String ZERO = "零";
public static final String ONE = "壹";
public static final String TWO = "貳";
public static final String THREE = "叁";
public static final String FOUR = "肆";
public static final String FIVE = "伍";
public static final String SIX = "陸";
public static final String SEVEN = "柒";
public static final String EIGHT = "捌";
public static final String NINE = "玖";
public static final String TEN = "拾";
public static final String HUNDRED = "佰";
public static final String THOUSAND = "仟";
public static final String TEN_THOUSAND = "萬";
public static final String HUNDRED_MILLION = "億";
public static final String YUAN = "元";
public static final String JIAO = "角";
public static final String FEN = "分";
public static final String DOT = ".";
private static AmountOfConversion formatter = null;
//創(chuàng)建AmountOfConversion的實(shí)例對象
//創(chuàng)建初始化一個HashMap對象
private HashMap NumberMap = new HashMap();
private HashMap HighnumberofMoney = new HashMap();
//創(chuàng)建初始化一個NumberFormat對象
private NumberFormat numberFormat =
NumberFormat.getInstance();
private AmountOfConversion() {
//在用new創(chuàng)建AmountOfConversion對象時(shí),
為HashMap對象進(jìn)行key-value的映射
numberFormat.setMaximumFractionDigits(4);
//設(shè)置數(shù)據(jù)的小數(shù)部分的最大位數(shù)是4位
numberFormat.setMinimumFractionDigits(2);
//設(shè)置數(shù)據(jù)的小數(shù)部分的最小位數(shù)是2位
numberFormat.setGroupingUsed(false);
/*設(shè)置此格式中是不可以使用組。如果設(shè)置可以使用組,
則數(shù) 1234567 可能被格式化為 "1,234,567"*/
NumberMap.put("0", ZERO);
NumberMap.put("1", ONE);
NumberMap.put("2", TWO);
NumberMap.put("3", THREE);
NumberMap.put("4", FOUR);
NumberMap.put("5", FIVE);
NumberMap.put("6", SIX);
NumberMap.put("7", SEVEN);
NumberMap.put("8", EIGHT);
NumberMap.put("9", NINE);
NumberMap.put(DOT, DOT);
HighnumberofMoney.put("1", TEN);
HighnumberofMoney.put("2", HUNDRED);
HighnumberofMoney.put("3", THOUSAND);
HighnumberofMoney.put("4", TEN_THOUSAND);
HighnumberofMoney.put("5", TEN);
HighnumberofMoney.put("6", HUNDRED);
HighnumberofMoney.put("7", THOUSAND);
HighnumberofMoney.put("8", HUNDRED_MILLION);
}
public static AmountOfConversion getInstance() {
//判斷AmountOfConversion對象formatter是否初始化
if (formatter == null)
formatter = new AmountOfConversion();
return formatter;
}
//進(jìn)行金額轉(zhuǎn)換的多種數(shù)據(jù)類型
public String format(String moneyStr) {
String result = "不能進(jìn)行金額轉(zhuǎn)換!!";
if(isConversion(moneyStr)){
result = convertIntegerTochinese(moneyStr);
result = convertPointTochinese(result);
}
return result;
}
public String format(double moneyDouble) {
return format(numberFormat.format(moneyDouble));
}
public String format(int moneyInt) {
return format(numberFormat.format(moneyInt));
}
public String format(long moneyLong) {
return format(numberFormat.format(moneyLong));
}
public String format(Number moneyNum) {
return format(numberFormat.format(moneyNum));
}
private String convertIntegerTochinese(String moneyStr) {
//將參數(shù)中傳入的阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文
String result;
StringBuffer C2CStrBufer = new StringBuffer();
for (int i = 0; i < moneyStr.length(); i++) {
C2CStrBufer.append(NumberMap.get(moneyStr.substring(
i, i + 1)));
}
// 拾佰仟萬億等都是漢字里面才有的單位,加上它們
int indexOfDot = C2CStrBufer.indexOf(DOT);
int moneyPatternCursor = 1;
for (int i = indexOfDot - 1; i > 0; i--) {
C2CStrBufer.insert(i, HighnumberofMoney.get(EMPTY
+ moneyPatternCursor));
moneyPatternCursor = moneyPatternCursor == 8 ? 1
: moneyPatternCursor + 1;
}
String fractionPart = C2CStrBufer.substring(C2CStrBufer
.indexOf("."));
C2CStrBufer.delete(C2CStrBufer.indexOf("."),
C2CStrBufer.length());
while (C2CStrBufer.indexOf("零拾") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零拾"),
C2CStrBufer.indexOf("零拾") + 2, ZERO);
}
while (C2CStrBufer.indexOf("零佰") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零佰"),
C2CStrBufer.indexOf("零佰") + 2, ZERO);
}
while (C2CStrBufer.indexOf("零仟") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零仟"),
C2CStrBufer.indexOf("零仟") + 2, ZERO);
}
while (C2CStrBufer.indexOf("零萬") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零萬"),
C2CStrBufer.indexOf("零萬") + 2, TEN_THOUSAND);
}
while (C2CStrBufer.indexOf("零億") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零億"),
C2CStrBufer.indexOf("零億") + 2, HUNDRED_MILLION);
}
while (C2CStrBufer.indexOf("零零") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零零"),
C2CStrBufer.indexOf("零零") + 2, ZERO);
}
if (C2CStrBufer.lastIndexOf(ZERO) == C2CStrBufer.length() - 1)
C2CStrBufer.delete(C2CStrBufer.length() - 1,
C2CStrBufer.length());
C2CStrBufer.append(fractionPart);
result = C2CStrBufer.toString();
return result;
}
private String convertPointTochinese(String moneyStr) {
//對小數(shù)點(diǎn)后面的數(shù)字進(jìn)行漢字處理
String result;
StringBuffer C2CStrBufer = new StringBuffer(moneyStr);
int indexOfDot = C2CStrBufer.indexOf(DOT);
C2CStrBufer.replace(indexOfDot, indexOfDot + 1, YUAN);
C2CStrBufer.insert(C2CStrBufer.length() - 1, JIAO);
C2CStrBufer.insert(C2CStrBufer.length(), FEN);
if (C2CStrBufer.indexOf("零角零分") != -1)// 沒有零頭,加整
C2CStrBufer.replace(C2CStrBufer.indexOf("零角零分"),
C2CStrBufer.length(), "整");
else if (C2CStrBufer.indexOf("零分") != -1)// 沒有零分,加整
C2CStrBufer.replace(C2CStrBufer.indexOf("零分"),
C2CStrBufer.length(), "整");
else {
if (C2CStrBufer.indexOf("零角") != -1)
C2CStrBufer.delete(C2CStrBufer.indexOf("零角"),
C2CStrBufer.indexOf("零角") + 2);
}
result = C2CStrBufer.toString();
return result;
}
private boolean isConversion(String moneyStr) {
//判斷參數(shù)傳來的數(shù)據(jù)是否符合進(jìn)行轉(zhuǎn)換的條件
int fractionDigits = moneyStr.length() -
moneyStr.indexOf(DOT) - 1;
boolean flag = true;
if (fractionDigits > 2){
System.out.println("金額" + moneyStr + "
的小數(shù)位多于兩位。");
// 精度不能比分低
flag = false;
}
return flag;
}
public static void main(String args[]) {
System.out.println("請輸入金額數(shù):");
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
System.out.println("轉(zhuǎn)換后的金額為:");
System.out.println(getInstance().format(new Double(str)));
}
}