public class MoneyUtil {   
    private final static String[] CN_Digits = { "零", "壹", "貳", "叁", "肆", "伍", "陆", "柒", "捌", "玖", };   
 
    /**  
     * 将数字型货币转换为中文型货币 <br/>  
     * 参数:<br/>  
     *   
     * @param moneyValue  
     *             字符串形式的金额,小数部分,将多于3位部分舍去,不做四舍五入  
     * @return  
     */  
    public static String CNValueOf(String moneyValue) {   
        //使用正则表达式,去除前面的零及数字中的逗号   
        String value = moneyValue.replaceFirst("^0+", "");   
        value = value.replaceAll(",", "");   
        //分割小数部分与整数部分   
        int dot_pos = value.indexOf('.');   
        String int_value;   
        String fraction_value;   
        if (dot_pos == -1) {   
            int_value = value;   
            fraction_value = "00";   
        } else {   
            int_value = value.substring(0, dot_pos);   
            fraction_value = value.substring(dot_pos + 1, value.length())   
                    + "00".substring(0, 2);//也加两个0,便于后面统一处理   
        }   
 
        int len = int_value.length();   
        if (len>16) return "值过大";   
        StringBuffer cn_currency = new StringBuffer();   
        String[] CN_Carry = new String[] { "", "万", "亿", "万" };   
        //数字分组处理,计数组数   
        int cnt = len/4+(len%4==0?0:1);   
        //左边第一组的长度   
        int partLen = len-(cnt-1)*4;   
        String partValue=null;   
        boolean bZero=false;//有过零   
        String curCN=null;   
        for(int i =0; i<cnt; i++){   
            partValue = int_value.substring(0,partLen);   
            int_value=int_value.substring(partLen);   
            curCN = Part2CN(partValue,i!=0&&!"零".equals(curCN));   
            //System.out.println(partValue+":"+curCN);   
            //若上次为零,这次不为零,则加入零             
            if(bZero && !"零".equals(curCN)){   
                cn_currency.append("零");   
                bZero=false;   
            }   
            if("零".equals(curCN))bZero=true;   
            //若数字不是零,加入中文数字及单位   
            if(!"零".equals(curCN)){   
                cn_currency.append(curCN);   
                cn_currency.append(CN_Carry[cnt-1-i]);   
            }   
            //除最左边一组长度不定外,其它长度都为4   
            partLen=4;   
            partValue=null;   
        }   
        cn_currency.append("元");   
        //处理小数部分   
        int fv1 = Integer.parseInt(fraction_value.substring(0,1));   
        int fv2 = Integer.parseInt(fraction_value.substring(1,2));   
        if(fv1+fv2==0){   
            cn_currency.append("整");   
        }   
        else{   
            cn_currency.append(CN_Digits[fv1]).append("角");   
            cn_currency.append(CN_Digits[fv2]).append("分");   
        }   
        return cn_currency.toString();   
    }   
 
    /**  
     * 将一组数字(不多于四个)转化成中文表示 <br/>  
     * 参数:<br/>  
     *   
     * @param partValue 字符串形式的数字  
     * @param bInsertZero 是否在前面添加零  
     * @return  
     */  
    private static String Part2CN(String partValue,boolean bInsertZero) {   
        //使用正则表达式,去除前面的0   
        partValue = partValue.replaceFirst("^0+", "");   
        int len = partValue.length();   
        if (len == 0)   
            return "零";   
        StringBuffer sbResult = new StringBuffer();   
        int digit;   
        String[] CN_Carry = new String[] { "", "拾", "佰", "仟" };   
        for (int i = 0; i < len; i++) {   
            digit = Integer.parseInt(partValue.substring(i, i + 1));   
            if (digit != 0) {   
                sbResult.append(CN_Digits[digit]);   
                sbResult.append(CN_Carry[len - 1 - i]);   
            } else {   
                // 若不是最后一位,且下不位不为零,追加零   
                if (i != len - 1  
                        && Integer.parseInt(partValue.substring(i + 1, i + 2)) != 0)   
                    sbResult.append("零");   
            }   
        }   
        if(bInsertZero && len!=4)sbResult.insert(0, "零");   
        return sbResult.toString();   
    }   
}

MoneyUtil的更多相关文章

  1. Flutter 常用工具类库common_utils

    地址:https://pub.flutter-io.cn/packages/common_utils#-readme-tab- Dart常用工具类库 common_utils 1.TimelineUt ...

  2. java 金额的大小写转换类

    /** *金额大小写转换工具类 */ public class MoneyUtil { /** 大写数字 */ private static final String[] NUMBERS = { &q ...

  3. java导出标题多行且合并单元格的EXCEL

    场景:项目中遇到有需要导出Excel的需求,并且是多行标题且有合并单元格的,参考网上的文章,加上自己的理解,封装成了可自由扩展的导出工具 先上效果,再贴代码: 调用工具类进行导出: public st ...

  4. c# 金钱大写转小写工具类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. Money

    /** * www.yiji.com Inc. * Copyright (c) 2012 All Rights Reserved. */package com.yjf.common.lang.util ...

随机推荐

  1. UNIX基础知识之输入和输出

    一.文件描述符 文件描述符(file descriptor)通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件.当内核打开一个已有文件或创建一个新文件时,它返回一个文件描述符.在读.写文件 ...

  2. ASP.NET MVC and jqGrid 学习笔记 2-如何从本地获得数据

    上回说到jqgrid的基本配置,同时演示了显示数据的一种方法——datatype: "local".这种方法是从本地获取的,确切地说是在前端页面的javascript里写的硬编码. ...

  3. sql 联合查询速度慢,需要对其进行分组

    分组:SELECT   * FROM(SELECT ROW_NUMBER() OVER(ORDER BY  ProjID) as row_number,* FROM ( select ProjAppl ...

  4. Java之MS SQL数据库连接

    一  1.首先,到微软官方下载jdbc驱动包 Microsoft JDBC Driver 4.0 for SQL Server 2.运行sqljdbc_4.0.2206.100_chs.exe,把文件 ...

  5. LeetCode 152

    Maximum Product Subarray Find the contiguous subarray within an array (containing at least one numbe ...

  6. LeetCode 283

    Move Zeros Given an array nums, write a function to move all 0's to the end of it while maintaining ...

  7. POJ 1159 - Palindrome (LCS, 滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 55018   Accepted: 19024 Desc ...

  8. poj 2373 单调队列优化背包

    思路:我们用单调队列保存2*b<=i-j<=2*a中的最大值.那么队列头就是最大值,如果队头的标号小于i-2*b的话,就出队,后面的肯定用不到它了. #include<iostrea ...

  9. 【转】移动互联网应用测试成长技能树V1.0

  10. Acrobat 2015 win32破解版

    Acrobat 2015 win32破解版,带破解补丁dll覆盖即可 百度云盘:http://pan.baidu.com/s/1i4tFnNJ