/* * Copyright 2017-2020 吴学文 and java110 team. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.java110.utils.util; /** * @desc add by 吴学文 17:14 */ public class Money2ChineseUtil { // 大写数字 private static final String[] NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; // 整数部分的单位 private static final String[] IUNIT = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟"}; // 小数部分的单位 private static final String[] DUNIT = {"角", "分", "厘"}; /** * 转换为大写的中文金额 * * @param price 字符串类型的 金额数字 * @return */ public static String toChineseChar(double price) { // 判断输入的金额字符串是否符合要求 String str = price + ""; if (StringUtil.isEmpty(str) || !str.matches("(-)?[\\d]*(.)?[\\d]*")) { return "抱歉,请输入数字!"; } if ("0".equals(str) || "0.00".equals(str) || "0.0".equals(str)) { return "零元"; } // 判断金额数字中是否存在负号"-" boolean flag = false; if (str.startsWith("-")) { // 标志位,标志此金额数字为负数 flag = true; str = str.replaceAll("-", ""); } // 去掉金额数字中的逗号"," str = str.replaceAll(",", ""); String integerStr;//整数部分数字 String decimalStr;//小数部分数字 // 初始化:分离整数部分和小数部分 if (str.indexOf(".") > 0) { integerStr = str.substring(0, str.indexOf(".")); decimalStr = str.substring(str.indexOf(".") + 1); } else if (str.indexOf(".") == 0) { integerStr = ""; decimalStr = str.substring(1); } else { integerStr = str; decimalStr = ""; } // beyond超出计算能力,直接返回 if (integerStr.length() > IUNIT.length) { return "超出计算能力!"; } // 整数部分数字 int[] integers = toIntArray(integerStr); // 判断整数部分是否存在输入012的情况 if (integers.length > 1 && integers[0] == 0) { return "抱歉,输入数字不符合要求!"; } // 设置万单位 boolean isWan = isWan5(integerStr); // 小数部分数字 int[] decimals = toIntArray(decimalStr); // 返回最终的大写金额 String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals); if (flag) { // 如果是负数,加上"负" return "负" + result; } else { return result; } } /** * 将字符串转为int数组 * * @param number 数字 * @return */ private static int[] toIntArray(String number) { int[] array = new int[number.length()]; for (int i = 0; i < number.length(); i++) { array[i] = Integer.parseInt(number.substring(i, i + 1)); } return array; } /** * 将整数部分转为大写的金额 * * @param integers 整数部分数字 * @param isWan 整数部分是否已经是达到【万】 * @return */ public static String getChineseInteger(int[] integers, boolean isWan) { StringBuffer chineseInteger = new StringBuffer(""); int length = integers.length; if (length == 1 && integers[0] == 0) { return ""; } for (int i = 0; i < length; i++) { String key = ""; if (integers[i] == 0) { if ((length - i) == 13)//万(亿) key = IUNIT[4]; else if ((length - i) == 9) {//亿 key = IUNIT[8]; } else if ((length - i) == 5 && isWan) {//万 key = IUNIT[4]; } else if ((length - i) == 1) {//元 key = IUNIT[0]; } if ((length - i) > 1 && integers[i + 1] != 0) { key += NUMBERS[0]; } } chineseInteger.append(integers[i] == 0 ? key : (NUMBERS[integers[i]] + IUNIT[length - i - 1])); } return chineseInteger.toString(); } /** * 将小数部分转为大写的金额 * * @param decimals 小数部分的数字 * @return */ private static String getChineseDecimal(int[] decimals) { StringBuffer chineseDecimal = new StringBuffer(""); for (int i = 0; i < decimals.length; i++) { if (i == 3) { break; } chineseDecimal.append(decimals[i] == 0 ? "" : (NUMBERS[decimals[i]] + DUNIT[i])); } return chineseDecimal.toString(); } /** * 判断当前整数部分是否已经是达到【万】 * * @param integerStr 整数部分数字 * @return */ private static boolean isWan5(String integerStr) { int length = integerStr.length(); if (length > 4) { String subInteger = ""; if (length > 8) { subInteger = integerStr.substring(length - 8, length - 4); } else { subInteger = integerStr.substring(0, length - 4); } return Integer.parseInt(subInteger) > 0; } else { return false; } } // Test public static void main(String[] args) { double number = 3462.98; System.out.println(number + ": " + toChineseChar(number)); } }