阿拉伯数字金额转换成中国传统形式如:
(¥1011) ->(壹仟零壹拾壹元整)
考虑的方面很多,给出特定的测试实例:
- 1011.11
- 1011.1
- 101
- 10000001
- 1001111
还有数字过长的情况,等等
代码如下所示:
public class MoneyTransfer
{
private static String[] base = {"个","拾","佰","仟"};
private static String[] base2 = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾"};
private static String[] base3 = {"元","万","亿"};
/**
* 缺少异常处理
* @param s转换的字符
* @return
*/
public String transfer(String s)
{
StringBuilder sb = new StringBuilder();
//去掉开头的Y
String sub = s.substring(1,s.length());
int subLength = sub.length();
//判断是否有小数
System.out.println(sub.contains("."));
if(sub.contains("."))
{
//获取小数点的位置
int index = sub.indexOf(".");
System.out.println(index);
//获取前半部分的读法
String back1 = readInt(sub.substring(0,index));
sb.append(back1);
sb.append("元");
if(index + 1 < subLength)
{
int tem = sub.charAt(index + 1) -'0';
sb.append(base2[tem]);
sb.append("角");
}
if(index + 2 < subLength)
{
int tem2 = sub.charAt(index + 2) - '0';
sb.append(base2[tem2]);
sb.append("分");
}
return sb.toString();
}
else
{
String back = readInt(sub);
sb.append(back);
sb.append("元整");
return sb.toString();
}
}
/**
* 把整数部分读取
* @param s
* @return
*/
public String readInt(String s)
{
StringBuilder sbr = new StringBuilder();
int len = s.length();
int flag = len / 4;
int flag_t = flag;
int over = len % 4;
int overflow = over;
int begin = 0;
while(overflow <= len)
{
while(begin < overflow && begin < len)
{
int i = s.charAt(begin) - '0';
int sbrlen = sbr.length();
int tag = overflow - begin - 1;
//不为0的情况,直接填写
if(i != 0)
{
//将上一部中遗留的0去掉
if(sbrlen > 0 && overflow - begin == 4 && sbr.substring(sbrlen - 1, sbrlen).equals("零"))
{
sbr.delete(sbrlen - 1, sbrlen);
sbr.append(base2[i]);
if(tag > 0)
sbr.append(base[tag]);
}
else
{
sbr.append(base2[i]);
if(tag > 0)
sbr.append(base[tag]);
if(begin + 1 == overflow)
if(flag > 1)
if(flag_t > 0)
sbr.append(base3[flag_t]);
else if(flag == 1)
if(over != 0)
sbr.append(base3[flag_t]);
}
}
//开头为 0 的情况
else
{
//当前面为0时
if(sbrlen > 0 && sbr.substring(sbrlen - 1, sbrlen).equals("零") )
{
//是不是最后一位
if(begin + 1 == overflow)
{
sbr.delete(sbrlen - 1, sbrlen);
if(over != 0 && flag_t > 0)
sbr.append(base3[flag_t]);
sbr.append("零");
}
}
//当前面不为0是
else
{
if(begin + 1 == overflow)
{
if(over != 0 && flag > 0)
sbr.append(base3[flag]);
sbr.append("零");
}
else
sbr.append("零");
}
}
begin ++;
}
flag_t--;
overflow += 4;
}
if(sbr.substring(sbr.length() - 1, sbr.length()).equals("零"))
sbr.delete(sbr.length() - 1, sbr.length());
return sbr.toString();
}
public static void main(String[] args)
{
MoneyTransfer mt = new MoneyTransfer();
System.out.print(mt.transfer("¥111111111111.11"));
}
}