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. JDK1.6官方下载_JDK6官方下载_JDK1.6API(chm)下载_JDK6APICHM中文参

    JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin- ...

  2. cocos2d-x调度器原理

    程序运行后每达到一帧的时间间隔就会执行一次mainLoop void CCDisplayLinkDirector::mainLoop(void) { //判断是否需要释放CCDirector,通常游戏 ...

  3. javaScript入门1--组成,基本使用

    javaScript:脚本语言,最初是为了实现在客户端进行的表单验证以减少服务器的数据交互次数,如今可用在页面交互,计算,拥有了闭包,匿名(拉姆达)函数,甚至元编程等特性. javaScript实现的 ...

  4. 3d ListView翻译

    作为一个刚毕业的大学生,我要提醒自己时时刻刻要学习. 最近做listview看到很久以前的一个demo,高手如云啊,我们就只有好好加油了. 这是索尼公司的一个员工写的学习博客,由于本人英文能力有限是按 ...

  5. [转]oracle EBS 基础100问

    from:http://www.cnblogs.com/xiaoL/p/3593691.html  http://f.dataguru.cn/thread-51057-1-1.html 1001 OR ...

  6. hdu 4635 强连通度缩点

    思路:想用Tarjan算法进行缩点,并记录每个连通分支的点数.缩点完毕过后,找出所有出度或入度为0的连通分量,假设该连通分量的点数为num[i],那么 ans=Max(ans,(n-num-1)*(n ...

  7. poj 2182 树状数组

    这题对于O(n^2)的算法有很多,我这随便贴一个烂的,跑了375ms. #include<iostream> #include<algorithm> using namespa ...

  8. poj 3565 二分图最优匹配

    思路: 将ant与tree之间用距离来做权值,求最小权匹配就可以了.可以想到,如果有两条线段相交,那么将这两个线段交换一个顶点,使其不相交,其权值和一定会更小. 就像斜边永远比直角边长一样的道理. # ...

  9. Web.config加密和解密

    在系统部署的时候,大家都会遇到关于用户凭证的安全性问题,而对于数据库连接的相关的信息,有些时候客户也需要我们对其加密,防止信息泄露,在此将加密和解的方法记录于此: 首先用管理员的权限启动cmd命令窗口 ...

  10. Jersey(1.19.1) - Client API, Testing services

    The Jersey client API was originally developed to aid the testing of the Jersey server-side, primari ...