人民币大写金额
动机
业务系统开发的报表中经常需要将人民币数值转换为大写,所以江苏南大先腾java研发框架中写了一个通用的大写转换函数。由于报表的数值一般比较大所以在java开发中不建议使用float或者int类型,请用bigdecimal类型,为了更加方便调用函数的参数使用字符串类型。
源码
final static private String CNum[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
final static private String CNum2[]={"〇","一","二","三","四","五","六","七","八","九"};
final static private String CBit[]={"","拾","佰","仟"};
//拾佰仟万拾佰仟亿拾佰仟萬
/*
* 将数值大写
*/
public static String capitalization(String szNum)
{
stringbuilder resstr = new StringBuilder();
String tmpstr = szNum.trim();
int sl = tmpstr.length();
int sp=0;
int dotpos = tmpstr.indexof('.');
if(dotpos != -1){
while(sl>1 && tmpstr.charAt(sl-1) == '0') sl--;
if(tmpstr.charAt(sl-1)=='.') sl--;
if(sl != tmpstr.length()){
tmpstr = tmpstr.substring(0,sl);
}
}else dotpos = sl;
if(sl<1) return CNum[0];
if(tmpstr.charAt(0) == '-'){
resstr.APPend("负");
sp = 1;
}
String integerNum = tmpstr.substring(sp,dotpos-sp);
String decimalNum ="";
if(dotpos+1<sl) decimalNum = tmpstr.substring(dotpos+1);
sl = integerNum.length();
sp=0; while(sp<sl && integerNum.charAt(sp)=='0') sp++;
if(sp > 0) integerNum = integerNum.substring(sp);
int inl = integerNum.length();
if(inl>0){
int h = (inl-1) % 4 ;
int j = (inl-1) / 4 + 1;
sp=0;
boolean allzero = false;
boolean preallzero = false;
for(;j>0;j--){
int k=h;
h = 3;
boolean preiszero = allzero;
allzero = true;
for(;k>=0;k--,sp++){
if(integerNum.charAt(sp) == '0')
preiszero = true;
else{
allzero = false;
if(preiszero)
resstr.append("零");
preiszero = false;
resstr.append(CNum[(byte) (integerNum.charAt(sp)) - 48]).append(CBit[k]);
}
}// end for k
if(/*j!=0 &&*/ j % 2 == 0 ){
if(!allzero)
resstr.append("万");
}
else
{
if(!allzero || !preallzero){
int repyi = j/2;
for(int i=0; i<repyi; i++)
resstr.append("亿");
}
}
preallzero = allzero;
}//end for j
}else
resstr.append("零");
int dnl = decimalNum.length();
if(dnl>0){
resstr.append("点");
for(int i=0; i<dnl; i++){
resstr.append(CNum[(byte)(decimalNum.charAt(i))-48]);
}
}
return resstr.toString();
}
/*
* 仅仅是把 0~9 转换为 "〇","一","二","三","四","五","六","七","八","九"
*/
public static String uppercaseCN(String szNum)
{
StringBuilder resstr = new StringBuilder();
String tmpstr = szNum.trim();
int sl = tmpstr.length();
int sp=0;
if(sl<1) return CNum2[0];
for(;sp<sl;sp++)
if(tmpstr.charAt(sp)>='0' && tmpstr.charAt(sp)<='9')
resstr.append(CNum2[tmpstr.charAt(sp)-'0']);
else
resstr.append(tmpstr.charAt(sp));
return resstr.toString();
}
public static String capitalization(String szNum,final boolean isSimple)
{
if (isSimple){
return uppercaseCN(szNum);
}
return capitalization(szNum);
}
完整代码参见NumberBaseOpt 更多先腾框架项目参见先腾开源计划。
测试程序
public static String rmbDX(String f){
return NumberBaseOpt.capitalization(
(f.indexOf('.')>=0? f.substring(0,f.indexOf('.')):f)) + "元"
+ NumberBaseOpt.capitalization(
String.valueOf(NumberBaseOpt.getNumByte(f,-1)))+"角"
+ NumberBaseOpt.capitalization(
String.valueOf(NumberBaseOpt.getNumByte(f,-2)))+"分";
}
public static void main(String[] args) {
System.out.println(rmbDX("123.45"));
System.out.println(rmbDX("3456700000000089123.45"));
}
运行结果:
壹佰贰拾叁元肆角伍分
叁佰肆拾伍亿亿陆仟柒佰万亿零捌万玖仟壹佰贰拾叁元肆角伍分
相关阅读
/* *Copyright(C)2018,CSDN学院 *All rights reserved *文件名称:main.c *作者:黑可可 *完成日期:2018.4.6 *版本号:V1.0 *问题
1. NIKON自带的Picture Project来转换。 2. 用google的picasa可以非常简单的处理。 3. Adobe Photoshop CS的最新插件Ado
1法拉(F)= 1000毫法(mF)=1000000微法(μF) 1微法(μF)= 1000纳法(nF)= 1000000皮法(pF) 电容(Capacitance)亦称作“电容量”,是指在给定电位差下
大写:ABCDEFGHIJKLMNOPQRSTUVWXYZ 小写:abcdefghijklmnopqrstuvwxyz 数字:0123456789
传统的人民币符号写法有两种:¥和¥ 现在淘宝有中新的写法: font-family:Arial; + & yen ; 看三种效果: ¥100元 ¥100元 ¥ 100