NumberUtil.java 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package com.onemap.analyse.utils;
  2. import java.math.BigDecimal;
  3. public class NumberUtil {
  4. private NumberUtil() {
  5. }
  6. /**
  7. * 中文数字
  8. */
  9. private static final String[] CN_NUM = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
  10. /**
  11. * 中文数字单位
  12. */
  13. private static final String[] CN_UNIT = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千"};
  14. /**
  15. * 特殊字符:负
  16. */
  17. private static final String CN_NEGATIVE = "负";
  18. /**
  19. * 特殊字符:点
  20. */
  21. private static final String CN_POINT = "点";
  22. /**
  23. * int 转 中文数字
  24. * 支持到int最大值
  25. *
  26. * @param intNum 要转换的整型数
  27. * @return 中文数字
  28. */
  29. public static String int2chineseNum(int intNum) {
  30. StringBuffer sb = new StringBuffer();
  31. StringBuffer sb2 = new StringBuffer();
  32. int intNum2 = intNum;
  33. boolean isNegative = false;
  34. if (intNum < 0) {
  35. isNegative = true;
  36. intNum *= -1;
  37. }
  38. int count = 0;
  39. while (intNum > 0) {
  40. sb.insert(0, CN_NUM[intNum % 10] + CN_UNIT[count]);
  41. intNum = intNum / 10;
  42. count++;
  43. }
  44. if (isNegative)
  45. sb.insert(0, CN_NEGATIVE);
  46. // 10-19时,得到十~十九而不是一十~一十九
  47. sb = "一".equals(sb.substring(0, 1)) && intNum2 < 100 && intNum2 > 1 ? sb2.append(sb.substring(1, sb.length())) : sb;
  48. return sb.toString().replaceAll("零[千百十]", "零").replaceAll("零+万", "万")
  49. .replaceAll("零+亿", "亿").replaceAll("亿万", "亿零")
  50. .replaceAll("零+", "零").replaceAll("零$", "");
  51. }
  52. /**
  53. * bigDecimal 转 中文数字
  54. * 整数部分只支持到int的最大值
  55. *
  56. * @param bigDecimalNum 要转换的BigDecimal数
  57. * @return 中文数字
  58. */
  59. public static String bigDecimal2chineseNum(BigDecimal bigDecimalNum) {
  60. if (bigDecimalNum == null)
  61. return CN_NUM[0];
  62. StringBuffer sb = new StringBuffer();
  63. // 将小数点后面的零给去除
  64. String numStr = bigDecimalNum.abs().stripTrailingZeros().toPlainString();
  65. String[] split = numStr.split("\\.");
  66. String integerStr = int2chineseNum(Integer.parseInt(split[0]));
  67. sb.append(integerStr);
  68. // 如果传入的数有小数,则进行切割,将整数与小数部分分离
  69. if (split.length == 2) {
  70. // 有小数部分
  71. sb.append(CN_POINT);
  72. String decimalStr = split[1];
  73. char[] chars = decimalStr.toCharArray();
  74. for (int i = 0; i < chars.length; i++) {
  75. int index = Integer.parseInt(String.valueOf(chars[i]));
  76. sb.append(CN_NUM[index]);
  77. }
  78. }
  79. // 判断传入数字为正数还是负数
  80. int signum = bigDecimalNum.signum();
  81. if (signum == -1) {
  82. sb.insert(0, CN_NEGATIVE);
  83. }
  84. return sb.toString();
  85. }
  86. /**
  87. * float 保留两位小数
  88. */
  89. public static float float2TwoDecimal(float f) {
  90. BigDecimal b = new BigDecimal(f);
  91. return b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
  92. }
  93. /**
  94. * double 保留两位小数
  95. */
  96. public static double double2TwoDecimal(double d) {
  97. BigDecimal b = new BigDecimal(d);
  98. return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
  99. }
  100. }