您的位置:首页 > 其它

根据数字金额获取汉字中文名 c自定义标签

2016-09-02 10:31 162 查看
下载  jstl.jar包和standard.jar包 
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
写个java类

public class NumberToCNTag implements Tag  {

private String value;//参数值
/**
* 数字大写
*/
private static final String[] CN_UPPER_NUMBER  = {"零", "壹", "贰", "叁", "肆","伍", "陆", "柒", "捌", "玖" };
/**
* 汉语中货币单位
*/
private static final String[] CN_UPPER_MONETRAY_UNIT = {"分", "角", "元","拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾","佰", "仟" };
/**
* 特殊字符:整
*/
private static final String CN_FULL = "整";
/**
* 特殊字符:负
*/
private static final String CN_NEGATIVE = "负";
/**
* 金额的精度,默认值为2
*/
private static final int MONEY_PRECISION = 2;
/**
* 特殊字符:零元整
*/
private static final String CN_ZEOR_FULL = "零元" + CN_FULL;

private PageContext pageContext;

private Tag tag;

/**
* 把输入的金额转换为汉语中人民币的大写
*
* @param numberOfMoney
*            输入的金额
* @return 对应的汉语大写
*/
public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {

StringBuffer sb = new StringBuffer();
// -1, 0, or 1 as the value of this BigDecimal is negative, zero, or
// positive.
int signum = numberOfMoney.signum();
// 零元整的情况
if (signum == 0) {
return CN_ZEOR_FULL;
}
//这里会进行金额的四舍五入
long number = numberOfMoney.movePointRight(MONEY_PRECISION)
.setScale(0, 4).abs().longValue();
// 得到小数点后两位值
long scale = number % 100;
int numUnit = 0;
int numIndex = 0;
boolean getZero = false;
// 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11
if (!(scale > 0)) {
numIndex = 2;
number = number / 100;
getZero = true;
}
if ((scale > 0) && (!(scale % 10 > 0))) {
numIndex = 1;
number = number / 10;
getZero = true;
}
int zeroSize = 0;
while (true) {
if (number <= 0) {
break;
}
// 每次获取到最后一个数
numUnit = (int) (number % 10);
if (numUnit > 0) {
if ((numIndex == 9) && (zeroSize >= 3)) {
sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);
}
if ((numIndex == 13) && (zeroSize >= 3)) {
sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);
}
sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
sb.insert(0, CN_UPPER_NUMBER[numUnit]);
getZero = false;
zeroSize = 0;
} else {
++zeroSize;
if (!(getZero)) {
sb.insert(0, CN_UPPER_NUMBER[numUnit]);
}
if (numIndex == 2) {
if (number > 0) {
sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
}
} else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {
sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
}
getZero = true;
}
// 让number每次都去掉最后一个数
number = number / 10;
++numIndex;
}
// 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
if (signum == -1) {
sb.insert(0, CN_NEGATIVE);
}
// 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整
if (!(scale > 0)) {
sb.append(CN_FULL);
}
return sb.toString();
}

@Override
public int doStartTag() throws JspException{

JspWriter out = this.pageContext.getOut();
try {
out.print(number2CNMontrayUnit(new BigDecimal(value)));
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
return EVAL_PAGE;
}

public String getValue() {
return value;
}
public void setValue(String value) {
if(value == ""){
value="0";
}
this.value = value;
}
@Override
public Tag getParent() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setPageContext(PageContext pageContext) {
this.pageContext = pageContext;

}
@Override
public void release() {
}
@Override
public void setParent(Tag tag) {
this.tag = tag;
}

}

c.tid

<tag>
<description>
</description>
<name>numbercn</name>
<tag-class>cn.capinfo.application.wxzj.common.NumberToCNTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<description>
</description>
<name>value</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>

web.xml

<!-- jsp标签库 -->
<jsp-config>
<taglib>
<taglib-uri>c</taglib-uri>
<taglib-location>/WEB-INF/tld/c.tld</taglib-location>
</taglib>
</jsp-config>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  自定义标签