Java 將小寫金額轉換成大寫金額
阿新 • • 發佈:2019-01-27
將小寫金額轉換成大寫金額
例如:110.00轉換後為 壹佰壹拾圓整
程式碼如下
/**
* 將小寫金額轉換為大寫
*
* @param amount
* 110.00
* @return 壹佰壹拾圓整
*/
public static String amountToUpper(String amount) throws Exception {
// String[] lowerAmount = { "0", "1", "2", "3", "4", "5", "6", "7", "8",
// "9" };
String[] upperAmount = { "零", "壹", "貳", "叄", "肆", "伍", "陸", "柒", "捌",
"玖" };
String[] unit = { "分", "角", "圓", "拾", "佰", "仟", "萬", "億" };
String wholeUnit = "整";
StringBuffer result = new StringBuffer();
if (StringUtil.isEmpty(amount)) { return "" ; }
// 為0
if (Double.valueOf(amount) == 0) { return upperAmount[0]; }
// 去掉開頭和結尾的0
amount = amount.replaceAll("^0*", "");
if (amount.startsWith(".")) {
amount = "0" + amount;
}
if (amount.indexOf(".") > -1) {
amount = amount.replaceAll ("0*$|\\.0{1,2}$", "");
}
// 判斷格式
Pattern p = Pattern.compile("\\d{1,12}(\\.\\d{1,2})?");
Matcher m = p.matcher(amount);
if (!m.matches()) { throw new Exception("金額格式不正確! "); }
// 分成整數和小數分別讀
String whole = "";
String integral = "";
if (amount.indexOf(".") > -1) {
whole = amount.split("\\.")[0];
integral = amount.split("\\.")[1];
} else {
whole = amount;
}
// 整數讀法
StringBuffer sceAmount = new StringBuffer(whole);
if (sceAmount.length() > 4) { // 每4位用逗號分隔
int count = sceAmount.length() / 4;
for (int i = 0; i <= count; i++) {
if (i == 1) {
sceAmount.insert(sceAmount.length() - 4 * i, ",");
} else if (i > 1) {
sceAmount.insert(sceAmount.length() - 4 * i - 1, ",");
}
}
}
String[] sce = sceAmount.toString().split(",");
for (int i = sce.length - 1; i >= 0; i--) { // 每4位迴圈讀
StringBuffer oneComma = new StringBuffer();
if (Pattern.compile("\\d{1,4}").matcher(sce[i]).matches()) {
if (Pattern.compile("[1-9]{4}").matcher(sce[i]).matches()) { // 不含有0
int t = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 千位
int h = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 百位
int d = Integer.valueOf(String.valueOf(sce[i].charAt(2))); // 十位
int e = Integer.valueOf(String.valueOf(sce[i].charAt(3))); // 個位
oneComma.append(upperAmount[t])
.append(unit[5])
.append(upperAmount[h])
.append(unit[4])
.append(upperAmount[d])
.append(unit[3])
.append(upperAmount[e]);
} else if (Pattern .compile("0{1}[1-9]{1}0{1}[1-9]{1}")
.matcher(sce[i])
.matches()) {
int h = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 百位
int e = Integer.valueOf(String.valueOf(sce[i].charAt(3))); // 個位
oneComma.append(upperAmount[0])
.append(upperAmount[h])
.append(unit[4])
.append(upperAmount[0])
.append(upperAmount[e]);
} else if (Pattern .compile("0{1,3}[1-9]{1}")
.matcher(sce[i])
.matches()) {
int e = Integer.valueOf(String.valueOf(sce[i].charAt(3))); // 個位
oneComma.append(upperAmount[0]).append(upperAmount[e]);
} else if (Pattern .compile("0{1,2}[1-9]{1}0{1}")
.matcher(sce[i])
.matches()) {
int d = Integer.valueOf(String.valueOf(sce[i].charAt(2))); // 十位
oneComma.append(upperAmount[0])
.append(upperAmount[d])
.append(unit[3]);
} else if (Pattern .compile("0{1}[1-9]{1}0{2}")
.matcher(sce[i])
.matches()) {
int h = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 百位
oneComma.append(upperAmount[0])
.append(upperAmount[h])
.append(unit[4]);
} else if (Pattern .compile("[1-9]{1}0{3}")
.matcher(sce[i])
.matches()) {
int t = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 千位
oneComma.append(upperAmount[t]).append(unit[5]);
} else if (Pattern .compile("[1-9]{2}0{2}")
.matcher(sce[i])
.matches()) {
int t = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 千位
int h = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 百位
oneComma.append(upperAmount[t])
.append(unit[5])
.append(upperAmount[h])
.append(unit[4]);
} else if (Pattern .compile("[1-9]{1}0{1}[1-9]{1}0{1}")
.matcher(sce[i])
.matches()) {
int t = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 千位
int d = Integer.valueOf(String.valueOf(sce[i].charAt(2))); // 十位
oneComma.append(upperAmount[t])
.append(unit[5])
.append(upperAmount[0])
.append(upperAmount[d])
.append(unit[3]);
} else if (Pattern .compile("[1-9]{1}0{2}[1-9]{1}")
.matcher(sce[i])
.matches()) {
int t = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 千位
int e = Integer.valueOf(String.valueOf(sce[i].charAt(3))); // 個位
oneComma.append(upperAmount[t])
.append(unit[5])
.append(upperAmount[0])
.append(upperAmount[e]);
} else if (Pattern .compile("0{1}[1-9]{2}0{1}")
.matcher(sce[i])
.matches()) {
int h = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 百位
int d = Integer.valueOf(String.valueOf(sce[i].charAt(2))); // 十位
oneComma.append(upperAmount[0])
.append(upperAmount[h])
.append(unit[4])
.append(upperAmount[d])
.append(unit[3]);
} else if (Pattern .compile("0{1,2}[1-9]{2}")
.matcher(sce[i])
.matches()) {
int d = Integer.valueOf(String.valueOf(sce[i].charAt(2))); // 十位
int e = Integer.valueOf(String.valueOf(sce[i].charAt(3))); // 個位
oneComma.append(upperAmount[0])
.append(upperAmount[d])
.append(unit[3])
.append(upperAmount[e]);
} else if (Pattern .compile("[1-9]{3}0{1}")
.matcher(sce[i])
.matches()) {
int t = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 千位
int h = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 百位
int d = Integer.valueOf(String.valueOf(sce[i].charAt(2))); // 十位
oneComma.append(upperAmount[t])
.append(unit[5])
.append(upperAmount[h])
.append(unit[4])
.append(upperAmount[d])
.append(unit[3]);
} else if (Pattern .compile("[1-9]{2}0{1}[1-9]{1}")
.matcher(sce[i])
.matches()) {
int t = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 千位
int h = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 百位
int e = Integer.valueOf(String.valueOf(sce[i].charAt(3))); // 個位
oneComma.append(upperAmount[t])
.append(unit[5])
.append(upperAmount[h])
.append(unit[4])
.append(upperAmount[0])
.append(upperAmount[e]);
} else if (Pattern .compile("0{1}[1-9]{3}")
.matcher(sce[i])
.matches()) { // 四位
int h = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 百位
int d = Integer.valueOf(String.valueOf(sce[i].charAt(2))); // 十位
int e = Integer.valueOf(String.valueOf(sce[i].charAt(3))); // 個位
oneComma.append(upperAmount[0])
.append(upperAmount[h])
.append(unit[4])
.append(upperAmount[d])
.append(unit[3])
.append(upperAmount[e]);
} else if (Pattern .compile("[1-9]{1}0{1}[1-9]{2}")
.matcher(sce[i])
.matches()) {
int t = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 千位
int d = Integer.valueOf(String.valueOf(sce[i].charAt(2))); // 十位
int e = Integer.valueOf(String.valueOf(sce[i].charAt(3))); // 個位
oneComma.append(upperAmount[t])
.append(unit[5])
.append(upperAmount[0])
.append(upperAmount[d])
.append(unit[3])
.append(upperAmount[e]);
} else if (Pattern .compile("[1-9]{3}")
.matcher(sce[i])
.matches()) { // 三位
int h = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 百位
int d = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 十位
int e = Integer.valueOf(String.valueOf(sce[i].charAt(2))); // 個位
oneComma.append(upperAmount[h])
.append(unit[4])
.append(upperAmount[d])
.append(unit[3])
.append(upperAmount[e]);
} else if (Pattern .compile("[1-9]{1}0{2}")
.matcher(sce[i])
.matches()) { // 三位
int h = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 百位
oneComma.append(upperAmount[h]).append(unit[4]);
} else if (Pattern .compile("[1-9]{1}0{1}[1-9]{1}")
.matcher(sce[i])
.matches()) {
int h = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 百位
int e = Integer.valueOf(String.valueOf(sce[i].charAt(2))); // 個位
oneComma.append(upperAmount[h])
.append(unit[4])
.append(upperAmount[0])
.append(upperAmount[e]);
} else if (Pattern .compile("[1-9]{2}0{1}")
.matcher(sce[i])
.matches()) {
int h = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 百位
int d = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 十位
oneComma.append(upperAmount[h])
.append(unit[4])
.append(upperAmount[d])
.append(unit[3]);
} else if (Pattern .compile("[1-9]{1}")
.matcher(sce[i])
.matches()) {
int e = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 個位
oneComma.append(upperAmount[e]);
} else if (Pattern .compile("[1-9]{2}")
.matcher(sce[i])
.matches()) { // 兩位
int d = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 十位
int e = Integer.valueOf(String.valueOf(sce[i].charAt(1))); // 個位
oneComma.append(upperAmount[d])
.append(unit[3])
.append(upperAmount[e]);
} else if (Pattern .compile("[1-9]{1}0{1}")
.matcher(sce[i])
.matches()) {
int d = Integer.valueOf(String.valueOf(sce[i].charAt(0))); // 十位
oneComma.append(upperAmount[d]).append(unit[3]);
}
}
if (sce.length == 3) {
if (i == 2) {
result.insert(0, oneComma.toString()).append(unit[2]);
} else if (i == 1) {// 有一個逗號(包含萬位單位)
oneComma.append(unit[6]);
result.insert(0, oneComma.toString());
} else if (i == 0) { // 有兩個逗號(包含億位單位)
oneComma.append(unit[7]);
result.insert(0, oneComma.toString());
}
} else if (sce.length == 2) {
if (i == 1) {
result.insert(0, oneComma.toString()).append(unit[2]);
} else if (i == 0) {// 有一個逗號(包含萬位單位)
oneComma.append(unit[6]);
result.insert(0, oneComma.toString());
}
} else if (sce.length == 1) {// 沒有逗號,最大單位為千
result.insert(0, oneComma.toString()).append(unit[2]);
}
}
// 小數讀法
if (integral.length() == 1) { // 只帶角
result .append(upperAmount[0])
.append(upperAmount[Integer.valueOf(integral)])
.append(unit[1]);
} else if (integral.length() == 2) {
if (!integral.startsWith("0")) {// 有角有分
result .append(upperAmount[0])
.append(upperAmount[Integer.valueOf(String.valueOf(integral.charAt(0)))])
.append(unit[1])
.append(upperAmount[Integer.valueOf(String.valueOf(integral.charAt(1)))])
.append(unit[0]);
} else {// 只有分
result .append(upperAmount[0])
.append(upperAmount[Integer.valueOf(String.valueOf(integral.charAt(1)))])
.append(unit[0]);
}
} else if (integral.equals("")) {
result.append(wholeUnit);
}
return result.toString();
}