1. package practice;
  2.  
  3. import java.util.Arrays;
  4.  
  5. /**
  6. * 数字与中文数字互转(最大处理数字不超过万兆即:9999999999999999.9999)
  7. * @author Archimedes
  8. * @Date 6 7 19
  9. */
  10. public class ChineseNumberAndNumber {
  11.  
  12. private static final char NUMBER_CONSTRAINT[] = {'9', '8', '7', '6', '5', '4', '3', '2', '1', '0', '.'};
  13.  
  14. private static final String[] DECIMAL_UNIT = {"角", "分", "厘", "毫"};
  15.  
  16. private static final String[] CHINESE_NUMBER = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
  17.  
  18. private static final String[] INTEGER_UNIT = {"", "万", "亿", "兆"};
  19.  
  20. private static final String[] INTEGER_UNIT1 = {"", "拾", "佰", "仟"};
  21.  
  22. /**
  23. * 数字转中文数字
  24. * @param number
  25. * @return
  26. */
  27. public static String numberToChineseNumber(String number) {
  28. //数字有效性判断
  29. //先判断number中的数字是否在NUMBER_CONSTRAINT[]中
  30. int quantity = NUMBER_CONSTRAINT.length - 1;
  31. for (int i = 0; i < number.length(); i++) {
  32. char unit = number.charAt(i);
  33. for (int j = 0; j < NUMBER_CONSTRAINT.length; j++) {
  34. if (unit == NUMBER_CONSTRAINT[j]) break;
  35. if (j == quantity) return "请输入有效数字";
  36. }
  37. }
  38. //再判断number中小数点是否不超过1个且小数点不在第一位和最后一位
  39. int quantity1 = 0;
  40. for (int i = 0; i < number.length(); i++) {
  41. if ('.' == number.charAt(i) && (i == 0 || i == number.length() - 1)) return "1请输入有效数字";
  42. if ('.' == number.charAt(i)) {
  43. ++quantity1;
  44. if (quantity1 == 2) return "2请输入有效数字";
  45. }
  46. }
  47. //最后做数字范围的有效判断,并且把诸如0.000000000000000的数字转换为0
  48. if (quantity1 == 0) {
  49. number = headNumberIsZero(number);
  50. if (number.length() > 16) return "3请输入有效数字";
  51. } else {
  52. String[] split = number.split("[.]");
  53. //处理整数部分
  54. split[0] = headNumberIsZero(split[0]);
  55. if (split[0].length() > 16) return "4请输入有效数字";
  56. //处理小数部分
  57. if (split[1].length() > 4) {
  58. for (int i = 4; i < split[1].length(); i++) {
  59. if ('0' != split[1].charAt(i)) return "5请输入有效数字";
  60. }
  61. split[1] = split[1].substring(0, 4);
  62. }
  63. for (int i = split[1].length() - 1; i >= 0; i--) {
  64. if ('0' == split[1].charAt(i)) split[1] = split[1].substring(0, i);
  65. else break;
  66. }
  67. //合并整数与小数
  68. if (split[1].isEmpty()) number = split[0];
  69. else number = split[0] + "." + split[1];
  70. }
  71. //数字有效性判断完毕
  72.  
  73. //数字转中文数字
  74. String[] result = {"", ""};
  75. String[] split = number.split("[.]");
  76. //处理小数部分
  77. if (split.length == 2) {
  78. int c = 0; //定义标识用于判断前一位是否为0
  79. for (int i = 0; i < split[1].length(); i++) {
  80. if (c == 0 && ('0' == split[1].charAt(i))) {
  81. result[1] += CHINESE_NUMBER[0];
  82. c = 1;
  83. } else if ('0' != split[1].charAt(i)) {
  84. result[1] += (CHINESE_NUMBER[Integer.parseInt(String.valueOf(split[1].charAt(i)))] + DECIMAL_UNIT[i]);
  85. c = 0;
  86. }
  87. }
  88. }
  89. //处理整数部分
  90. //把整数部分从左到右每4个一组放入数组
  91. String[] integerPart = new String[(split[0].length() - 1) / 4 + 1];
  92. for (int i = split[0].length() - 1; i >= 0; i -= 4) {
  93. if (i - 3 >= 0) integerPart[i / 4] = split[0].substring(i - 3, i + 1);
  94. else integerPart[i / 4] = split[0].substring(0, i + 1);
  95. }
  96. System.out.println(Arrays.toString(integerPart));
  97. //转换
  98. int length = integerPart.length;
  99. int c = 0; //用于判断前一位是否为0
  100. if (length > 1) {
  101. int l = 1; ////用于判断上一次计数单位是否全为0(0表示全为0)
  102. for (int i = 0; i < integerPart.length; i++) {
  103. int x = 0; //用于判断计数单位是否全为0
  104. int length1 = integerPart[i].length();
  105. for (int j = 0; j < length1; j++) {
  106. if (c == 0 && '0' != integerPart[i].charAt(j)) {
  107. String temp = CHINESE_NUMBER[Integer.parseInt(String.valueOf(integerPart[i].charAt(j)))]
  108. + INTEGER_UNIT1[length1 - 1 -j];
  109. result[0] += temp;
  110. x = 1;
  111. } else if ('0' == integerPart[i].charAt(j)) {
  112. c = 1;
  113. } else if (c == 1 && j == 0 && '0' != integerPart[i].charAt(j)) {
  114. if (l == 0) result[0] += "零";
  115. String temp = CHINESE_NUMBER[Integer.parseInt(String.valueOf(integerPart[i].charAt(j)))]
  116. + INTEGER_UNIT1[length1 - 1 -j];
  117. result[0] += temp;
  118. c = 0; x = 1;
  119. } else if (c == 1 && j != 0 && '0' != integerPart[i].charAt(j)) {
  120. String temp = "零" + CHINESE_NUMBER[Integer.parseInt(String.valueOf(integerPart[i].charAt(j)))]
  121. + INTEGER_UNIT1[length1 - 1 -j];
  122. result[0] += temp;
  123. c = 0; x = 1;
  124. }
  125. }
  126. l = x; //把此次循环的计数单位是否全为0的结果赋值给变量,用于下次循环判断
  127. if (x == 1) result[0] += INTEGER_UNIT[length - 1 - i];
  128. }
  129. result[0] += "元";
  130. } else {
  131. int length1 = integerPart[0].length();
  132. for (int i = 0; i < length1; i++) {
  133. if (c == 0 && ('0' != integerPart[0].charAt(i))) {
  134. String temp = CHINESE_NUMBER[Integer.parseInt(String.valueOf(integerPart[0].charAt(i)))]
  135. + INTEGER_UNIT1[length1 - 1 - i];
  136. result[0] += temp;
  137. } else if ('0' == integerPart[0].charAt(i)) {
  138. if (length1 == 1) {
  139. result[0] += "零";
  140. }
  141. c = 1;
  142. } else if (c == 1 && ('0' != integerPart[0].charAt(i))) {
  143. String temp = "零" + CHINESE_NUMBER[Integer.parseInt(String.valueOf(integerPart[0].charAt(i)))]
  144. + INTEGER_UNIT1[length1 - 1 - i];
  145. result[0] += temp;
  146. c = 0;
  147. }
  148. }
  149. result[0] += "元";
  150. }
  151. if (split.length == 1) {
  152. result[0] += "整";
  153. return result[0];
  154. } else {
  155. if ("零元".equals(result[0])) return result[1];
  156. else return result[0] + result[1];
  157. }
  158. //数字转中文数字完毕
  159. }
  160.  
  161. /**
  162. * 把数字的前几个连续的0去掉,但数字如全为0则保留1个
  163. * @param number
  164. * @return
  165. */
  166. private static String headNumberIsZero(String number) {
  167. try {
  168. if ('0' == number.charAt(0)) return headNumberIsZero(number.substring(1));
  169. else return number;
  170. } catch (IndexOutOfBoundsException e) {
  171. return "0";
  172. }
  173. }
  174.  
  175. private static String headNumberIsZero1(String number) {
  176. if (number.isEmpty()) return "0";
  177. if ('0' == number.charAt(0)) return headNumberIsZero(number.substring(1));
  178. else return number;
  179. }
  180.  
  181. private static String headNumberIsZero2(String number) {
  182. if ('0' != number.charAt(0)) return number;
  183. else {
  184. for (int i = 1; i < number.length(); i++) {
  185. if ('0' != number.charAt(i)) {
  186. number = number.substring(i);
  187. break;
  188. } else if (i == number.length() -1) number = "0";
  189. }
  190. }
  191. return number;
  192. }
  193.  
  194. public static void main(String[] args) {
  195. String number = numberToChineseNumber("64646405000.033");
  196. System.out.println(number);
  197. }
  198.  
  199. }

JAVA处理数字与中文数字互转(最大处理数字不超过万兆即:9999999999999999.9999)的更多相关文章

  1. Java中过滤出字母、数字和中文的正则表达式

    1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A-Za-z)] (2)过滤出数字的正则表达式 [^(0-9)] (3)过滤出中文的正则表达式 [^(\\u4e0 ...

  2. java 数字转中文

    java代码 数字转中文,该方法只做了对int型整数的转换 private static String numberToChinese(int number) { String[] numbers = ...

  3. java中用正则表达式判断中文字符串中是否含有英文或者数字

    public static boolean includingNUM(String str)throws  Exception{ Pattern p  = Pattern.compile(" ...

  4. AJPFX总结关于Java中过滤出字母、数字和中文的正则表达式

    1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式      [^(A-Za-z)] (2) 过滤出 数字 的正则表达式   [^(0-9)] (3) 过滤出 中文 的正则 ...

  5. Java正则表达式过滤出字母、数字和中文

    原文:http://blog.csdn.net/k21325/article/details/54090066 1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A ...

  6. java实现数字转中文大写

    package cn.aikang.ChineseC; import java.util.Scanner; /** * @Description: TODO(这里用一句话描述这个类的作用) * @Au ...

  7. 使用Java将阿拉伯数字转换为中文数字(适配小数转换)

    Java数字转换工具类 简介 该工具类可以将整数.小数.负数转换为中文的数字,如: 0 --> 零 1 --> 一 2.1 --> 二点一 -2.1 --> 负二点一 具体代码 ...

  8. java判断字符串是否为数字或中文或字母

     个人认为最好的方法 *各种字符的unicode编码的范围:     * 汉字:[0x4e00,0x9fa5](或十进制[19968,40869])     * 数字:[0x30,0x39](或十进制 ...

  9. textbox只能输入数字或中文的常用正则表达式和验证方法

    验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9 ...

随机推荐

  1. Kafka Connect Architecture

    Kafka Connect's goal of copying data between systems has been tackled by a variety of frameworks, ma ...

  2. Tools - 关于Network

    Tcpdump homepage - tcpdump wiki - tcpdump Wireshark homepage - wireshark wiki - wireshark Wireshark基 ...

  3. MODRD 指令 读取地址是哪儿来的

    MODRD  s1  s2 n  例如: MODRD K1 H2102 K2    (台达VFDM变频器)   读取变频器的主频率及输出频率,并存放于寄存器D1050,D1051指令中s2的数据地址是 ...

  4. CF C.Ivan the Fool and the Probability Theory【思维·构造】

    题目传送门 题目大意: 一个$n*m$的网格图,每个格子可以染黑色.白色,问每个格子最多有一个相邻格子颜色相同的涂色方案数$n,m<=1e5$ 分析: 首先,考虑到如果有两个相邻的格子颜色相同, ...

  5. 使用kubeadm部署K8S v1.17.0集群

    kubeadm部署K8S集群 安装前的准备 集群机器 172.22.34.34 K8S00 172.22.34.35 K8S01 172.22.34.36 K8S02 注意: 本文档中的 etcd . ...

  6. IdentityServer4学习笔记汇总(实现传送门在底部)

    前言 互联网时代,对信息和资源的保护越发苛刻,在所有应用中授权和认证是必不可少缺少的一部分.如果一个应用没有授权和认证那么这个应用就是不完整或者说不安全的应用.在.Net平台给我们提供了一套完整的授权 ...

  7. 【转】git2.9.2使用总结

    git2.9.2使用总结 1.系统:Windows7 2.git版本:2.9.2 由于我的git版本是最新版,后面我出现的坑就是最新版本的问题. 3.托管环境:开源中国的码云 . 使用步骤 1.在码云 ...

  8. java如何获取当前日期和时间

    System.currentTimeMillis() 获取标准时间可以通过System.currentTimeMillis()方法获取,此方法不受时区影响,得到的结果是时间戳格式的.例如: 15431 ...

  9. 解决maven打包时,会编译特定文件导致文件不可用

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resou ...

  10. 《Tsinghua os mooc》第21~22讲 文件系统

    第二十一讲 文件系统 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能. 组织.检索.读写访问数据 大多数计算机系统都有文件系统 Google 也是一个文件系统 文件是具有符号名,由 ...