public class RMB {//返回转换好的大写形式public static String numberToRMB(String money) {return cleanZero(splitNum(roundString(money)));}// 将小写金额转换成大写金额private static String splitNum(String s) {// 如果传入的是空串则继续返回空串if ("".equals(s) || s == null) {return "";}// 以小数点为界分割这个字符串int index = s.indexOf(".");// 截取并转换这个数的整数部分String intOnly = s.substring(0, index);String part1 = numFormat(1, intOnly);// 截取并转换这个数的小数部分String smallOnly = s.substring(index + 1);String part2 = numFormat(2, smallOnly);// 把转换好了的整数部分和小数部分重新拼凑一个新的字符串return part1 + part2;}/*** 把传入的数转换为中文金额大写形式* @param flag* int 标志位,1 表示转换整数部分,0 表示转换小数部分* @param s* String 要转换的字符串* @return 转换好的带单位的中文金额大写形式*/private static String numFormat(int flag, String s) {int sLength = s.length();// 货币大写形式String bigLetter[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };// 货币单位String unit[] = { "元", "拾", "佰", "仟", "万",// 拾万位到仟万位"拾", "佰", "仟",// 亿位到万亿位"亿", "拾", "佰", "仟", "万" };String small[] = { "分", "角" };// 用来存放转换后的新字符串String newS = "";// 逐位替换为中文大写形式for (int i = 0; i < sLength; i++) {if (flag == 1) {// 转换整数部分为中文大写形式(带单位)newS = newS + bigLetter[s.charAt(i) - 48]+ unit[sLength - i - 1];} else if (flag == 2) {// 转换小数部分(带单位)newS = newS + bigLetter[s.charAt(i) - 48]+ small[sLength - i - 1];}}return newS;}/*** 对传入的数进行四舍五入操作* * @param sString* 从命令行输入的那个数* @return 四舍五入后的新值*/private static String roundString(String s) {// 如果传入的是空串则继续返回空串if ("".equals(s)) {return "";}// 将这个数转换成 double 类型,并对其进行四舍五入操作double d = Double.parseDouble(s);// 此操作作用在小数点后两位上d = (d * 100 + 0.5) / 100;// 将 d 进行格式化s = new java.text.DecimalFormat("##0.000").format(d);// 以小数点为界分割这个字符串int index = s.indexOf(".");// 这个数的整数部分String intOnly = s.substring(0, index);// 规定数值的最大长度只能到万亿单位,否则返回 "0"if (intOnly.length() > 13) {return "";}// 这个数的小数部分String smallOnly = s.substring(index + 1);// 如果小数部分大于两位,只截取小数点后两位if (smallOnly.length() > 2) {String roundSmall = smallOnly.substring(0, 2);// 把整数部分和新截取的小数部分重新拼凑这个字符串s = intOnly + "." + roundSmall;}return s;}/*** 把已经转换好的中文金额大写形式加以改进,清理这个字 符串里面多余的零,让这个字符串变得更加可观 注:传入的这个数应该是经过 splitNum()* 方法进行处理,这个字 符串应该已经是用中文金额大写形式表示的* * @param s* String 已经转换好的字符串* @return 改进后的字符串*/private static String cleanZero(String s) {// 如果传入的是空串则继续返回空串if ("".equals(s)) {return "";}// 如果用户开始输入了很多 0 去掉字符串前面多余的'零',使其看上去更符合习惯while (s.charAt(0) == '零') {// 将字符串中的 "零" 和它对应的单位去掉s = s.substring(2);// 如果用户当初输入的时候只输入了 0,则只返回一个 "零"if (s.length() == 0) {return "零";}}// 字符串中存在多个'零'在一起的时候只读出一个'零',并省略多余的单位/* 由于本人对算法的研究太菜了,只能用4个正则表达式去转换了,各位大虾别介意哈... */String regex1[] = { "零仟", "零佰", "零拾" };String regex2[] = { "零亿", "零万", "零元" };String regex3[] = { "亿", "万", "元" };String regex4[] = { "零角", "零分" };// 第一轮转换把 "零仟", 零佰","零拾"等字符串替换成一个"零"for (int i = 0; i < 3; i++) {s = s.replaceAll(regex1[i], "零");}// 第二轮转换考虑 "零亿","零万","零元"等情况// "亿","万","元"这些单位有些情况是不能省的,需要保留下来for (int i = 0; i < 3; i++) {// 当第一轮转换过后有可能有很多个零叠在一起// 要把很多个重复的零变成一个零s = s.replaceAll("零零零", "零");s = s.replaceAll("零零", "零");s = s.replaceAll(regex2[i], regex3[i]);}// 第三轮转换把"零角","零分"字符串省略for (int i = 0; i < 2; i++) {s = s.replaceAll(regex4[i], "");}// 当"万"到"亿"之间全部是"零"的时候,忽略"亿万"单位,只保留一个"亿"s = s.replaceAll("亿万", "亿");return s;} }
(转)金额转中文大写
转载于:https://www.cnblogs.com/yshyee/p/4109730.html
相关文章:

[IOS]UIWebView实现保存页面和读取服务器端json数据
如何通过viewView保存访问过的页面?和如何获取并解析服务器端发送过来的json数据?通过一个简单的Demo来学习一下吧! 操作步骤: 1.创建SingleViewApplication应用,新建VIewController,并在xib试图中添加WebV…

struts2之配置文件struts.xml详解
struts配置文件 struts.xml配置参数详解 struts.xml中很大一部分配置默认配置就好了 但是有些还是需要做了解 以便于理解 和修改 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Str…

ceph bluestore 源码分析:刷缓存(trim)逻辑
环境 ceph版本:12.2.1 部署模式:ec 21 osd: 3个 且资源池已经有数据 执行命令:ceph daemon osd.0 flush_store_cache 进行刷缓存。即将dump_mempools内存池管理的bluestore cache中的无用数据进行释放 主要参数: bluestore_cac…

php中怎么过滤器_PHP 过滤器(Filter)
过滤多个输入表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 重复调用,我们可以使用 filter_var_array 或 the filter_input_array 函数。在本例中,我们使用 filter_input_array() 函数来过滤三个 GET 变量。接收到的 GET 变量是一…

c++ Qt向PHP接口POST文件流
Qt调用PHP写的接口,向其传递图片文件,并保存在服务器。 二进制文件无法直接传递,Qt采用Base64进行编码发送,PHP解码保存为文件。 注意:PHP收到数据之后会将POST过来的数据中的加号()替换为空格,造成接收到的…

在网络通讯中应用Protobuf
Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强;还有一个比较大的优点就是有着很多的语言平台支持。下面讲解一下如何在TCP通讯应用中集成Protobuf. Protobuf…

JS中Math函数的常用方法
Math 是数学函数,但又属于对象数据类型 typeof Math > ‘object’ console.dir(Math) 查看Math的所有函数方法。 1,Math.abs() 获取绝对值 Math.abs(-12) 12 2,Math.ceil() and Math.floor() 向上取整和向下取整 console.log(Math.ceil(1…

C++ 泛型编程 -- 函数模版
文章目录定义声明调用方式函数模版的重载函数模版的特点工作中一个同事写了测试demo,想要自己尝试使用发现调用老出错,请教的时候发现是函数模版,有自己的调用方式,并且发现核心代码中大量的函数模版和类模版。特此做一个函数模版…

bellman_ford寻找平均权值最小的回路
给定一个有向图,如果存在平均值最小的回路,输出平均值。 使用二分法求解,对于一个猜测值mid,判断是否存在平均值小于mid的回路 如果存在平均值小于mid的包含k条边的回路,那么有w1w2w3...wk < k * mid,即(w1-mid)(w2…

守护进程中创建的对象php,在PHP中生成守护进程(Daemon Process)
前两天看到一篇文章《如何使用PHP编写daemon process》,其中对核心代码却没有细说,我又查了一些资料,还看了一本《理解Unix进程》,才搞明白生成守护进程的时候发生了什么。这段代码是这个样子的:function run(){//第一…

log4j个人使用整理
Log4j介绍: 略过。 配置: Eclipse项目中添加log4j.jar到lib下。 在bin目录下新建log4j.properties,编辑好log4j配置文件。 样例分析: 1 log4j.rootLoggerWARN, stdout, file2 log4j.appender.stdoutorg.apache.log4j.ConsoleAppen…

完全理解 Python 迭代对象、迭代器、生成器(转)
完全理解 Python 迭代对象、迭代器、生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators nvie.com,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢…

Rocksdb 与 TitanDb 原理分析 及 性能对比测试
文章目录前言Rocksdb的compaction机制compaction作用compaction分类level style compaction(rocksdb 默认进行的compaction策略)level 的文件存储结构compaction过程compaction中的level target sizeuniversal style compactionfifo style compactionTit…

经典SQL练习题
题目地址:http://blog.csdn.net/qaz13177_58_/article/details/5575711 1、 查询Student表中的所有记录的Sname、Ssex和Class列。select sname,ssex,class from STUDENT2、 查询教师所有的单位即不重复的Depart列。select depart from TEACHER group by departselec…

php url模式在哪修改,php如何修改url
php如何修改url2020-07-03 12:15:40php修改url的方法:1、通过配置文件修改URL规则;2、设置URL伪静态,即限制伪静态的后缀;3、在配置文件中开启路由支持,并配置路由;4、将URL进行重写即可。PHP对URL设置一、…

国外十大最流行PHP框架排名
以下为十个目前最流行的基于MVC设计模式的PHP框架。1. YiiYii是一个基于组件的高性能的PHP的框架,用于开发大规模Web应用。Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程。从MVC,DAO/ActiveRecord,widgets,c…

python_web框架
一、web框架 web框架: 自己完成socket的web框架:如,Tornado等由WSGI完成socket的web框架:如,Django、flash等两种实现过程: 第二种WSGI方式的,由于自带socket所以可直接写后端代码。 python标准…

g-gdb 调试多线程
代码调试工具gdb是一个能够让我们在工作中高效排查代码异常根源的利器。 在此将gdb针对多线程的调试方式做一个笔记,也方便后续回顾以及分享大家。 本文采用的是一个简单的多线程代码示例,同时调试是在mac上进行的 mac安装gdb brew install gdb即可 基…

php数据库html文本,关于php,mysql,html的数字分页和文本_php
请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1首先进行样式展示希望对大家有所帮助,也希望大家给出意见和建议:第一种:数字分页第二种:…

WinDbg加载不同版本CLR
WinDbg调试.net2.0和.net4.0程序有所不同,因为.net4.0使用新版本的CLR。例如: mscoree.dll 变为 mscoree.dll 和 mscoreei.dll, mscorwks.dll 变为 clr.dll, mscorjit.dll 变为 clrjit.dll。 因此,在.net2.0加载mscorj…

交换机***工具——Yersinia
Yersinia是国外一款专门针对交换机执行第二层***的***工具。目前的版本是0.7.1。目前支持的操作系统及版本号如表1所示。表1 Yerdinia支持的操作系统操作系统名称版本号OpenBSD3.4 (pcap库版本至少0.7.2以上)Linux2.4.x和2.6.xSolaris5.8 64bits SPARCMac OSX10.4 Tiger (Intel…

Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解
文章目录前言Rocksdb写流程图WAL 原理分析概述文件格式查看WAL的工具创建WAL清理WALMANIFEST原理分析概述查看MANIFEST的工具创建 及 清除 MANIFEST文件内容CcolumnFamily 详解概述API介绍核心数据结构创建以及删除MEMTABLE 实现概述实现Rocksdb写入逻辑概述实现总结关于写的一…

react 入门
首先安装node.js环境 下载地址 https://nodejs.org/en/download/检查安装版本 进入命令行npm -v~~3. 安装react命令环境 npm install - g react-native-cli ~~~ 初始化项目 FirstAppreact-native init FirstApp 转载于:https://www.cnblogs.com/liu-ya/p/10511537.html

将字符串打乱输出
将字符串打乱输出 Dim i,mm,Str,StrPosition,NewStrStr "1234567890"For i1 To Len(Str) StrPosition GetRandomMath(1,Len(Replace(Str,mm,""))) Str Replace(Str,mm,"") mm Mid(str,StrPosition,1) …
php帝国系统调出图片内空,帝国CMS图集字段的大图,小图,说明的调用方法
本文实例讲述了帝国CMS图集字段的大图,小图,说明的调用方法。分享给大家供大家参考。具体方法如下:复制代码代码如下:$arr array();$arr $navinfor[morepic];$newarr explode(egetzy(rn),$arr);$count count(explode(egetzy(rn),$navinfor[morepic]));//图集的图…

static和global的区别
1.global在整个页面起作用。2.static只在function和class内起作用。global和$GLOBALS使用基本相同,但在实际开发中大不相同。global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址&#x…

vue 之 nextTick 与$nextTick
VUE中Vue.nextTick()和this.$nextTick()怎么使用? 官方文档是这样解释的: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 虽然 Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考ÿ…

Linux创建线程时 内存分配的那些事
文章目录问题描述问题分析针对问题1 的猜测:针对问题2 的猜测:原理追踪总结问题描述 事情开始于一段内存问题,通过gperf工具抓取进程运行过程中的内存占用情况。 分析结果时发现一个有趣的事情,top看到的实际物理内存只有几兆,但是pprof统计…

mysql plsql循环语句吗,Oracle PLSQL 在游标中用while循环实例程序
Oracle PLSQL 在游标中用while循环实例程序Oracle PLSQL 在游标中用while循环实例程序Oracle PLSQL 在游标中用while循环实例程序declarecursor emp_cur is select * from emp;v_emp emp%rowType;beginopen emp_cur;while emp_cur%notfound --while肯定要跟loop一起用的 且是控…

【原创】Linux环境下的图形系统和AMD R600显卡编程(11)——R600指令集
1 低级着色语言tgsi OpenGL程序使用GLSL语言对可编程图形处理器进行编程,GLSL语言(以下高级着色语言就是指GLSL)是语法类似C的高级语言,在GLSL规范中,GLSL语言被先翻译成教低级的类汇编语言,然后被翻译成硬…