金额转换,阿拉伯数字的金额转换成中国传统的形式如:
(¥1011)->(一千零一拾一元 整)输出。
*/
import java.io.*
import java.lang.String
public class Money{
public static void main(String[] args)throws Exception{
String str=null
System.out.println("请输入您的金额¥:")
flag:
while(true){
try{BufferedReader in=
new BufferedReader(new InputStreamReader(System.in))
str=in.readLine()
}catch(IOException e){}
for(int i=0i<str.length()i++){
if(str.charAt(i)>57||str.charAt(i)<48){
System.out.println("您输入的金额有误!请重新输入")
continue flag
}
}
break
}
char[] ch=str.toCharArray()
for(int i=0i<ch.lengthi++){
switch(ch[i]){
case '0':{ ch[i]='零' break}
case '1':{ ch[i]='壹' break}
case '2':{ ch[i]='贰' break}
case '3':{ ch[i]='叁' break}
case '4':{ ch[i]='肆' break}
case '5':{ ch[i]='伍' break}
case '6':{ ch[i]='陆' break}
case '7':{ ch[i]='柒' break}
case '8':{ ch[i]='捌' break}
case '9':{ ch[i]='玖' break}
default: ch[i]='f'
}
}
int i=0
switch(ch.length){
case 0:
case 1: {System.out.println(ch[i]+"元整")}
case 2: {System.out.println(ch[i]+"十"+ch[i+1]+"元整")}
case 3: {System.out.println(ch[i]+"百"+ch[i+1]+"十"+ch[i+2]+"元整")}
case 4: {System.out.println(ch[i]+"千"+ch[i+1]+"百"+ch[i+2]+"十"
+ch[i+3]+"元整")break}
case 5: {System.out.println(ch[i]+"万"+ch[i+1]+"千"+ch[i+2]+"百"
+ch[i+3]+"十"+ch[i+4]+"元整")break}
case 6: {System.out.println(ch[i]+"十"+ch[i+1]+"万"+ch[i+2]+"千"
+ch[i+3]+"百"+ch[i+4]+"十"+ch[i+5]+"元整")break}
case 7: {System.out.println(ch[i]+"百"+ch[i+1]+"十"+ch[i+2]+"万"
+ch[i+3]+"千"+ch[i+4]+"百"+ch[i+5]+"十"+ch[i+6]+"元整")break}
case 8: {System.out.println(ch[i]+"千"+ch[i+1]+"百"+ch[i+2]+"十"
+ch[i+3]+"万"+ch[i+4]+"千"+ch[i+5]+"百"+ch[i+6]+"十"+ch[i+7]+"元整")break}
case 9: {System.out.println(ch[i]+"亿"+ch[i+1]+"千"+ch[i+2]+"百"
+ch[i+3]+"十"+ch[i+4]+"万"+ch[i+5]+"千"+ch[i+6]+"百"+ch[i+7]+"十"
+ch[i+8]+"元整")break}
case 10: {System.out.println(ch[i]+"十"+ch[i+1]+"亿"+ch[i+2]+"千"
+ch[i+3]+"百"+ch[i+4]+"十"+ch[i+5]+"万"+ch[i+6]+"千"+ch[i+7]+"百"+ch[i+8]+"十"
+ch[i+9]+"元整")break}
default: System.out.println("错误")
}
}
}
直接通过以下接口类方法实现即可:import java.math.BigDecimal/** * 金额工具类 * * @author zn * * @Date 2013-2-1 * @Email [email protected] */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 = 0i <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 = 0i <lengthi++) { // 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 = 0i <decimals.lengthi++) { // 舍去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方法是具体的调用。public class ShuceUtils {/**
* 将数字转换成中文表示
* @param smallmoney double
* @return String
*/
public static String TranslateMoneyToChn(double smallmoney) {
String value = String.valueOf(smallmoney)
if (null == value || "".equals(value.trim()))
return "零"
String strCheck, strArr, strFen, strDW, strNum, strBig, strNow
double d = 0
try {
d = Double.parseDouble(value)
}
catch (Exception e) {
return "数据" + value + "非法!"
}
strCheck = value + "."
int dot = strCheck.indexOf(".")
if (dot >12) {
return "数据" + value + "过大,无法处理!"
}
try {
int i = 0
strBig = ""
strDW = ""
strNum = ""
long intFen = Math.round(d * 100)
strFen = String.valueOf(intFen)
int lenIntFen = strFen.length()
while (lenIntFen != 0) {
i++
switch (i) {
case 1:
strDW = "分"
break
case 2:
strDW = "角"
break
case 3:
strDW = "圆"
break
case 4:
strDW = "拾"
break
case 5:
strDW = "佰"
break
case 6:
strDW = "仟"
break
case 7:
strDW = "万"
break
case 8:
strDW = "拾"
break
case 9:
strDW = "佰"
break
case 10:
strDW = "仟"
break
case 11:
strDW = "亿"
break
case 12:
strDW = "拾"
break
case 13:
strDW = "佰"
break
case 14:
strDW = "仟"
break
}
switch (strFen.charAt(lenIntFen - 1)) { //选择数字
case '1':
strNum = "壹"
break
case '2':
strNum = "贰"
break
case '3':
strNum = "叁"
break
case '4':
strNum = "肆"
break
case '5':
strNum = "伍"
break
case '6':
strNum = "陆"
break
case '7':
strNum = "柒"
break
case '8':
strNum = "捌"
break
case '9':
strNum = "玖"
break
case '0':
strNum = "零"
break
}
//处理特殊情况
strNow = strBig
//分为零时的情况
if ( (i == 1) &&(strFen.charAt(lenIntFen - 1) == '0'))
strBig = "整"
//角为零时的情况
else if ( (i == 2) &&(strFen.charAt(lenIntFen - 1) == '0')) { //角分同时为零时的情况
if (!strBig.equals("整"))
strBig = "零" + strBig
}
//元为零的情况
else if ( (i == 3) &&(strFen.charAt(lenIntFen - 1) == '0'))
strBig = "圆" + strBig
//拾-仟中一位为零且其前一位(元以上)不为零的情况时补零
else if ( (i <7) &&(i >3) &&(strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) != '零') &&(strNow.charAt(0) != '圆'))
strBig = "零" + strBig
//拾-仟中一位为零且其前一位(元以上)也为零的情况时跨过
else if ( (i <7) &&(i >3) &&(strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) == '零')) {}
//拾-仟中一位为零且其前一位是元且为零的情况时跨过
else if ( (i <7) &&(i >3) &&(strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) == '圆')) {}
//当万为零时必须补上万字
else if ( (i == 7) &&(strFen.charAt(lenIntFen - 1) == '0'))
strBig = "万" + strBig
//拾万-仟万中一位为零且其前一位(万以上)不为零的情况时补零
else if ( (i <11) &&(i >7) &&(strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) != '零') &&(strNow.charAt(0) != '万'))
strBig = "零" + strBig
//拾万-仟万中一位为零且其前一位(万以上)也为零的情况时跨过
else if ( (i <11) &&(i >7) &&(strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) == '万')) {}
//拾万-仟万中一位为零且其前一位为万位且为零的情况时跨过
else if ( (i <11) &&(i >7) &&(strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) == '零')) {}
//万位为零且存在仟位和十万以上时,在万仟间补零
else if ( (i <11) &&(i >8) &&(strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) == '万') &&(strNow.charAt(2) == '仟'))
strBig = strNum + strDW + "万零" + strBig.substring(1, strBig.length())
//单独处理亿位
else if (i == 11) {
//亿位为零且万全为零存在仟位时,去掉万补为零
if ( (strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) == '万') &&(strNow.charAt(2) == '仟'))
strBig = "亿" + "零" + strBig.substring(1, strBig.length())
//亿位为零且万全为零不存在仟位时,去掉万
else if ( (strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) == '万') &&(strNow.charAt(2) != '仟'))
strBig = "亿" + strBig.substring(1, strBig.length())
//亿位不为零且万全为零存在仟位时,去掉万补为零
else if ( (strNow.charAt(0) == '万') &&(strNow.charAt(2) == '仟'))
strBig = strNum + strDW + "零" + strBig.substring(1, strBig.length())
//亿位不为零且万全为零不存在仟位时,去掉万
else if ( (strNow.charAt(0) == '万') &&(strNow.charAt(2) != '仟'))
strBig = strNum + strDW + strBig.substring(1, strBig.length())
//其他正常情况
else
strBig = strNum + strDW + strBig
}
//拾亿-仟亿中一位为零且其前一位(亿以上)不为零的情况时补零
else if ( (i <15) &&(i >11) &&(strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) != '零') &&(strNow.charAt(0) != '亿'))
strBig = "零" + strBig
//拾亿-仟亿中一位为零且其前一位(亿以上)也为零的情况时跨过
else if ( (i <15) &&(i >11) &&(strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) == '亿')) {}
//拾亿-仟亿中一位为零且其前一位为亿位且为零的情况时跨过
else if ( (i <15) &&(i >11) &&(strFen.charAt(lenIntFen - 1) == '0') &&
(strNow.charAt(0) == '零')) {}
//亿位为零且不存在仟万位和十亿以上时去掉上次写入的零
else if ( (i <15) &&(i >11) &&(strFen.charAt(lenIntFen - 1) != '0') &&
(strNow.charAt(0) == '零') &&(strNow.charAt(1) == '亿') &&
(strNow.charAt(3) != '仟'))
strBig = strNum + strDW + strBig.substring(1, strBig.length())
//亿位为零且存在仟万位和十亿以上时,在亿仟万间补零
else if ( (i <15) &&(i >11) &&(strFen.charAt(lenIntFen - 1) != '0') &&
(strNow.charAt(0) == '零') &&(strNow.charAt(1) == '亿') &&
(strNow.charAt(3) == '仟'))
strBig = strNum + strDW + "亿零" + strBig.substring(2, strBig.length())
else
strBig = strNum + strDW + strBig
strFen = strFen.substring(0, lenIntFen - 1)
lenIntFen--
}
return strBig
}
catch (Exception e) {
return ""
}
}
public static void main(String[] args){
System.out.println(ShuceUtils.TranslateMoneyToChn(123450000))
}
}