直接复制测试即可。

    1. public static void main(String[] args) {
    2. // String[] num = convert(12345,false);
    3. // for (int i=0;i<num.length;i++) {
    4. // System.out.println(num[i]);
    5. // }
    6. int num= 123;
    7. System.out.println(cvt(num));
    8. }
    9. public static String[] convert(long num, boolean isColloquial) {
    10. if (num < 10) {// 10如下直接返回对应汉字
    11. return new String[] { CN_CHARS[(int) num] };// ASCII2int
    12. }
    13. char[] chars = String.valueOf(num).toCharArray();
    14. if (chars.length > CN_UNITS.length) {// 超过单位表示范围的返回空
    15. return new String[] {};
    16. }
    17. boolean isLastUnitStep = false;// 记录上次单位进位
    18. ArrayList<String> cnchars = new ArrayList<String>(chars.length * 2);// 建立数组,将数字填入单位对应的位置
    19. for (int pos = chars.length - 1; pos >= 0; pos--) {// 从低位向高位循环
    20. char ch = chars[pos];
    21. String cnChar = CN_CHARS[ch - '0'];// ascii2int 汉字
    22. int unitPos = chars.length - pos - 1;// 对应的单位坐标
    23. String cnUnit = CN_UNITS[unitPos];// 单位
    24. boolean isZero = (ch == '0');// 是否为0
    25. boolean isZeroLow = (pos + 1 < chars.length && chars[pos + 1] == '0');// 是否低位为0
    26. boolean isUnitStep = (unitPos >= UNIT_STEP && (unitPos % UNIT_STEP == 0));// 当前位是否须要单位进位
    27. if (isUnitStep && isLastUnitStep) {// 去除相邻的上一个单位进位
    28. int size = cnchars.size();
    29. cnchars.remove(size - 1);
    30. if (!CN_CHARS[0].equals(cnchars.get(size - 2))) {// 补0
    31. cnchars.add(CN_CHARS[0]);
    32. }
    33. }
    34. if (isUnitStep || !isZero) {// 单位进位(万、亿),或者非0时加上单位
    35. cnchars.add(cnUnit);
    36. isLastUnitStep = isUnitStep;
    37. }
    38. if (isZero && (isZeroLow || isUnitStep)) {// 当前位为0低位为0,或者当前位为0而且为单位进位时进行省略
    39. continue;
    40. }
    41. cnchars.add(cnChar);
    42. isLastUnitStep = false;
    43. }
    44. Collections.reverse(cnchars);
    45. // 清除最后一位的0
    46. int chSize = cnchars.size();
    47. String chEnd = cnchars.get(chSize - 1);
    48. if (CN_CHARS[0].equals(chEnd) || CN_UNITS[0].equals(chEnd)) {
    49. cnchars.remove(chSize - 1);
    50. }
    51. // 口语化处理
    52. if (isColloquial) {
    53. String chFirst = cnchars.get(0);
    54. String chSecond = cnchars.get(1);
    55. if (chFirst.equals(CN_CHARS[1]) && chSecond.startsWith(CN_UNITS[1])) {// 是否以'一'开头,紧跟'十'
    56. cnchars.remove(0);
    57. }
    58. }
    59. return cnchars.toArray(new String[] {});
    60. }
    61. public static String cvt(long num, boolean isColloquial) {
    62. String[] result = convert(num, isColloquial);
    63. StringBuffer strs = new StringBuffer(32);
    64. for (String str : result) {
    65. strs.append(str);
    66. }
    67. return strs.toString();
    68. }
    69. /**
    70. * 单位
    71. */
    72. public static String[] CN_UNITS = new String[] { "个", "十", "百", "千", "万", "十",
    73. "百", "千", "亿", "十", "百", "千", "万" };
    74. /**
    75. * 汉字
    76. */
    77. public static String[] CN_CHARS = new String[] { "零", "一", "二", "三", "四",
    78. "五", "六", "七", "八", "九" };
    79. public static int UNIT_STEP = 4;
    80. /**
    81. * 数值转换为中文字符串
    82. *
    83. * @param num
    84. * 须要转换的数值
    85. * @return
    86. */
    87. public static String cvt(long num) {
    88. return cvt(num, false);
    89. }

    结果如下:
    image.png