java 中文大写金额_金额数字转中文大写

# 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);

}

}

回复  更多评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值