人民币大写与数字互转
今天整理电脑中的文件夹,发现要处理一下人民币大写转数字的问题,于是上网搜了一下没找到Excel对应的方法,干脆自己用Java写一个。我写完了之后发现excel表里面有一项是这样的。
我正在想这一项不会出错吧,这个程序应该只会读其中某一个数据,然后我看一眼输出结果,218000。然后手动计算了一下,发现答案正好是218000。有一种突如其来的激动,想不到这货还能计算这个。以前写代码时没有考虑的地方都会出错,现在没有考虑到的地方它居然也算出来了。然后我看了一眼自己写的代码才反应过来。
不管有几个数据,它都会相加的,因为我转化的时候是对权值和数字的积来求和的,有多少项并不影响。虽然不是什么大程序,但是这货带来的惊喜(以前只有惊,没有喜)还是蛮有意思的。这里附上源码,分享一下这突如其来的爽。
——————————-华丽的分割线——————————–
代码改了一下,顺便把数字转大写加进去。
import java.util.Scanner;import java.io.File;import java.io.FileNotFoundException;/***注意:暂时只能处理千亿级别的数据。*/public class MoneyUtil{ private static final char [] RMB_NUMBER = { '零','壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', }; private static final Character RMB_START='元';private static final char [] RMB_DEC={'角','分'};private static final char RMB_ZHENG='整'; private static final char RMB_YUAN='元';private static final char RMB_WAN='万';private static final char RMB_YI='亿';private static final char RMB_SHI='拾';private static final char RMB_BAI='佰';private static final char RMB_QIAN='仟';private static final char [] RMB_RIGHT={RMB_YUAN,RMB_WAN,RMB_YI};private static final char [] RMB_WEIGHT={RMB_SHI,RMB_BAI,RMB_QIAN};private static long getNumber(char ch){for(int i=0;i<RMB_NUMBER.length;i++){if(ch==RMB_NUMBER[i]){return i; } }return -1;}private static long getWeight(char ch){switch(ch){case RMB_SHI: return 10;case RMB_BAI:return 100;case RMB_QIAN:return 1000;}return -1;}private static long getRight(char ch){switch(ch){case RMB_YUAN:return 1;case RMB_WAN:return 10000;case RMB_YI:return 100000000;}return -1;}public static String moneyToNumber(String money){long right=1;long weight=1;long sum=0;int index=money.lastIndexOf(RMB_START);if(index==-1){return "Error";}//处理整数部分for(int i=index;i>=0;i--){char ch=money.charAt(i);long temp=-1;if((temp=getWeight(ch))!=-1){weight=temp;}else if((temp=getRight(ch))!=-1){right=temp;weight=1;}else if((temp=getNumber(ch))!=-1){sum+=temp*weight*right;}}//处理部分省略掉开头“壹”情况if((weight=getWeight(money.charAt(0)))!=-1){sum+=weight*right;}//处理小数部分String str="";for(int i=index;i<money.length();i++){long line;if((line=getNumber(money.charAt(i)))!=-1){str+=line;}} if(!str.isEmpty()){str="."+str;}return String.valueOf(sum)+str; }//将不规范的输入数据规范化private static String numberFormat(String target){target=target.trim();target=target.replaceAll(",","");//去掉数据里面的逗号//对于数据中含有非法字符的返回errortry{Double.parseDouble(target); }catch(NumberFormatException ne){return "Error"; }StringBuilder sb=new StringBuilder(target); while(sb.length()>0 && sb.charAt(0)=='0'){//去掉数据前面的零sb.delete(0,1);}return sb.toString();}public static String numberToMoney(String target){target=numberFormat(target);if(target.equals("Error")){return target;}//处理target为“0”的情况 if(target.equals("")){return ""+RMB_NUMBER[0]+RMB_YUAN+RMB_ZHENG;}StringBuilder sb=new StringBuilder(target);int index=target.lastIndexOf("."); int start=target.length()-1;String str="";if(index!=-1){start=index-1;index++;//处理小数部分for(int i=0;i<2 && index<target.length();i++,index++){int temp=target.charAt(index)-48;if(temp>0 && temp<RMB_NUMBER.length){str=str+RMB_NUMBER[temp]+RMB_DEC[i];}}}else{str="整";}boolean addZero=false;//是否添加零for(int i=start;i>=0;i--){int temp=target.charAt(i)-48;if( (start-i)%4==0 ||start==i){//每四位加入一个界值,如万、亿。str=RMB_RIGHT[(start-i)/4]+str;addZero=false;if(temp>0 && temp<RMB_NUMBER.length){str=RMB_NUMBER[temp]+str; addZero=true;}}else{if(temp>0 && temp<RMB_NUMBER.length){//不是整四位时且不是零值的时候,加入权值如拾、佰、仟。str=RMB_NUMBER[temp]+""+RMB_WEIGHT[(start-i)%4-1]+str;addZero=true;}else if(temp==0 && addZero){str=RMB_NUMBER[temp]+str; addZero=false;}}System.out.println(i+"\t"+str);}return str;} public static void main(String[] args) throws FileNotFoundException { if(args.length>0){//System.out.println(moneyToNumber(args[0])); System.out.println(numberToMoney(args[0])); return;}Scanner sc=new Scanner(new File("f:/a.txt"));while(sc.hasNext()){System.out.println(numberToMoney(sc.nextLine())); }sc.close();} }
人民币大写与数字互转相关推荐
- ORACLE数字转换人民币大写
ORACLE 数字转换人民币大写 示例. 数字 :183066999230.68 人民币大写 :壹仟捌佰参拾亿陆仟陆佰玖拾玖万玖仟贰佰参拾圆陆角捌分 ...
- 关于数字转换成人民币大写的问题
我们在参与大型项目时,难免会遇到数值转换人民币大写的情况.因为我今天接触了一个这样的转换,但原代码存在BUG,转换经常出现问题.于是我就去网上搜索了相关资源.由于没有找到相对权威的转换代码,网上给出的 ...
- .net 将数字转换为人民币大写
程序中用到将数字转换为大写人民币,在网上找了一个方法,记录下来. using System.Text; using System.Text.RegularExpressions; ///<sum ...
- 将数字字符串转换为人民币大写,壹、贰、叁、肆、伍、陆、柒、捌、玖、拾
将数字字符串转换为人民币大写,壹.贰.叁.肆.伍.陆.柒.捌.玖.拾 ''' 将数字字符串转成大写字符串 ''' a="零.壹.贰.叁.肆.伍.陆.柒.捌.玖.拾" b=" ...
- js 数字转人民币大写
目前网上有许多的数字转人民币大写功能,但是在某些数字上就回出现错误, 比如501356,这个转换之后,有的会转换成 "伍拾万零壹仟叁佰伍拾陆" ,单位万和千紧密相连,中间是不需要 ...
- 人民币(RMB)小写/数字转换大写工具类,精确到分,修复‘圆零零’为‘圆整’,修复科学计数法处理异常。
/*** 转换为中国人民币大写字符串,精确到分* @param money 传入小写数字字符串* @return String* @throws Exception*/public static St ...
- php人民币大写函数,将人民币数字转化为人民币大写格式的PHP函数
这个函数用来把人民币数字转换为人民币大写格式,这个函数感觉还可以.要的拿去吧. function toCNFormat($data) { $data = strpos($data, ".&q ...
- 把数字转换为人民币大写(用于银行系统)
大二是老师让做一个综合试验::用C++实现简易银行系统,其中用到在打印流水账时要求把金额转换为人民币大写...当时傻里吧唧的,,,随便拷贝了个同学的应付老师交了了事...前一段一个大二的弟兄向我提起银 ...
- 数字转换成人民币大写格式(带界面)
今天看了算法的公开课,有一个把数字转换成人民币大写的算法. 后面就想着自己写一个界面的,好几天没有写一个完整的程序的. 当然有一些BUG,没有时间优化,后面在慢慢优化. 自己的名言:每天努力一点儿,总 ...
最新文章
- iPhone开发应用Sqlite使用手册
- [bzoj2229][Zjoi2011]最小割
- MacOS中使用QT开发iOS应用
- html5的优势ie9,WebQQ升级支持IE9 充分运用HTML5优势
- LeetCode(908)——最小差值 I(JavaScript)
- Flask初级(十)flash与前台交互post详解
- parallels恢复linux密码,在Parallels Desktop中忘记Windows密码怎么办 Parallels Desktop忘记Windows密码的解决方法...
- linux中fish脚本,FISH:Linux 下的一个智能易用的 Shell
- opengl交叉编译
- Quartz cron表达式(时间表达式)
- 批量生成MySQL不重复手机号大表
- HUNNU 11786 Sir Charles Antony Richard Hoare
- 《PC Assembly Language》读书笔记
- lv蒙田包二手价格_盘点 | LV家保值性最高,最值得入手的五款包包
- 隐私保护与隐私计算研讨会 | 余维仁:大数据时代下需要各界更新对个人隐私保护的固有认识
- Python实训笔记
- SAS可以用来做什么?
- Unity游戏优化[第二版]学习记录6
- 火影抽卡模拟器1.0.1
- 微信转发 jssdk的简单使用
热门文章
- 学了这么久python,不会连自己啥python版本都不知道吧?
- 使用备份软件快速备份VMware虚拟机
- 递归算法(JS实现代码)
- 刷脸支付连锁化经营的商业形态完美融合
- c语言计算二次函数顶点坐标,C语言编写一个求一元二次方程的实根的程序。 编辑一个小程序去做一元二次方程的求解(b^24ac)...
- Python制作塔防小游戏
- 计算机外设配件的主要相关参数有哪些,举例说明计算机外设主要有哪些设备?...
- 高性能计算机与网格的研究开发态势
- rsa1024 公钥c语言程序,两种方式生成RSA 公钥私钥
- Final Cut Pro X Guru: Motion Graphics in Motion and After Effects Final Cut Pro X Guru:运动和After Effe