- package com.itheima;
- /*
- *
- 10、 金额转换,阿拉伯数字转换成中国传统形式。
- 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
- */
- public class Test10 {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- double d=101000001010.12;
- System.out.println(getChineseMoney(d));
-
-
- }
- /*
- * 金额转换函数:
- * 将金额粉整数和小数部分,小数部分好读,整数部分转为字符串并反转,这样从左往右读取时和单位变化一直,便于读取单位;
- * 每四维分一段,每个数字读取其大写数字和对应的段中单位,并在每一段加段单位;
- * 最后通过正则和字符串的操作去除多余的大写数字。
- *
- */
- public static String getChineseMoney(double d){
-
- String [] numbers={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};//建立每个数字的大写数组
- String [] units={"","拾","佰","仟"};//每一段中的单位
- String [] divs={"","万","亿"};//每一段的单位(只考虑千亿以内的金额,千亿之外方法类似)
- String [] sufdivs={"角","分"};//小数后面部分(取两位)
-
- long l=(long)d;//获取金额整数部分
- int sufI=(int)(d*100%100);//获取金额小数部分
-
- String str=String.valueOf(l);//整数部分转为字符串
-
- //通过StringBuilder反转字符串,这样从左忘右读取,这样角标对应的单位(段中单位,每一段单位)在
- //units,divs中也是从左往右变化,这样便于读取单位
- StringBuilder strb=new StringBuilder(str);
- strb.reverse();
- str=strb.toString();
-
- StringBuilder sb=new StringBuilder();//创建StringBuilder用于存储读到的每一位数字转为大写数字。
- int []arrInt=new int[str.length()];//int型数字用于存储每一位的数字
- for(int i=0;i<str.length();i++){
- arrInt[i]=Integer.valueOf(str.substring(i,i+1));//字符串中每一位数字赋给数组arrInt中每一位;
-
- //读取每一位并添加到sb中
- if(i==4){//读取到第五位时加上段单位”万“
- sb.insert(0, numbers[arrInt[i]]+divs[i/4]);
- }else if(i==8){//"读取到"第九位时加上段单位”亿“
- sb.insert(0, numbers[arrInt[i]]+divs[i/4]);
- }else{
- //其他位的读取
- if(arrInt[i]==0){//为零时,只读取零,不读取段中单位”拾佰仟“
- sb.insert(0, numbers[arrInt[i]]);
- }else//不为零时,读取数字和段中单位
- sb.insert(0, numbers[arrInt[i]]+units[i%4]);
- }
- }
- //读取完整数部分读取小数部分
- if(sufI==0){//小数部分为0,则直接添加”圆整“,读取完毕
- sb.append("圆整");
- }else{//小数部分不为0,则添加”圆“并读取小数部分
- sb.append("圆");
- int i1=sufI/10;//去小数部分第一位
- int i2=sufI%10;//小数部分第二位
- //下属部分的两位只要某一位为0,则不读取,不为0,则读取数字和对应的单位”角分“
- if(i1!=0){
- sb.append(numbers[i1]+sufdivs[0]);
- }
- if(i2!=0){
- sb.append(numbers[i2]+sufdivs[1]);
- }
-
- }
-
- String strChina=sb.toString();//读取的sb转成字符串,以便于操作
- strChina=strChina.replaceAll("(.)\\1+","$1");//去除叠词”零“,只取一个”零“
- strChina=strChina.replace("亿零万", "亿零");//万位全为0,则不读取”万“
- strChina=strChina.replace("零亿", "亿");//整拾、整百、整千亿时,去掉亿前面的零
- strChina=strChina.replace("零万", "万");//整拾、整百、整千万时,去掉万前面的零
- strChina=strChina.replace("零圆", "圆");//整拾、整百、整千时,去掉圆前面的零
- return strChina;
- }
- }
复制代码
|
|