古詩詞大全網 - 四字成語 - dunit

dunit

直接通過以下接口類方法實現即可:

import java.math.BigDecimal;

/**

* 金額工具類

*

* @author zn

*

* @Date 2013-2-1

* @Email zn.share@gmail.com

*/

public class MoneyUtil {

private static final int DFT_SCALE = 2;

/** 大寫數字 */

private static final String[] NUMBERS = { "零", "壹", "貳", "三", "肆", "伍",

"陸", "柒", "捌", "玖" };

/** 整數部分的單位 */

private static final String[] IUNIT = { "元", "拾", "佰", "仟", "萬", "拾", "佰",

"仟", "億", "拾", "佰", "仟", "萬", "拾", "佰", "仟" };

/** 小數部分的單位 */

private static final String[] DUNIT = { "角", "分", "厘" };

/**

* 得到大寫金額。

*/

public static String toChinese(String str) {

str = str.replaceAll(",", "");// 去掉","

String integerStr;// 整數部分數字

String decimalStr;// 小數部分數字

// 初始化:分離整數部分和小數部分

if (str.indexOf(".") > 0) {

integerStr = str.substring(0, str.indexOf("."));

decimalStr = str.substring(str.indexOf(".") + 1);

} else if (str.indexOf(".") == 0) {

integerStr = "";

decimalStr = str.substring(1);

} else {

integerStr = str;

decimalStr = "";

}

// integerStr去掉首0,不必去掉decimalStr的尾0(超出部分舍去)

if (!integerStr.equals("")) {

integerStr = Long.toString(Long.parseLong(integerStr));

if (integerStr.equals("0")) {

integerStr = "";

}

}

// overflow超出處理能力,直接返回

if (integerStr.length() > IUNIT.length) {

System.out.println(str + ":超出處理能力");

return str;

}

int[] integers = toArray(integerStr);// 整數部分數字

boolean isMust5 = isMust5(integerStr);// 設置萬單位

int[] decimals = toArray(decimalStr);// 小數部分數字

return getChineseInteger(integers, isMust5)

+ getChineseDecimal(decimals);

}

/**

* 整數部分和小數部分轉換為數組,從高位至低位

*/

private static int[] toArray(String number) {

int[] array = new int[number.length()];

for (int i = 0; i < number.length(); i++) {

array[i] = Integer.parseInt(number.substring(i, i + 1));

}

return array;

}

/**

* 得到中文金額的整數部分。

*/

private static String getChineseInteger(int[] integers, boolean isMust5) {

StringBuffer chineseInteger = new StringBuffer("");

int length = integers.length;

for (int i = 0; i < length; i++) {

// 0出現在關鍵位置:1234(萬)5678(億)9012(萬)3456(元)

// 特殊情況:10(拾元、壹拾元、壹拾萬元、拾萬元)

String key = "";

if (integers[i] == 0) {

if ((length - i) == 13)// 萬(億)(必填)

key = IUNIT[4];

else if ((length - i) == 9)// 億(必填)

key = IUNIT[8];

else if ((length - i) == 5 && isMust5)// 萬(不必填)

key = IUNIT[4];

else if ((length - i) == 1)// 元(必填)

key = IUNIT[0];

// 0遇非0時補零,不包含最後壹位

if ((length - i) > 1 && integers[i + 1] != 0)

key += NUMBERS[0];

}

chineseInteger.append(integers[i] == 0 ? key

: (NUMBERS[integers[i]] + IUNIT[length - i - 1]));

}

return chineseInteger.toString();

}

/**

* 得到中文金額的小數部分。

*/

private static String getChineseDecimal(int[] decimals) {

StringBuffer chineseDecimal = new StringBuffer("");

for (int i = 0; i < decimals.length; i++) {

// 舍去3位小數之後的

if (i == 3)

break;

chineseDecimal.append(decimals[i] == 0 ? ""

: (NUMBERS[decimals[i]] + DUNIT[i]));

}

return chineseDecimal.toString();

}

/**

* 判斷第5位數字的單位"萬"是否應加。

*/

private static boolean isMust5(String integerStr) {

int length = integerStr.length();

if (length > 4) {

String subInteger = "";

if (length > 8) { // TODO 12-9-17

// 取得從低位數,第5到第8位的字串

subInteger = integerStr.substring(length - 8, length - 4);

} else {

subInteger = integerStr.substring(0, length - 4);

}

return Integer.parseInt(subInteger) > 0;

} else {

return false;

}

}

/**

* BigDecimal 相乘,四舍五入保留0位

*

* @param a

* @param b

* @return a*b

*/

public static BigDecimal mutiply(String a, String b, int roundingMode) {

BigDecimal bd = new BigDecimal(a);

return bd.multiply(new BigDecimal(b)).setScale(DFT_SCALE, roundingMode);

}

/**

* BigDecimal 相除,四舍五入保留兩位

*

* @param a

* @param b

* @return a/b

*/

public static BigDecimal div(String a, String b, int roundingMode) {

BigDecimal decimal1 = new BigDecimal(a);

BigDecimal decimal2 = new BigDecimal(b);

return decimal1.divide(decimal2, DFT_SCALE, roundingMode);

}

/**

* BigDecimal 相加,四舍五入保留兩位

*

* @param a

* @param b

* @return a+b

*/

public static BigDecimal sum(String a, String b, int roundingMode) {

BigDecimal decimal1 = new BigDecimal(a);

BigDecimal decimal2 = new BigDecimal(b);

// DecimalFormat format = new DecimalFormat("#0.00");

return decimal1.add(decimal2).setScale(DFT_SCALE, roundingMode);

}

/**

* BigDecimal 相減,四舍五入保留兩位

*

* @param a

* @param b

* @return a+b

*/

public static BigDecimal sub(String a, String b, int roundingMode) {

BigDecimal decimal1 = new BigDecimal(a);

BigDecimal decimal2 = new BigDecimal(b);

// DecimalFormat format = new DecimalFormat("#0.00");

return decimal1.subtract(decimal2).setScale(DFT_SCALE, roundingMode);

}

/**

* 100.00 為10000

*

* @param a

* @return

*/

public static BigDecimal format(String a, int roundingMode) {

return new BigDecimal(a).multiply(new BigDecimal(100)).setScale(0,

roundingMode);

}

public static void main(String[] args) {

String number = "54452";

System.out.println(number + " " + MoneyUtil.toChinese(number));

number = "30200";

System.out.println(number + " " + MoneyUtil.toChinese(number));

number = "30000.05";

System.out.println(number + " " + MoneyUtil.toChinese(number));

number = "30000.00";

System.out.println(number + " " + MoneyUtil.toChinese(number));

}

}

備註:最後面的main方法是具體的調用。