{"id":326,"date":"2023-02-25T06:21:07","date_gmt":"2023-02-24T22:21:07","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=326"},"modified":"2023-04-30T14:53:13","modified_gmt":"2023-04-30T06:53:13","slug":"java-implement-convert-numerical-amount-into-uppercase-chinese-amount","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/02\/25\/java-implement-convert-numerical-amount-into-uppercase-chinese-amount\/","title":{"rendered":"Java\u5b9e\u73b0\u5c06\u6570\u5b57\u91d1\u989d\u8f6c\u4e3a\u5927\u5199\u4e2d\u6587\u91d1\u989d"},"content":{"rendered":"<p>\u8f93\u5165\u6570\u5b57\u91d1\u989d\u53c2\u6570\uff0c\u8fd0\u884c\u7a0b\u5e8f\u5f97\u5230\u5176\u5bf9\u5e94\u7684\u5927\u5199\u4e2d\u6587\u91d1\u989d\uff1b\u4f8b\u5982\uff1a\u8f93\u5165<code>-12.56<\/code>\uff0c\u8f93\u51fa<code>-12.56: \u58f9\u62fe\u8d30\u5143\u4f0d\u89d2\u9646\u5206<\/code><\/p>\n<p>Hutool\u5de5\u5177\u5305\u4e2d\u4e5f\u542b\u6709\u4e00\u4e2a\u7c7b\u578b\u8f6c\u6362\u7684\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u201c\u91d1\u989d\u7684\u5927\u5c0f\u5199\u201d\u8f6c\u6362\uff0c\u4f46\u662f\u8fd9\u4e2a\u5de5\u5177\u5305\u4e5f\u6709\u4e00\u4e9b\u5c40\u9650\uff0c\u201c\u8f6c\u6362\u4e3a\u5927\u5199\u53ea\u80fd\u7cbe\u786e\u5230\u5206\uff08\u5c0f\u6570\u70b9\u513f\u540e\u4e24\u4f4d\uff09\uff0c\u4e4b\u540e\u7684\u6570\u5b57\u4f1a\u88ab\u5ffd\u7565\u201d\u3002\u53c2\u8003\u6587\u6863\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/www.hutool.cn\/docs\/#\/core\/\u7c7b\u578b\u8f6c\u6362\/\u7c7b\u578b\u8f6c\u6362\u5de5\u5177\u7c7b-Convert\">https:\/\/www.hutool.cn\/docs\/#\/core\/\u7c7b\u578b\u8f6c\u6362\/\u7c7b\u578b\u8f6c\u6362\u5de5\u5177\u7c7b-Convert<\/a><\/p>\n<p><!-- more --><\/p>\n<pre><code class=\"language-java\">\/**\n * @Title: ConvertUpMoney\n * @Description: \u5c06\u6570\u5b57\u91d1\u989d\u8f6c\u4e3a\u5927\u5199\u6c49\u5b57\u91d1\u989d\n *\/\npublic class ConvertUpMoney {\n\n    \/\/\u5927\u5199\u6570\u5b57\n    private static final String[] NUMBERS = {&quot;\u96f6&quot;, &quot;\u58f9&quot;, &quot;\u8d30&quot;, &quot;\u53c1&quot;, &quot;\u8086&quot;, &quot;\u4f0d&quot;, &quot;\u9646&quot;, &quot;\u67d2&quot;, &quot;\u634c&quot;, &quot;\u7396&quot;};\n    \/\/ \u6574\u6570\u90e8\u5206\u7684\u5355\u4f4d\n    private static final String[] IUNIT = {&quot;\u5143&quot;, &quot;\u62fe&quot;, &quot;\u4f70&quot;, &quot;\u4edf&quot;, &quot;\u4e07&quot;, &quot;\u62fe&quot;, &quot;\u4f70&quot;, &quot;\u4edf&quot;, &quot;\u4ebf&quot;, &quot;\u62fe&quot;, &quot;\u4f70&quot;, &quot;\u4edf&quot;, &quot;\u4e07&quot;, &quot;\u62fe&quot;, &quot;\u4f70&quot;, &quot;\u4edf&quot;};\n    \/\/\u5c0f\u6570\u90e8\u5206\u7684\u5355\u4f4d\n    private static final String[] DUNIT = {&quot;\u89d2&quot;, &quot;\u5206&quot;, &quot;\u5398&quot;};\n\n    \/\/\u8f6c\u6210\u4e2d\u6587\u7684\u5927\u5199\u91d1\u989d\n    public static String toChinese(String str) {\n        \/\/\u5224\u65ad\u8f93\u5165\u7684\u91d1\u989d\u5b57\u7b26\u4e32\u662f\u5426\u7b26\u5408\u8981\u6c42\n        if (StringUtils.isBlank(str) || !str.matches(&quot;(-)?[\\\\d]*(.)?[\\\\d]*&quot;)) {\n            System.out.println(&quot;\u62b1\u6b49\uff0c\u8bf7\u8f93\u5165\u6570\u5b57\uff01&quot;);\n            return str;\n        }\n\n        if (&quot;0&quot;.equals(str) || &quot;0.00&quot;.equals(str) || &quot;0.0&quot;.equals(str)) {\n            return &quot;\u96f6\u5143&quot;;\n        }\n\n        \/\/\u5224\u65ad\u662f\u5426\u5b58\u5728\u8d1f\u53f7&quot;-&quot;\n        boolean flag = false;\n        if (str.startsWith(&quot;-&quot;)) {\n            flag = true;\n            str = str.replaceAll(&quot;-&quot;, &quot;&quot;);\n        }\n\n        str = str.replaceAll(&quot;,&quot;, &quot;&quot;);\/\/\u53bb\u6389&quot;,&quot;\n        String integerStr;\/\/\u6574\u6570\u90e8\u5206\u6570\u5b57\n        String decimalStr;\/\/\u5c0f\u6570\u90e8\u5206\u6570\u5b57\n\n        \/\/\u521d\u59cb\u5316\uff1a\u5206\u79bb\u6574\u6570\u90e8\u5206\u548c\u5c0f\u6570\u90e8\u5206\n        if (str.indexOf(&quot;.&quot;) &gt; 0) {\n            integerStr = str.substring(0, str.indexOf(&quot;.&quot;));\n            decimalStr = str.substring(str.indexOf(&quot;.&quot;) + 1);\n        } else if (str.indexOf(&quot;.&quot;) == 0) {\n            integerStr = &quot;&quot;;\n            decimalStr = str.substring(1);\n        } else {\n            integerStr = str;\n            decimalStr = &quot;&quot;;\n        }\n\n        \/\/beyond\u8d85\u51fa\u8ba1\u7b97\u80fd\u529b\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (integerStr.length() &gt; IUNIT.length) {\n            System.out.println(str + &quot;\uff1a\u8d85\u51fa\u8ba1\u7b97\u80fd\u529b&quot;);\n            return str;\n        }\n\n        int[] integers = toIntArray(integerStr);\/\/\u6574\u6570\u90e8\u5206\u6570\u5b57\n        \/\/\u5224\u65ad\u6574\u6570\u90e8\u5206\u662f\u5426\u5b58\u5728\u8f93\u5165012\u7684\u60c5\u51b5\n        if (integers.length &gt; 1 &amp;&amp; integers[0] == 0) {\n            System.out.println(&quot;\u62b1\u6b49\uff0c\u8bf7\u8f93\u5165\u6570\u5b57\uff01&quot;);\n            if (flag) {\n                str = &quot;-&quot; + str;\n            }\n            return str;\n        }\n        boolean isWan = isWan5(integerStr);\/\/\u8bbe\u7f6e\u4e07\u5355\u4f4d\n        int[] decimals = toIntArray(decimalStr);\/\/\u5c0f\u6570\u90e8\u5206\u6570\u5b57\n        String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals);\/\/\u8fd4\u56de\u6700\u7ec8\u7684\u5927\u5199\u91d1\u989d\n        if (flag) {\n            return &quot;\u8d1f&quot; + result;\/\/\u5982\u679c\u662f\u8d1f\u6570\uff0c\u52a0\u4e0a&quot;\u8d1f&quot;\n        } else {\n            return result;\n        }\n    }\n\n    \/\/\u5c06\u5b57\u7b26\u4e32\u8f6c\u4e3aint\u6570\u7ec4\n    private static int[] toIntArray(String number) {\n        int[] array = new int[number.length()];\n        for (int i = 0; i &lt; number.length(); i++) {\n            array[i] = Integer.parseInt(number.substring(i, i + 1));\n        }\n        return array;\n    }\n\n    \/\/\u5c06\u6574\u6570\u90e8\u5206\u8f6c\u4e3a\u5927\u5199\u7684\u91d1\u989d\n    public static String getChineseInteger(int[] integers, boolean isWan) {\n        StringBuffer chineseInteger = new StringBuffer(&quot;&quot;);\n        int length = integers.length;\n        if (length == 1 &amp;&amp; integers[0] == 0) {\n            return &quot;&quot;;\n        }\n        for (int i = 0; i &lt; length; i++) {\n            String key = &quot;&quot;;\n            if (integers[i] == 0) {\n                if ((length - i) == 13)\/\/\u4e07\uff08\u4ebf\uff09\n                    key = IUNIT[4];\n                else if ((length - i) == 9) {\/\/\u4ebf\n                    key = IUNIT[8];\n                } else if ((length - i) == 5 &amp;&amp; isWan) {\/\/\u4e07\n                    key = IUNIT[4];\n                } else if ((length - i) == 1) {\/\/\u5143\n                    key = IUNIT[0];\n                }\n                if ((length - i) &gt; 1 &amp;&amp; integers[i + 1] != 0) {\n                    key += NUMBERS[0];\n                }\n            }\n            chineseInteger.append(integers[i] == 0 ? key : (NUMBERS[integers[i]] + IUNIT[length - i - 1]));\n        }\n        return chineseInteger.toString();\n    }\n\n    \/\/\u5c06\u5c0f\u6570\u90e8\u5206\u8f6c\u4e3a\u5927\u5199\u7684\u91d1\u989d\n    private static String getChineseDecimal(int[] decimals) {\n        StringBuffer chineseDecimal = new StringBuffer(&quot;&quot;);\n        for (int i = 0; i &lt; decimals.length; i++) {\n            if (i == 3) {\n                break;\n            }\n            chineseDecimal.append(decimals[i] == 0 ? &quot;&quot; : (NUMBERS[decimals[i]] + DUNIT[i]));\n        }\n        return chineseDecimal.toString();\n    }\n\n    \/\/\u5224\u65ad\u5f53\u524d\u6574\u6570\u90e8\u5206\u662f\u5426\u5df2\u7ecf\u662f\u8fbe\u5230\u3010\u4e07\u3011\n    private static boolean isWan5(String integerStr) {\n        int length = integerStr.length();\n        if (length &gt; 4) {\n            String subInteger = &quot;&quot;;\n            if (length &gt; 8) {\n                subInteger = integerStr.substring(length - 8, length - 4);\n            } else {\n                subInteger = integerStr.substring(0, length - 4);\n            }\n            return Integer.parseInt(subInteger) &gt; 0;\n        } else {\n            return false;\n        }\n    }\n\n    \/\/Test\n    public static void main(String[] args) {\n        String number = &quot;12.56&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        number = &quot;1234567890563886.123&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        number = &quot;1600&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        number = &quot;156,0&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        number = &quot;-156,0&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        number = &quot;0.12&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        number = &quot;0.0&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        number = &quot;01.12&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        number = &quot;0125&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        number = &quot;-0125&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        number = &quot;appblog666&quot;;\n        System.out.println(number + &quot;: &quot; + ConvertUpMoney.toChinese(number));\n\n        System.out.println(null + &quot;: &quot; + ConvertUpMoney.toChinese(null));\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u8f93\u5165\u6570\u5b57\u91d1\u989d\u53c2\u6570\uff0c\u8fd0\u884c\u7a0b\u5e8f\u5f97\u5230\u5176\u5bf9\u5e94\u7684\u5927\u5199\u4e2d\u6587\u91d1\u989d\uff1b\u4f8b\u5982\uff1a\u8f93\u5165-12.56\uff0c\u8f93\u51fa-12.56: \u58f9\u62fe\u8d30\u5143\u4f0d\u89d2\u9646 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43],"tags":[],"class_list":["post-326","post","type-post","status-publish","format-standard","hentry","category-java-basic"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/326","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=326"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/326\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=326"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=326"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=326"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}