项目中中文大写金额的工具类

关于中文大写,网上有很多代码可以下载使用,但是仔细看了,很多都不完美支持财务要求的中文大写规则,以前好像看到过中文大写类库,但是不记得了,于是只好自己写

财务规则:
零在元位和万位上时,这个零一般可写可不写。
阿拉伯小写金额数字中有“0”时,中文大写应按照汉语语言规律、金额数字构成和防止涂改的要求进行书写。举例如下:
(一) 阿拉伯数字中间有“0”时,中文大写金额中间可以只写一个“零”字。如¥1409.50,应写成人民币壹仟肆佰零玖元伍角。
(二) 阿拉伯数字中间连续有几个“0”,中文大写金额中间可以只写一个“零”字,如¥6007.14,应写成人民币陆仟零柒元壹角肆分。
(三) 阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但仟位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1680.32,应写成人民币壹仟陆佰捌拾元零三角贰分,或者写成人民币壹仟陆佰捌拾元三角贰分;又如¥107000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万柒仟元伍角叁分。
(四) 阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾元零肆分。
根据《中华人民共和国票据法》的相关规定:
填写票据和结算凭证,必须做到标准化、规范化,要素齐全、数字正确、字迹清晰、不错漏、不潦草,防止涂改。
1、中文大写金额数字如零、壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿等,应用正楷或行书填写,不得自造简化字。如果金额数字书写中使用繁体字,也应受理(针对银行方)。
2、中文大写金额数字到“元”为止的,在“元”之后,应写“整”(或“正”)字,在“角”之后可以不写“整”(或“正”)字。大写金额数字有“分”的,“分”后面不写“整”(或“正”)字。
3、中文大写在写一般票据和银行支票是不一样的。一般票据的写法上面的天外非仙已经写得很清楚了,银行支票得写法就得把零全写上,不管0在什么位置,要写成零元零角零分。


import java.math.BigDecimal;

import org.apache.commons.lang.StringUtils;


/**
*
* desc: 数字金额转换成中文大写财务金额工具类
*
* @author <a href="mailto:yourmail">Hegege</a>
* @version CVS $Revision: 1.1 $ $Date: 2005/12/05 08:42:21 $
*/
public class ChineseMoneyUtils {

private String number[] = { "", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

private String unit[] = { "", "拾", "佰", "仟" };

private String small[] = { "角", "分" };

public static void main(String[] args) {

String d = "9078006005.04";

Double x = Double.valueOf("9078006005.4");
BigDecimal xx = BigDecimal.valueOf(x.doubleValue());
String t = xx.toEngineeringString();
// String d = "325.04";
String y = getByNumber(Double.valueOf(0));
String m = getByString(".02");
String str = getByD(d);

System.out.println(str);

// CommonDao commonDao = new CommonDao();
// try {
// commonDao.getHibernateSession().connection();
// commonDao.getHibernateSession().createSQLQuery("sql");
// commonDao.getHibernateSession().close();
//
// } catch (HibernateException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (WAFException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } finally{
// try {
// commonDao.getHibernateSession().close();
// } catch (HibernateException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (WAFException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }

}

/**
* 根据数字类型返回中文大写的数字
*
* @param number
* @return
*/
public static String getByNumber(Number number) {
if (number != null) {
BigDecimal xx = BigDecimal.valueOf(number.doubleValue());
String t = xx.toEngineeringString();
if (StringUtils.isNotEmpty(t)) {
if (t.indexOf(".") > 0 && t.indexOf(".") == t.length() - 2) {
t += "0";
} else if (t.indexOf(".") > 0
&& t.indexOf(".") < t.length() - 2) {
t = t.substring(0, t.indexOf(".") + 3);
} else {
t += ".00";
}// 还漏掉t.indexOf(".")>0&&t.indexOf(".")==t.length()-1的判断,但是形参是Number类型,这种情况不会发生
return getByD(t);
} else {
return null;
}
} else {
return null;
}
}

/**
* 根据字符类型返回中文大写的数字
*
* @param s
* @return
*/
public static String getByString(String s) {
if (StringUtils.isNotEmpty(s)) {
try {
BigDecimal xx = BigDecimal.valueOf(Double.valueOf(s)
.doubleValue());
String t = xx.toEngineeringString();
if (StringUtils.isNotEmpty(t)) {
if (t.indexOf(".") > 0 && t.indexOf(".") == t.length() - 2) {
t += "0";
} else if (t.indexOf(".") > 0
&& t.indexOf(".") < t.length() - 2) {
t = t.substring(0, t.indexOf(".") + 3);
} else {
t += ".00";
}// 还漏掉t.indexOf(".")>0&&t.indexOf(".")==t.length()-1的判断,但是形参是Number类型,这种情况不会发生
return getByD(t);
} else {
return null;
}
} catch (NumberFormatException e) {
e.printStackTrace();
System.out.println("********字符串不合法*******");
return null;
}
} else {
return null;
}
}

/**
* 形参必须是格式化的字符串xxxxxxxx.xx
*
* @param d
* @return("":数字是0,"0":数字太大)
*
* 零在元位和万位上时,这个零一般可写可不写。
* 阿拉伯小写金额数字中有“0”时,中文大写应按照汉语语言规律
* 、金额数字构成和防止涂改的要求进行书写。举例如下:
*
*   (一)
* 阿拉伯数字中间有“0”时,中文大写金额中间可以只写一个“零”字。如¥1,409.50
* ,应写成人民币壹仟肆佰零玖元伍角。
*
*   (二)
* 阿拉伯数字中间连续有几个“0”,中文大写金额中间可以只写一个“零”字,如¥6,007.14
* ,应写成人民币陆仟零柒元壹角肆分。
*
*   (三)
* 阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”
* ,但仟位、角位不是
* “0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1,680.32
* ,应写成人民币壹仟陆佰捌拾元零三角贰分
* ,或者写成人民币壹仟陆佰捌拾元三角贰分;又如¥107,000.53
* ,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万柒仟元伍角叁分。
*
*    (四)
* 阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字
* 。如¥16,409.02
* ,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾元零肆分。
*
* 根据《中华人民共和国票据法》的相关规定:
* 填写票据和结算凭证,必须做到标准化、规范化,要素齐全、
* 数字正确、字迹清晰、不错漏、不潦草,防止涂改。
* 1、中文大写金额数字如零、壹、贰、叁、肆、伍、陆
* 、柒、捌、玖、拾、佰、仟、万、亿等,应用正楷或行书填写
* ,不得自造简化字。如果金额数字书写中使用繁体字,也应受理(针对银行方)。
* 2、中文大写金额数字到
* “元”为止的,在“元”之后,应写“整”(或“正”)字,在“角”之后可以不写
* “整”(或“正”)字。大写金额数字有“分”的,“分”后面不写“整”(或“正”)字。
* 3、中文大写在写一般票据和银行支票是不一样的
* 。一般票据的写法上面的天外非仙已经写得很清楚了,银行支票得写法就得把零全写上
* ,不管0在什么位置,要写成零元零角零分。
*/
private static String getByD(String d) {
Double dd = Double.valueOf(d);
if (dd < 10000000000.00d) {
StringBuffer rs = new StringBuffer("");
BigDecimal bigDecimal = new BigDecimal(d);

String v = d;
boolean substringflag = false;
int sp = v.indexOf(".");
String v1 = v.substring(0, sp);
String v2 = v.substring(sp + 1, v.length());
if ((bigDecimal
.divideToIntegralValue(new BigDecimal(1000000000.00d)))
.intValue() > 0) {
// 十亿
rs.append(getNum((bigDecimal
.divideToIntegralValue(new BigDecimal(1000000000.00d)))
.intValue()));
rs.append("拾");
v = v.substring(1);
sp = v.indexOf(".");
v1 = v.substring(0, sp);
bigDecimal = new BigDecimal(v);
substringflag = true;
} else {
if (substringflag) {
v = v.substring(1);
}
rs.append("零");
}

if ((bigDecimal
.divideToIntegralValue(new BigDecimal(100000000.00d)))
.intValue() > 0) {
// 亿
rs.append(getNum((bigDecimal
.divideToIntegralValue(new BigDecimal(100000000.00d)))
.intValue()));
rs.append("億");
v = v.substring(1);
sp = v.indexOf(".");
v1 = v.substring(0, sp);
bigDecimal = new BigDecimal(v);
substringflag = true;
} else {
if (substringflag) {
v = v.substring(1);
}
rs.append("億");
}

if ((bigDecimal.divideToIntegralValue(new BigDecimal(10000000.00d)))
.intValue() > 0) {
// 千万
rs.append(getNum((bigDecimal
.divideToIntegralValue(new BigDecimal(10000000.00d)))
.intValue()));
rs.append("仟");
v = v.substring(1);
sp = v.indexOf(".");
v1 = v.substring(0, sp);
bigDecimal = new BigDecimal(v);
substringflag = true;
} else {
if (substringflag) {
v = v.substring(1);
}
rs.append("零");
}

if ((bigDecimal.divideToIntegralValue(new BigDecimal(1000000.00d)))
.intValue() > 0) {
// 百万
rs.append(getNum((bigDecimal
.divideToIntegralValue(new BigDecimal(1000000.00d)))
.intValue()));
rs.append("佰");
v = v.substring(1);
sp = v.indexOf(".");
v1 = v.substring(0, sp);
bigDecimal = new BigDecimal(v);
substringflag = true;
} else {
if (substringflag) {
v = v.substring(1);
}
rs.append("零");
}

if ((bigDecimal.divideToIntegralValue(new BigDecimal(100000.00d)))
.intValue() > 0) {
// 十万
rs.append(getNum((bigDecimal
.divideToIntegralValue(new BigDecimal(100000.00d)))
.intValue()));
rs.append("拾");
v = v.substring(1);
sp = v.indexOf(".");
v1 = v.substring(0, sp);
bigDecimal = new BigDecimal(v);
substringflag = true;
} else {
if (substringflag) {
v = v.substring(1);
}
rs.append("零");
}

if ((bigDecimal.divideToIntegralValue(new BigDecimal(10000.00d)))
.intValue() > 0) {
// 万
rs.append(getNum((bigDecimal
.divideToIntegralValue(new BigDecimal(10000.00d)))
.intValue()));
rs.append("萬");
v = v.substring(1);
sp = v.indexOf(".");
v1 = v.substring(0, sp);
bigDecimal = new BigDecimal(v);
substringflag = true;
} else {
if (substringflag) {
v = v.substring(1);
}
rs.append("萬");
}

if ((bigDecimal.divideToIntegralValue(new BigDecimal(1000.00d)))
.intValue() > 0) {
// 千
rs.append(getNum((bigDecimal
.divideToIntegralValue(new BigDecimal(1000.00d)))
.intValue()));
rs.append("仟");
v = v.substring(1);
sp = v.indexOf(".");
v1 = v.substring(0, sp);
bigDecimal = new BigDecimal(v);
substringflag = true;
} else {
if (substringflag) {
v = v.substring(1);
}
rs.append("零");
}

if ((bigDecimal.divideToIntegralValue(new BigDecimal(100.00d)))
.intValue() > 0) {
// 百
rs.append(getNum((bigDecimal
.divideToIntegralValue(new BigDecimal(100.00d)))
.intValue()));
rs.append("佰");
v = v.substring(1);
sp = v.indexOf(".");
v1 = v.substring(0, sp);
bigDecimal = new BigDecimal(v);
substringflag = true;
} else {
if (substringflag) {
v = v.substring(1);
}
rs.append("零");
}

if ((bigDecimal.divideToIntegralValue(new BigDecimal(10.00d)))
.intValue() > 0) {
// 十
rs.append(getNum((bigDecimal
.divideToIntegralValue(new BigDecimal(10.00d)))
.intValue()));
rs.append("拾");
v = v.substring(1);
sp = v.indexOf(".");
v1 = v.substring(0, sp);
bigDecimal = new BigDecimal(v);
substringflag = true;
} else {
if (substringflag) {
v = v.substring(1);
}
rs.append("零");
}

if ((bigDecimal.divideToIntegralValue(new BigDecimal(1.00d)))
.intValue() > 0) {
// 元
rs.append(getNum((bigDecimal
.divideToIntegralValue(new BigDecimal(1.00d)))
.intValue()));
rs.append("圆");
v = v.substring(1);
sp = v.indexOf(".");
v1 = v.substring(0, sp);
bigDecimal = new BigDecimal(v);
substringflag = true;
} else {
if (substringflag) {
v = v.substring(1);
}
rs.append("圆");
}

if ("00".equals(v2)) {
rs.append("整");
} else {
if (!"0".equals(v2.substring(0, 1))) {
Integer k = Integer.valueOf(v2.substring(0, 1));
rs.append(getNum(k.intValue()));
rs.append("角");
} else {
rs.append("零");
}

if (!"0".equals(v2.substring(1, 2))) {
Integer k = Integer.valueOf(v2.substring(1, 2));
rs.append(getNum(k.intValue()));
rs.append("分");
} else {

}

}

String rss = rs.toString();
rss = rss.replaceAll("零零零", "零");
rss = rss.replaceAll("零零", "零");
rss = rss.replaceAll("零億", "億");
rss = rss.replaceAll("零萬", "萬");
rss = rss.replaceAll("零圆", "圆");
if (rss.startsWith("零")) {
rss = rss.substring(1);
}
if (rss.startsWith("億")) {
rss = rss.substring(1);
}
if (rss.startsWith("零")) {
rss = rss.substring(1);
}
if (rss.startsWith("萬")) {
rss = rss.substring(1);
}
if (rss.startsWith("零")) {
rss = rss.substring(1);
}
if (rss.startsWith("圆")) {
rss = rss.substring(1);
}
if (rss.startsWith("零")) {
rss = rss.substring(1);
}
if (rss.startsWith("拾")) {
rss = rss.substring(1);
}
if (rss.startsWith("零")) {
rss = rss.substring(1);
}
if (rss.startsWith("佰")) {
rss = rss.substring(1);
}
if (rss.startsWith("零")) {
rss = rss.substring(1);
}
if (rss.startsWith("仟")) {
rss = rss.substring(1);
}

if ("整".equals(rss))
rss = "";

return rss;
} else {
return "0";
}
}

private static String getNum(int intValue) {
if (intValue == 1) {
return "壹";
} else if (intValue == 2) {
return "贰";
} else if (intValue == 3) {
return "叁";
} else if (intValue == 4) {
return "肆";
} else if (intValue == 5) {
return "伍";
} else if (intValue == 6) {
return "陆";
} else if (intValue == 7) {
return "柒";
} else if (intValue == 8) {
return "捌";
} else if (intValue == 9) {
return "玖";
} else {
return "零";
}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值