JAVA编程 金额转换

Python016

JAVA编程 金额转换,第1张

/**

金额转换,阿拉伯数字的金额转换成中国传统的形式如:

(¥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))

}

}