A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


  1. /*
  2. * 10、  金额转换,阿拉伯数字转换成中国传统形式。
  3. * 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
  4. */

  5. /*
  6. * 分析:
  7. *         1,要实现金额转换,首先要有数字,从键盘输入一个double类型的数字
  8. *         2,在处理数字时不仅仅要将阿拉伯数字转换成传统格式,而且还要注意单位,每4位是一个
  9. *         进制单位,如圆,万,亿,万亿
  10. *         3,同时对输入的数字处理要考虑到整数和小数两个部分,在整数部分的处理中,还需要注意
  11. *         连续多个零的情况,根据我们平时的习惯我们不会在整数部分读出所有零,我们一般都是
  12. *         只读一个零,其他的省略
  13. *         4,为了方便转换,我们可以把输入的double类型的小数*100转成整数,然后切割字符串,
  14. *         对整数部分和小数部分再分别进行处理
  15. *         5,因为String类型不能改变长度,我们可以在缓冲区操作StringBuilder,使用该类的add方法
  16. *         对字符串进行拼接
  17. *         6,最后,再将整数和小数部分连接起来,完成转换
  18. */
  19. import java.util.Scanner;

  20. public class Test10 {
  21.         // 定义单位,数字数组
  22.         private static String[] bigUnit = { "圆", "万", "亿", "万亿" };
  23.         private static String[] smallUnit = { "仟", "佰", "拾" };
  24.         private static String[] capital = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒",
  25.                         "捌", "玖" };
  26.         private static String[] decimals = { "角", "分" };

  27.         public static void main(String[] args) {
  28.                 // 键盘录入一个数,用double类型的数接收
  29.                 Scanner sc = new Scanner(System.in);
  30.                 double num = sc.nextDouble();
  31.                 // 调用方法,传递接收到的double类型的数
  32.                 System.out.println(numToRmb(num));
  33.         }

  34.         // 定义方法,实现阿拉伯数字到中国传统格式的转换
  35.         public static String numToRmb(double num) {
  36.                 //String result = null;
  37.                 StringBuilder sb = new StringBuilder();
  38.                 long zheng = (long) num;
  39.                 // 传递一个double类型的数,返回long型的最接近的传递参数的数
  40.                 long xiao = Math.round((num - zheng) * 100);
  41.                 String xiaoStr = String.valueOf(xiao);
  42.                 String zhengStr = String.valueOf(zheng);
  43.                 // 给小数部分加单位和转换数字
  44.                 String end = xiaoPart(xiaoStr);
  45.                 // 给整数部分加单位和转换数字
  46.                 int length = zhengStr.length();
  47.                 if (zhengStr.length() % 4 == 0) {
  48.                         int part = zhengStr.length() / 4;
  49.                         for (int i = 0; i < part; i++) {
  50.                                 sb.insert(0, addUnit(zhengStr, length, i));
  51.                         }
  52.                         /*result = */endConvent(sb.toString());
  53.                 } else {
  54.                         // 不能被4整出的话 在最前面用0补位补到可以被4整除
  55.                         int part = zhengStr.length() / 4 + 1;
  56.                         int buLing = 4 - sb.length() % 4;
  57.                         StringBuilder tmpSB = new StringBuilder(zhengStr);
  58.                         for (int i = 0; i < buLing; i++) {
  59.                                 tmpSB.insert(0, "0");
  60.                         }
  61.                         for (int i = 0; i < part; i++) {
  62.                                 sb.insert(0, addUnit(tmpSB.toString(), tmpSB.length(), i));
  63.                         }
  64.                         //result = endConvent(sb.toString());
  65.                 }
  66.                 return endConvent(sb.toString()) + end;
  67.         }

  68.         // 处理字符串 去掉大单位前面多余的零
  69.         private static String endConvent(String str) {
  70.                 str = str.replace("零万亿", "万亿");
  71.                 str = str.replace("零亿", "亿");
  72.                 str = str.replace("零万", "万");
  73.                 str = str.replace("零圆", "圆");
  74.                 // 如果不能被4整出 去掉前面补的零
  75.                 if (str.charAt(0) == '零') {
  76.                         str = str.substring(1, str.length());
  77.                 }
  78.                 return str;
  79.         }

  80.         // 小数部分转换加单位
  81.         private static String xiaoPart(String xiaoStr) {
  82.                 //String xiaoResult = null;
  83.                 StringBuilder xiaosb = new StringBuilder();
  84.                 for (int i = 0; i < xiaoStr.length(); i++) {
  85.                                 int k = xiaoStr.charAt(i) - 48;
  86.                                 xiaosb.append(capital[k] + decimals[i]);
  87.                         }
  88.                 //xiaoResult = xiaosb.toString();
  89.                 return xiaosb+""/*.toString()*/;
  90.         }

  91.         // 整数部分添加单位并转换数字
  92.         private static String addUnit(String numStr, int length, int index) {
  93.                 String result = null;
  94.                 StringBuilder sb = new StringBuilder();
  95.                 String tmp = null;
  96.                 //得到每四位后面的大单位
  97.                 String endTmp = bigUnit[index];
  98.                 //将输入的数每四个分为一组,转换成int类型数字
  99.                 tmp = numStr.substring(length - 4 * (index + 1), length - 4 * index);
  100.                 for (int i = 0; i < tmp.length(); i++) {
  101.                         if (tmp.charAt(i) == '0') {
  102.                                 // 把char型数字转换成的int型数字,因为它们的ASCII码值恰好相差48
  103.                                 // 因此把char型数字减去48得到int型数字
  104.                                 int k = tmp.charAt(i) - 48;
  105.                                 sb.append(capital[k]);
  106.                         } else {
  107.                                 int k = tmp.charAt(i) - 48;
  108.                                 if (i != tmp.length() - 1) {
  109.                                         //将小单位加在对应的数字后面存储到缓冲区
  110.                                         sb.append(capital[k] + smallUnit[i]);
  111.                                 } else {
  112.                                         sb.append(capital[k]);
  113.                                 }
  114.                         }
  115.                 }
  116.                 //去零操作,去掉多余的零,使用String类的替换功能
  117.                 result = sb.toString() + endTmp;
  118.                 result = result.replace("零零零零万亿", "零");
  119.                 result = result.replace("零零零零亿", "零");
  120.                 result = result.replace("零零零零万", "零");
  121.                 result = result.replace("零零零零", "零");
  122.                 result = result.replace("零零零", "零");
  123.                 result = result.replace("零零", "零");
  124.                 return result;
  125.         }
  126. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马