• 金额处理


    package cn.ztuo.bitrade.util;

    import org.springframework.util.StringUtils;

    import java.math.BigDecimal;

    public class MoneyUtil {

    /**
    * 大写数字
    */
    private static final String[] NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆",
    "柒", "捌", "玖"};
    /**
    * 整数部分的单位
    */
    private static final String[] IUNIT = {"元", "拾", "佰", "仟", "万", "拾", "佰",
    "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟"};
    /**
    * 小数部分的单位
    */
    private static final String[] DUNIT = {"角", "分", "厘"};

    /**
    * 得到大写金额。
    */
    public static String toBigType(String str) {
    if(StringUtils.isEmpty(str)){
    return "零元整";
    }
    String mark = "正";
    if("-".equals(str.substring(0,1)))
    {
    mark="负";
    str = str.substring(1,str.length());
    }

    str = str.replaceAll(",", "");// 去掉","
    String integerStr;
    String decimalStr;
    //处理科学计数法
    if(str.indexOf("E")>0){
    BigDecimal b = new BigDecimal(str);
    str = b.toPlainString();
    }
    // 初始化:分离整数部分和小数部分
    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 = "";
    }
    // integerStr去掉首0,不必去掉decimalStr的尾0(超出部分舍去)
    if (!integerStr.equals("")) {
    integerStr = Long.toString(Long.parseLong(integerStr));
    if (integerStr.equals("0")) {
    integerStr = "";
    }
    }
    // overflow超出处理能力,直接返回
    if (integerStr.length() > IUNIT.length) {
    System.out.println(str + ":超出处理能力");
    return str;
    }

    int[] integers = toArray(integerStr);// 整数部分数字
    boolean isMust5 = isMust5(integerStr);// 设置万单位
    int[] decimals = toArray(decimalStr);// 小数部分数字
    String money = getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);

    if (!money.isEmpty()) {
    if (money.charAt(money.length() - 1) == '元') {
    StringBuffer m = new StringBuffer();
    m.append(money);
    m.append("整");
    if("负".equals(mark))
    {
    return mark+m.toString();
    }
    return m.toString();
    } else {
    if("负".equals(mark))
    {
    return mark+getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);
    }
    return getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);
    }
    }else {
    return "零元整";
    }

    }

    /**
    * 整数部分和小数部分转换为数组,从高位至低位
    */
    private static int[] toArray(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;
    }

    /**
    * 得到中文金额的整数部分。
    */
    private static String getChineseInteger(int[] integers, boolean isMust5) {
    StringBuffer chineseInteger = new StringBuffer("");
    int length = integers.length;
    for (int i = 0; i < length; i++) {
    // 0出现在关键位置:1234(万)5678(亿)9012(万)3456(元)
    // 特殊情况:10(拾元、壹拾元、壹拾万元、拾万元)
    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 && isMust5)// 万(不必填)
    key = IUNIT[4];
    else if ((length - i) == 1)// 元(必填)
    key = IUNIT[0];
    // 0遇非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();
    }

    /**
    * 得到中文金额的小数部分。
    */
    private static String getChineseDecimal(int[] decimals) {
    StringBuffer chineseDecimal = new StringBuffer("");
    for (int i = 0; i < decimals.length; i++) {
    // 舍去3位小数之后的
    if (i == 3)
    break;
    chineseDecimal.append(decimals[i] == 0 ? ""
    : (NUMBERS[decimals[i]] + DUNIT[i]));
    }
    return chineseDecimal.toString();
    }

    /**
    * 判断第5位数字的单位"万"是否应加。
    */
    private static boolean isMust5(String integerStr) {
    int length = integerStr.length();
    if (length > 4) {
    String subInteger = "";
    if (length > 8) {
    // 取得从低位数,第5到第8位的字串
    subInteger = integerStr.substring(length - 8, length - 4);
    } else {
    subInteger = integerStr.substring(0, length - 4);
    }
    return Integer.parseInt(subInteger) > 0;
    } else {
    return false;
    }
    }


    public static void main(String[] args) {
    System.out.println(toBigType("152300250.01005"));
    }

    }
  • 相关阅读:
    Core Expression
    Linux基础
    express
    C#程序模拟登录批量获取各种邮件内容信息
    Windows Phone 执行模型概述
    Wp8—LongListSelector控件使用
    网页背景图片自然缩放
    Unix sed实用教程系列目录[已完成]
    Unix sed实用教程开篇
    《SpringMVC从入门到放肆》十五、SpringMVC之上传文件
  • 原文地址:https://www.cnblogs.com/tubashu/p/11947701.html
Copyright © 2020-2023  润新知