package com.healthy.prms.common.util;import java.math.BigDecimal;/*** @ClassName: RMBUtils* @Description: 金额元分之间转换工具类*/
public class RMBUtils {private RMBUtils() {}/** 金额为分的格式 */public static final String CURRENCY_FEN_REGEX = "\\-?[0-9]+";private static String HanDigiStr[] = new String[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };private static String HanDiviStr[] = new String[] { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万","拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" };/*** @Title: numToRMBStr * @Description: 将货币转换为大写形式* @param val     传入的数据* @return: String   返回的人民币大写形式字符串*/public static final String numToRMBStr(double val) {String SignStr = "";String TailStr = "";long fraction, integer;int jiao, fen;if (val < 0) {val = -val;SignStr = "负";}if (val > 99999999999999.999 || val < -99999999999999.999) {return "数值位数过大!";}// 四舍五入到分long temp = Math.round(val * 100);integer = temp / 100;fraction = temp % 100;jiao = (int) fraction / 10;fen = (int) fraction % 10;if (jiao == 0 && fen == 0) {TailStr = "整";} else {TailStr = HanDigiStr[jiao];if (jiao != 0) {TailStr += "角";}// 零元后不写零几分if (integer == 0 && jiao == 0) {TailStr = "";}if (fen != 0) {TailStr += HanDigiStr[fen] + "分";}}// 下一行可用于非正规金融场合,0.03只显示“叁分”而不是“零元叁分”return SignStr + PositiveIntegerToHanStr(String.valueOf(integer)) + "元" + TailStr;}/*** @Title: PositiveIntegerToHanStr * @Description: 将货币转换为大写形式(类内部调用)   输入字符串必须正整数,只允许前导空格(必须右对齐),不宜有前导零* @param NumStr* @return: String*/private static String PositiveIntegerToHanStr(String NumStr) {// 输入字符串必须正整数,只允许前导空格(必须右对齐),不宜有前导零String RMBStr = "";boolean lastzero = false;boolean hasvalue = false; // 亿、万进位前有数值标记int len, n;len = NumStr.length();if (len > 15) {return "数值过大!";}for (int i = len - 1; i >= 0; i--) {if (NumStr.charAt(len - i - 1) == ' ') {continue;}n = NumStr.charAt(len - i - 1) - '0';if (n < 0 || n > 9) {return "输入含非数字字符!";}if (n != 0) {if (lastzero) {RMBStr += HanDigiStr[0]; // 若干零后若跟非零值,只显示一个零}// 除了亿万前的零不带到后面// 如十进位前有零也不发壹音用此行if (!(n == 1 && (i % 4) == 1 && i == len - 1)) { // 十进位处于第一位不发壹音RMBStr += HanDigiStr[n];}RMBStr += HanDiviStr[i]; // 非零值后加进位,个位为空hasvalue = true; // 置万进位前有值标记} else {if ((i % 8) == 0 || ((i % 8) == 4 && hasvalue)) // 亿万之间必须有非零值方显示万RMBStr += HanDiviStr[i]; // “亿”或“万”}if (i % 8 == 0) {hasvalue = false; // 万进位前有值标记逢亿复位}lastzero = (n == 0) && (i % 4 != 0);}if (RMBStr.length() == 0) {return HanDigiStr[0]; // 输入空字符或"0",返回"零"}return RMBStr;}/*** @Title: changeF2Y* @Description: 将分为单位的转换为元并返回金额格式的字符串 (除100)* @param amount* @throws Exception* @return: String*/public static String changeF2Y(Long amount) throws Exception {if (!amount.toString().matches(CURRENCY_FEN_REGEX)) {throw new Exception("金额格式有误");}int flag = 0;String amString = amount.toString();if (amString.charAt(0) == '-') {flag = 1;amString = amString.substring(1);}StringBuffer result = new StringBuffer();if (amString.length() == 1) {result.append("0.0").append(amString);} else if (amString.length() == 2) {result.append("0.").append(amString);} else {String intString = amString.substring(0, amString.length() - 2);for (int i = 1; i <= intString.length(); i++) {if ((i - 1) % 3 == 0 && i != 1) {result.append(",");}result.append(intString.substring(intString.length() - i, intString.length() - i + 1));}result.reverse().append(".").append(amString.substring(amString.length() - 2));}if (flag == 1) {return "-" + result.toString();} else {return result.toString();}}/*** @Title: changeF2Y* @Description: 将分为单位的转换为元 (除100)* @param amount* @throws Exception* @return: String*/public static String changeF2Y(String amount) throws Exception {if (!amount.matches(CURRENCY_FEN_REGEX)) {throw new Exception("金额格式有误");}return BigDecimal.valueOf(Long.valueOf(amount)).divide(new BigDecimal(100)).toString();}/*** @Title: changeY2F* @Description: 将元为单位的转换为分 (乘100)* @param amount* @return: String*/public static String changeY2F(Long amount) {return BigDecimal.valueOf(amount).multiply(new BigDecimal(100)).toString();}/*** @Title: changeY2F* @Description: 将元为单位的转换为分 替换小数点,支持以逗号区分的金额* @param amount* @return: String*/public static String changeY2F(String amount) {String currency = amount.replaceAll("\\$|\\¥|\\,", ""); // 处理包含, ¥ 或者$的金额int index = currency.indexOf(".");int length = currency.length();Long amLong = 0l;if (index == -1) {amLong = Long.valueOf(currency + "00");} else if (length - index >= 3) {amLong = Long.valueOf((currency.substring(0, index + 3)).replace(".", ""));} else if (length - index == 2) {amLong = Long.valueOf((currency.substring(0, index + 2)).replace(".", "") + 0);} else {amLong = Long.valueOf((currency.substring(0, index + 1)).replace(".", "") + "00");}return amLong.toString();}
}

Java金额转换工具类相关推荐

  1. 自定义java对象转换工具类

    背景 项目中经常有VO.PO.DTO等之间转换,由于apache工具类中BeanUtils.copyProperties及Json序列化反序列化方式转换性能比较低(阿里巴巴规范检查有提示不建议采用). ...

  2. JAVA日期转换工具类

    java中经常会用到日期的转换,所有自己整理了一套日期转换的工具类,方便使用. 首先导入 <dependency><groupId>joda-time</groupId& ...

  3. 提高工作效率的万能Java行列转换工具类

    1.说明 有时候工作中需要动态生成列,也就是不确定的列,那么在数据库层就不是那么好操作了,可以使用java工具类来实现. 本工具类是对市面上的工具类进行加工改造,可以通用于各种情况,更加灵活,下面我来 ...

  4. java 对象 转换 工具类_Java中excel与对象的互相转换的通用工具类编写与使用(基于apache-poi-ooxml)...

    通用excel与对象相互转换的工具类 前言:最近开发需要一个Excel批量导入或者导出的功能,之前用过poi-ooxml开发过一个导入的工具类,正好蹭着这次机会,把工具类的功能进行完善. 使用说明: ...

  5. java中文转换工具类

    /*** 获取中文首字母工具类** @author jiangjunjie*/ public class ChineseCharToEnUtil {/*** 转换为有声调的拼音字符串** @param ...

  6. Java 文件转换工具类(word,html,excel,pdf,md,jpeg,png互转)

    一.前言 目前支持: word 转 html doc 转 docx html 转 word html 转 pdf excel 转 pdf word 转 jpeg word 转 png markdown ...

  7. java 时间转换工具类 yyyyMMdd HH:mm

    获取系统当前时间戳 : System.currentTimeMillis()) 获取系统当前时间任意格式,自己根据生成的格式选择性填写 /*** 获取当前时间* 把需要生成的时间格式替换一下就可以* ...

  8. Java时间转换工具类

    /*** 获取对应毫秒转换成的天 时 分 秒 ms** @author 刘子固* @dete 2022.9.27*/ public class TimeDateUtils {/*** 一秒钟1000毫 ...

  9. 金额大小写转换工具类

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

最新文章

  1. centos 管道符取第一行_Linux用户组管理及用户权限及管道符应用
  2. npz文件转为npy_numpy的文件存储 .npy .npz 文件
  3. 具有JDK 12精简数字格式的自定义精简数字模式
  4. 船长英语题库测试软件,船长英语新题库题(资料).pdf
  5. 剑指offer之青蛙跳台阶
  6. 如何自制会跳舞的AI小姐姐?这有一份易上手的开源攻略
  7. C++实现的大整数分解Pollard's rho算法程序
  8. easymock+junit+spring学习·
  9. mysql 介于两个日期函数_帮忙看一上这个mysql函数,用来返回两个日期之间的年数...
  10. flex 3 学习小结2
  11. 高德地图如何取消订单_一文教你如何爬取高德地图
  12. Linux:CentOS中SFTP工具的使用
  13. 什么叫0day和Warez?
  14. 微信网页扫码登录的实现
  15. python将学生信息保存到文件中_Python学生管理系统-文件保存版
  16. 南京大学计算机系教材,模式识别-南京大学计算机系.pdf
  17. Black Arch虚拟机安装及配置
  18. C语言练习-统计数字个数
  19. 电脑重启后,原本正常启动的ensp firewall usg6000无法正常启动--无限#号
  20. 为什么要配置hugepages?

热门文章

  1. 运行Springboot项目时报错WhiteLabel Error Page
  2. 视频在H5页面在微信浏览器不能自动播放问题
  3. 惊了,Python 民俗社会科学项目,看看能否预测【面向哪里写BUG少】
  4. VS2017、2019驱动WDF开发环境找不到头文件#include <ntddk.h>
  5. pdcp层的作用_LTE系统中PDCP子层功能研究
  6. pcntl_fork导致Mysql have gone away问题解决
  7. 基于Qt上USBCAN模块的二次开发
  8. Longhorn时代,浏览器的终结?——关于Avalon和XAML
  9. shell学习四十三天----临时性文件的建立与使用
  10. openCV 自学笔记