# re: 金额数字转中文大写[未登录]
2013-11-20 23:59
titan
/*
* 需求:自动转换人民币大写金额的程序
*
* 思路:
* 获取一个double my
* 格式化double,格式:##0.00,转换成去掉小数点的字符串formatDouble
* 定义大写数字数组的String[] money和单位数组String[] unit
* 判断字符串formatDouble的长度,通过角标获取每个字符,遍历字符串,用角标获取单位,用值获取大写数字,将获取每次循环获得的结果存入一个字符串缓冲区
* 此时有两种情况出现:
* 1、循环本次值也为0,就没有必要存入;
* 2、上次值为0,本次值不为0,就需要在本次前面加一个字符串“零”。
* 解决办法:定义变量moneybj,用于存入本次值,加以判断确定存入什么值。
* 当值为0时,无法解决金额达到万或亿或万亿时,单位不能存入缓冲区,
* 解决办法:定义一个变量unitbj,用于判断
* 1、当0值“万”存入后,锁死标记,直到有非0值存入时才打开
* 2、亿在整个存入过程中只可能出现一次,所以不用判断,只要有“亿”,直接存入并锁死标记。
* 3、
*
* 注意:
* 本方法最大到千亿;
* 调用方法前,注意判断金额值为0和负数。为零直接打印输出零,为负数乘以-1后调用方法,在结果前面加”负“。
*/
package test;
import java.text.DecimalFormat;
class Test
{
public static void main(String[] args)
{
double my = 10001000.9;
if (formatdouble(my).equals("000") || (formatdouble(my).equals("-000")) )
sop("人民币零元整");
else
{
if (my
sop("人民币负"+strStandard(strUppercase(my*-1.0)));
else
sop("人民币"+strStandard(strUppercase(my)));
}
}
//按人民币大写的格式格式化
private static String strStandard(String s)
{
if (s.indexOf("分")==-1)
s= s+"整" ;
return s;
}
//定义大写数组和单位数组,并遍历格式化后的字符串,退回一个字符串
private static String strUppercase(double my)
{
//定义大写unit
String[] unit = {"仟","佰","拾","万","仟","佰","拾","亿","仟","佰","拾","万","仟","佰","拾","元","角","分"};
//定义大写单位money
String[] money = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
//定义缓冲区
StringBuilder strBuilder = new StringBuilder();
//格式化
String strFormat = formatdouble(my);
//遍历
int strlength=strFormat.length();
int moneybj = 1;//用于标记上次money值是否为零
int unitbj=1;//用于标记在money值等于0的情况下“万”是否存入过
for(int i=0;i
{
int value = Integer.parseInt(String.valueOf(strFormat.charAt(i)));
if (moneybj!=0 & value!=0 )//情况一:上次和本次值不为0,直接存入
{
strBuilder.append(money[value]).append(unit[unit.length-strlength+i]);
moneybj=value;
unitbj=1;
}
if(moneybj==0 & value!=0)//情况二:上次值为0,本次值不为0,加“零“存入
{
strBuilder.append("零").append(money[value]).append(unit[unit.length-strlength+i]);
moneybj=value;
unitbj=1;
}
if(moneybj==0 & value==0)//情况三:上次和本次值为0,不存入
{
if (unitbj==1 && unit[unit.length-strlength+i].equals("万") )
{
strBuilder.append("万");
unitbj=0;
}
if (unit[unit.length-strlength+i].equals("元") )//解决如果元位上是0的问题
{
strBuilder.append("元");
}
if (unit[unit.length-strlength+i].equals("亿") )
{
strBuilder.append("亿");
unitbj=0;
}
moneybj=value;
}
if(moneybj!=0 & value==0)//情况三:上次值不为0,本次值为0,不存入
{
if (unitbj==1 && unit[unit.length-strlength+i].equals("万") )
{
strBuilder.append("万");
unitbj=0;
}
if (unit[unit.length-strlength+i].equals("元") )//解决如果元位上是0的问题
{
strBuilder.append("元");
}
if (unit[unit.length-strlength+i].equals("亿") )
{
strBuilder.append("亿");
unitbj=0;
}
moneybj=value;
}
}
//在这种情况下前面会有“零”或 ”元“的存入,如 0.1 ,此时需要去掉“零”
if (strBuilder.indexOf("零")==0)
strBuilder.replace(0, 1, "");
if (strBuilder.indexOf("元")==0)
strBuilder.replace(0, 1, "");
return strBuilder.toString();
}
//格式化字符串并退回一个字符串;
private static String formatdouble(double my)
{
DecimalFormat format = new DecimalFormat("##0.00");
//删除小数点
String str = format.format(my);
return str.replace(".","");
}
//打印输出
private static void sop(Object obj)
{
System.out.println(obj);
}
}
回复 更多评论