import java.text.DecimalFormat;
import java.util.Scanner;
/**
* @Description: 金額轉換成大寫
* @author huangzjb
* @mail [email protected]
* @Company Digital China
* @date 2015-1-30
*/
public class ChineseCurrency {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("請輸入人民币金額:");
while (true) {
double number = s.nextDouble();
if(number > 10000000000000000.0)
{
System.out.println("金額太大,超出16位最大的整數!");
continue;
}
System.out.println(toChineseCurrency(new Double(number)));
}
}
public static String toChineseCurrency(Number number) {
String targetNumber = new DecimalFormat("#.00").format(number);
String result = "";
targetNumber = targetNumber.replaceAll("\\.", "");
char[] digit = { '零', '壹', '貳', '叁', '肆', '伍', '陸', '柒', '捌', '玖' };
String unit = "仟佰拾兆仟佰拾億仟佰拾萬仟佰拾元角分";
int unitLength = unit.length();
StringBuffer unitSb = new StringBuffer(unit);
StringBuffer resultSb = new StringBuffer(result);
for (int i = targetNumber.length() - 1; i >= 0; i--){
resultSb = unitSb.insert(unitLength - targetNumber.length() + i, digit[(targetNumber.charAt(i) - 0x30)]);//根據金額數字所在的位置,把它們對應的大寫漢字和後面的機關('萬仟佰拾...')拼接起來
}
result = resultSb.toString();
//System.out.println((l + s.length() )== sb.length());
result = result.substring(unitLength - targetNumber.length(), unitLength + targetNumber.length());//根據金額數字的長度,把前面超出範圍的機關截掉(比如234.12,要把前面的'仟佰拾兆仟佰拾億仟佰拾萬仟'去掉..)
//System.out.println(result);
/*result = result.replaceAll("零[拾佰仟]", "零").replaceAll("零{2,}", "零")
.replaceAll("零([兆億萬元])", "$1").replaceAll("零[角分]", "");*/
result = result.replaceAll("零[拾佰仟]", "零")
.replaceAll("零{2,}", "零")//有多個零連在一起,隻取一個零
.replaceAll("([拾佰仟])零([兆億萬])", "$1$2")//可以了解為把金額從低位到高位分為四組,每組四位,這一步是去除每一組(不全為零)末尾的零
.replaceAll("零[兆億萬]", "")//處理四位數全為零的組
.replaceAll("零元", "元"). replaceAll("零[角分]", "");
if (result.endsWith("角"))
result += "零分";
if (!result.contains("角") && !result.contains("分") && result.contains("元"))
result += "整";
if (result.contains("分") && !result.contains("整") && !result.contains("角"))
result = result.replace("元", "元零");
return result;
}
}