代码示例一

package io.renren.modules.utils;import java.math.BigDecimal;
import java.text.NumberFormat;/*** 货币工具类* 该工具类提供了普通数值和货币形式转换的方法、人民币转成大写方法**/
public class CurrencyUtil {private CurrencyUtil() {// 这个类不能外部实例化}private static final String CN_NEGATIVE = "负";private static final String CN_ZEOR_FULL = "零圆整";/*** 数值转换成金额形式(string参数)** @param d* @return*/public static String convertToThreeForm(String d) {NumberFormat nf = NumberFormat.getInstance();return nf.format(new BigDecimal(d).doubleValue());}/*** 数值转换成金额形式(double参数)** @param d* @return*/public static String convertToThreeForm(double d) {return convertToThreeForm(String.valueOf(d));}/*** 金额形式转换成数值** @param d* @return* @throws Exception*/public static BigDecimal convertToNum(String d) throws Exception {NumberFormat nf = NumberFormat.getNumberInstance();return new BigDecimal(String.valueOf(nf.parse(d)));}/*** 人民币转成大写(BigDecimal_防止浮点型数据最后一位失精问题。) 如果是负数,那么会在结果前加上负** @param str* @return*/public static String rmbToBig_2(String str) {BigDecimal value;try {value = new BigDecimal(str.trim());} catch (Exception e) {return null;}// 返回值:-1-表示负数;0-表示0;1-表示正数int signum = value.signum();if (signum == 0) {return CN_ZEOR_FULL;} else {String signNumStr = "";if (signum < 0) {signNumStr = CN_NEGATIVE;value = value.abs();} else {signNumStr = "";}char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示char[] vunit = { '万', '亿' }; // 段名表示char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示// 四舍五入保存两位小数value = value.setScale(2, BigDecimal.ROUND_HALF_UP);String valStr = String.valueOf(value); // 转化成字符串String head = valStr.split("\\.")[0]; // 取整数部分String rail = valStr.split("\\.")[1]; // 取小数部分String prefix = ""; // 整数部分转化的结果String suffix = ""; // 小数部分转化的结果// 处理小数点后面的数if (rail.equals("00")) { // 如果小数部分为0suffix = "整";} else {if (rail.charAt(0) == '0') {suffix = digit[rail.charAt(1) - '0'] + "分"; // 把分转化出来} else if (rail.charAt(1) == '0') {suffix = digit[rail.charAt(0) - '0'] + "角"; // 把角转化出来} else {suffix = digit[rail.charAt(0) - '0'] + "角" + digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来}}boolean preZero = true;int hang = 0;int lie = 0;char[] chDig = head.toCharArray();int len = chDig.length;if (len % 4 != 0) {hang = len / 4;lie = len % 4 - 2;} else {hang = len / 4 - 1;lie = 2;}try {for (int i = 0; i < len - 1; i++) {// 整数部分除了最后一位的所有数if (chDig[i] == '0' && chDig[i + 1] == '0') {preZero = false;} else if (chDig[i] == '0' && chDig[i + 1] != '0') {preZero = true;}if (preZero) {prefix += String.valueOf(digit[chDig[i] - '0']);if (lie >= 0 && chDig[i] != '0') {prefix += String.valueOf(hunit[lie]);}}if (hang > 0 && lie == -1) {prefix += String.valueOf(vunit[hang - 1]);hang--;}lie--;if (lie == -2) {lie = 2;}}if (chDig[len - 1] != '0') {// 整数部分最后一位数prefix += String.valueOf(digit[chDig[len - 1] - '0']);}if (prefix.length() > 0) {prefix += '圆'; // 如果整数部分存在,则有圆的字样}if (prefix.contains("零万") || prefix.contains("零亿")) {prefix = prefix.replaceAll("零万", "万");prefix = prefix.replaceAll("零亿", "亿");}String result = signNumStr + prefix + suffix;return result; // 返回正确表示} catch (Exception e) {return null;}}}public static void main(String[] args) {try {System.out.println("人民币转换成大写:" + rmbToBig_2("-11000000009.59"));} catch (Exception e) {e.printStackTrace();}}
}

代码示例二

package io.renren.modules.utils;/*** 货币工具类* 数字转换为汉语中人民币的大写**/
public class MoneyUtil {/** 大写数字 */private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };/** 整数部分的单位 */private static final String[] IUNIT = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰","仟" };/** 小数部分的单位 */private static final String[] DUNIT = { "角", "分", "厘" };/*** 得到大写金额。*/public static String toChinese(String str) {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 = "";}// 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);// 小数部分数字return getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);}/*** 整数部分和小数部分转换为数组,从高位至低位*/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) {String number = "1.23";System.out.println(number + " " + MoneyUtil.toChinese(number));number = "1234567890123456.123";System.out.println(number + " " + MoneyUtil.toChinese(number));number = "0.0798";System.out.println(number + " " + MoneyUtil.toChinese(number));number = "10,001,000.09";System.out.println(number + " " + MoneyUtil.toChinese(number));number = "450.12";System.out.println(number + " " + MoneyUtil.toChinese(number));}
}

代码示例三

package io.renren.modules.utils;import java.math.BigDecimal;/*** 货币工具类* 数字转换为汉语中人民币的大写**/
public class NumberToCN {/*** 汉语中数字大写*/private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };/*** 汉语中货币单位大写,这样的设计类似于占位符*/private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾","佰", "仟", "兆", "拾", "佰", "仟" };/*** 特殊字符:整*/private static final String CN_FULL = "整";/*** 特殊字符:负*/private static final String CN_NEGATIVE = "负";/*** 金额的精度,默认值为2*/private static final int MONEY_PRECISION = 2;/*** 特殊字符:零元整*/private static final String CN_ZEOR_FULL = "零元" + CN_FULL;/*** 把输入的金额转换为汉语中人民币的大写** @param numberOfMoney* @return*/public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {StringBuffer sb = new StringBuffer();// -1, 0, or 1 as the value of this BigDecimal is negative, zero, or// positive.int signum = numberOfMoney.signum();// 零元整的情况if (signum == 0) {return CN_ZEOR_FULL;}// 这里会进行金额的四舍五入long number = numberOfMoney.movePointRight(MONEY_PRECISION).setScale(0, 4).abs().longValue();// 得到小数点后两位值long scale = number % 100;int numUnit = 0;int numIndex = 0;boolean getZero = false;// 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11if (!(scale > 0)) {numIndex = 2;number = number / 100;getZero = true;}if ((scale > 0) && (!(scale % 10 > 0))) {numIndex = 1;number = number / 10;getZero = true;}int zeroSize = 0;while (true) {if (number <= 0) {break;}// 每次获取到最后一个数numUnit = (int) (number % 10);if (numUnit > 0) {if ((numIndex == 9) && (zeroSize >= 3)) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);}if ((numIndex == 13) && (zeroSize >= 3)) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);}sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);sb.insert(0, CN_UPPER_NUMBER[numUnit]);getZero = false;zeroSize = 0;} else {++zeroSize;if (!(getZero)) {sb.insert(0, CN_UPPER_NUMBER[numUnit]);}if (numIndex == 2) {if (number > 0) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);}} else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);}getZero = true;}// 让number每次都去掉最后一个数number = number / 10;++numIndex;}// 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负if (signum == -1) {sb.insert(0, CN_NEGATIVE);}// 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整if (!(scale > 0)) {sb.append(CN_FULL);}return sb.toString();}public static void main(String[] args) {// double money = 2020004.01;String money = "450.12";BigDecimal numberOfMoney = new BigDecimal(money);String s = NumberToCN.number2CNMontrayUnit(numberOfMoney);System.out.println("你输入的金额为:【" + money + "】   => " + s.toString() + " ");}
}

【第004篇】Java工具类之货币大小写转换相关推荐

  1. 【Java工具类】之Bean转换

    由于需要在各个bean直接进行copy数据,除了傻瓜式的set/get or constructor来copy数据外,spring提供了直接copybean的工具类,原理其实就是通过java反射来根据 ...

  2. 干货:排名前 16 的 Java 工具类!

    2019独角兽企业重金招聘Python工程师标准>>> 干货:排名前 16 的 Java 工具类!   在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最 ...

  3. 排名前 16 的 Java 工具类

    转载来自微信公众号:Java 技术栈.如有侵权,请联系作者删除!! 在 Java 中,工具类定义了一组公共方法,这篇文章将介绍 Java 中使用最频繁及最通用的 Java 工具类.以下工具类.方法按使 ...

  4. beanutils工具类_16 个超级实用的 Java 工具类!

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  5. java轻量级并行工具类_16 个超级实用的 Java 工具类

    原标题:16 个超级实用的 Java 工具类 源 /juejin 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名, ...

  6. Java工具类——UUIDUtils

    借用一下百度百科的解释,来看一下UUID是什么. UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Ope ...

  7. java 文本工具类_干货:排名前16的Java工具类

    原标题:干货:排名前16的Java工具类 作者丨Java技术栈 https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Ja ...

  8. 干货:排名前16的Java工具类

    image 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源 ...

  9. 排名前16的Java工具类

    原文:https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法 ...

最新文章

  1. java i18n 转换,Java的国际化支持(I18N问题)
  2. RocketMQ工作原理 高级功能介绍
  3. BCH压力测试取得圆满成功,最大区块达21.3MB
  4. python flask 教程_Flask 教程 第一章:Hello, World!
  5. Windoes 远程桌面 对windows 传送大文件(镜像等)
  6. 6.OSI七层网络模型与TCP/IP四层网络模型
  7. 如何卸载mysql server 2005_如何卸载SQL Server 2005
  8. 输入输出流——字符流部分
  9. Java中逗号运算符的使用
  10. UserWarning: Matplotlib is currently using agg,which is a non-GUI backend, so cannot show the figure
  11. 切图时图片的选择:JPG、PNG、GIF的区别
  12. 8)Thymeleaf 基本对象表达式
  13. STM32 LL库延时函数 LL_mDelay解析
  14. mysql虚拟列表_动态网页制作-官方版合集下载-多特
  15. 量化开发必掌握的30个知识点【什么是分笔逐笔数据】?
  16. CTR --- NFM论文阅读笔记,及tf2复现
  17. 【180718】FC经典坦克大战源码
  18. centos 下 yum安装python3
  19. Markdown 表情包大全
  20. 北华街道大学计算机答案,我院心理协会参加心理中心与北华大学、山前街道共同开展心理活动-共青团吉林电子信息职业技术学院委员会...

热门文章

  1. Altium_Designer中英文技术词汇对照
  2. 全文检索(elasticsearch入门)
  3. matlab神经网络工具箱实现两个输入的BP神经网络
  4. 亿图图示使用方法记录
  5. win10无法装载iso文件_iso镜像安装失败无法安装Windows10怎么办?
  6. Could not publish server configuration for Tomcat v8.0 Server at localhost.
  7. java项目管理软件系统springboot+mysql+layui+mybatis-plus进销存源码
  8. 机械:二级注册建造师/二级建造师考试的报考条件、报考时间、考试科目的简介
  9. 半次元cos图片爬虫
  10. 安装宝塔面板后原ssh连接失败问题及解决