今天整理电脑中的文件夹,发现要处理一下人民币大写转数字的问题,于是上网搜了一下没找到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();}  }

人民币大写与数字互转相关推荐

  1. ORACLE数字转换人民币大写

    ORACLE 数字转换人民币大写 示例. 数字                    :183066999230.68 人民币大写        :壹仟捌佰参拾亿陆仟陆佰玖拾玖万玖仟贰佰参拾圆陆角捌分 ...

  2. 关于数字转换成人民币大写的问题

    我们在参与大型项目时,难免会遇到数值转换人民币大写的情况.因为我今天接触了一个这样的转换,但原代码存在BUG,转换经常出现问题.于是我就去网上搜索了相关资源.由于没有找到相对权威的转换代码,网上给出的 ...

  3. .net 将数字转换为人民币大写

    程序中用到将数字转换为大写人民币,在网上找了一个方法,记录下来. using System.Text; using System.Text.RegularExpressions; ///<sum ...

  4. 将数字字符串转换为人民币大写,壹、贰、叁、肆、伍、陆、柒、捌、玖、拾

    将数字字符串转换为人民币大写,壹.贰.叁.肆.伍.陆.柒.捌.玖.拾 ''' 将数字字符串转成大写字符串 ''' a="零.壹.贰.叁.肆.伍.陆.柒.捌.玖.拾" b=" ...

  5. js 数字转人民币大写

    目前网上有许多的数字转人民币大写功能,但是在某些数字上就回出现错误, 比如501356,这个转换之后,有的会转换成 "伍拾万零壹仟叁佰伍拾陆" ,单位万和千紧密相连,中间是不需要 ...

  6. 人民币(RMB)小写/数字转换大写工具类,精确到分,修复‘圆零零’为‘圆整’,修复科学计数法处理异常。

    /*** 转换为中国人民币大写字符串,精确到分* @param money 传入小写数字字符串* @return String* @throws Exception*/public static St ...

  7. php人民币大写函数,将人民币数字转化为人民币大写格式的PHP函数

    这个函数用来把人民币数字转换为人民币大写格式,这个函数感觉还可以.要的拿去吧. function toCNFormat($data) { $data = strpos($data, ".&q ...

  8. 把数字转换为人民币大写(用于银行系统)

    大二是老师让做一个综合试验::用C++实现简易银行系统,其中用到在打印流水账时要求把金额转换为人民币大写...当时傻里吧唧的,,,随便拷贝了个同学的应付老师交了了事...前一段一个大二的弟兄向我提起银 ...

  9. 数字转换成人民币大写格式(带界面)

    今天看了算法的公开课,有一个把数字转换成人民币大写的算法. 后面就想着自己写一个界面的,好几天没有写一个完整的程序的. 当然有一些BUG,没有时间优化,后面在慢慢优化. 自己的名言:每天努力一点儿,总 ...

最新文章

  1. iPhone开发应用Sqlite使用手册
  2. [bzoj2229][Zjoi2011]最小割
  3. MacOS中使用QT开发iOS应用
  4. html5的优势ie9,WebQQ升级支持IE9 充分运用HTML5优势
  5. LeetCode(908)——最小差值 I(JavaScript)
  6. Flask初级(十)flash与前台交互post详解
  7. parallels恢复linux密码,在Parallels Desktop中忘记Windows密码怎么办 Parallels Desktop忘记Windows密码的解决方法...
  8. linux中fish脚本,FISH:Linux 下的一个智能易用的 Shell
  9. opengl交叉编译
  10. Quartz cron表达式(时间表达式)
  11. 批量生成MySQL不重复手机号大表
  12. HUNNU 11786 Sir Charles Antony Richard Hoare
  13. 《PC Assembly Language》读书笔记
  14. lv蒙田包二手价格_盘点 | LV家保值性最高,最值得入手的五款包包
  15. 隐私保护与隐私计算研讨会 | 余维仁:大数据时代下需要各界更新对个人隐私保护的固有认识
  16. Python实训笔记
  17. SAS可以用来做什么?
  18. Unity游戏优化[第二版]学习记录6
  19. 火影抽卡模拟器1.0.1
  20. 微信转发 jssdk的简单使用

热门文章

  1. 学了这么久python,不会连自己啥python版本都不知道吧?
  2. 使用备份软件快速备份VMware虚拟机
  3. 递归算法(JS实现代码)
  4. 刷脸支付连锁化经营的商业形态完美融合
  5. c语言计算二次函数顶点坐标,C语言编写一个求一元二次方程的实根的程序。 编辑一个小程序去做一元二次方程的求解(b^24ac)...
  6. Python制作塔防小游戏
  7. 计算机外设配件的主要相关参数有哪些,举例说明计算机外设主要有哪些设备?...
  8. 高性能计算机与网格的研究开发态势
  9. rsa1024 公钥c语言程序,两种方式生成RSA 公钥私钥
  10. Final Cut Pro X Guru: Motion Graphics in Motion and After Effects Final Cut Pro X Guru:运动和After Effe