今天整理电脑中的文件夹,发现要处理一下人民币大写转数字的问题,于是上网搜了一下没找到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. GAN属于计算机视觉领域嘛_计算机视觉领域必知的开放数据集
  2. 删除linux系统中的ifcfg-eth0.bak
  3. 01.MyBatis快速入门
  4. 手把手教你实现SVM算法(二)
  5. 【Git】git的基本使用
  6. Codeforces Round #321 (Div. 2) B. Kefa and Company (尺取)
  7. java同时输出多个数字_java从命令行接收多个数字,求和之后输出结果
  8. 【问答集锦】从数据中挖掘宝藏,深度学习赋予机器更多“思想”
  9. 全球 42 亿 IPv4 地址宣告耗尽!
  10. 利用Docker学习Redis笔记(一)
  11. windwos::mutex
  12. 【百度地图API】建立全国银行位置查询系统(一)——如何创建地图
  13. 华为NP课程笔记4-中间系统到中间系统
  14. 这些单晶XRD测试问题你了解吗?(一)
  15. labelImg使用教程
  16. 技术宅改变世界 如何在12306买到下铺
  17. Htmlcssjs 图片轮播,加箭头
  18. [LA] Different convexity
  19. 【奥黛丽赫本】女神一样的优雅
  20. 五. Tomcat 常见问题解决及面试题

热门文章

  1. R语言数据可视化教程(ggplot2)_绘制散点图
  2. 基于titanic数据集介绍数据分析处理流程
  3. VB.NET语法基础学习
  4. SWUST OJ#971 #972 返回二叉树宽度和深度
  5. iOS 读书笔记-单元测试XCTest
  6. Vim、Shell及Linux命令的高效使用
  7. 微信小程序——自定义顶部菜单navigationBar方式(可详细了!)
  8. OpenCV——二值图像连通域分析
  9. linux下kegg注释软件,工具篇丨GO和KEGG富集不到通路?快试试这个超赞的功能分析工具吧...
  10. pandas中的concat操作