Java 实现金额转换 代码示例
金额转换,阿拉伯数字的金额转换成中国传统的形式如:
(¥1011)→(壹仟零壹拾壹元整)输出。
分析:
金额转换,在开发财务相关软件时会经常用到,也是软件本地化的一个需要。一般开发公司或者团队都有相应的金额转换类或者是模块,配合报表工具,可以实现良好的本地化。这里给出一个简单的金额转换代码,供读者参考。
1.
package programe;
2.
import java.text.NumberFormat;
3.
import java.util.HashMap;
4.
import java.util.Scanner;
5.
public class AmountOfConversion {
6. //定义HashMap的value值
7. public static final String EMPTY = "";
8. public static final String ZERO = "零";
9. public static final String ONE = "壹";
10. public static final String TWO = "贰";
11. public static final String THREE = "叁";
12. public static final String FOUR = "肆";
13. public static final String FIVE = "伍";
14. public static final String SIX = "陆";
15. public static final String SEVEN = "柒";
16. public static final String EIGHT = "捌";
17. public static final String NINE = "玖";
18. public static final String TEN = "拾";
19. public static final String HUNDRED = "佰";
20. public static final String THOUSAND = "仟";
21. public static final String TEN_THOUSAND = "万";
22. public static final String HUNDRED_MILLION = "亿";
23. public static final String YUAN = "元";
24. public static final String JIAO = "角";
25. public static final String FEN = "分";
26. public static final String DOT = ".";
27. private static AmountOfConversion formatter = null;
//创建AmountOfConversion的实例对象
28. //创建初始化一个HashMap对象
29. private HashMap NumberMap = new HashMap();
30. private HashMap HighnumberofMoney = new HashMap();
31. //创建初始化一个NumberFormat对象
32. private NumberFormat numberFormat =
NumberFormat.getInstance();
33. private AmountOfConversion() {
34. //在用new创建AmountOfConversion对象时,
为HashMap对象进行key-value的映射
35. numberFormat.setMaximumFractionDigits();
位
36. numberFormat.setMinimumFractionDigits();
位
37. numberFormat.setGroupingUsed(false);
/*设置此格式中是不可以使用组。如果设置可以使用组,
则数 1234567 可能被格式化为 "1,234,567"*/
38. NumberMap.put("0", ZERO);
39. NumberMap.put("1", ONE);
40. NumberMap.put("2", TWO);
41. NumberMap.put("3", THREE);
42. NumberMap.put("4", FOUR);
43. NumberMap.put("5", FIVE);
44. NumberMap.put("6", SIX);
45. NumberMap.put("7", SEVEN);
46. NumberMap.put("8", EIGHT);
47. NumberMap.put("9", NINE);
48. NumberMap.put(DOT, DOT);
49. HighnumberofMoney.put("1", TEN);
50. HighnumberofMoney.put("2", HUNDRED);
51. HighnumberofMoney.put("3", THOUSAND);
52. HighnumberofMoney.put("4", TEN_THOUSAND);
53. HighnumberofMoney.put("5", TEN);
54. HighnumberofMoney.put("6", HUNDRED);
55. HighnumberofMoney.put("7", THOUSAND);
56. HighnumberofMoney.put("8", HUNDRED_MILLION);
57. }
58. public static AmountOfConversion getInstance() {
//判断AmountOfConversion对象formatter是否初始化
59. if (formatter == null)
60. formatter = new AmountOfConversion();
61. return formatter;
62. }
63. //进行金额转换的多种数据类型
64. public String format(String moneyStr) {
65. String result = "不能进行金额转换!!";
66. if(isConversion(moneyStr)){
67. result = convertIntegerTochinese(moneyStr);
68. result = convertPointTochinese(result);
69. }
70. return result;
71. }
72. public String format(double moneyDouble) {
73. return format(numberFormat.format(moneyDouble));
74. }
75. public String format(int moneyInt) {
76. return format(numberFormat.format(moneyInt));
77. }
78. public String format(long moneyLong) {
79. return format(numberFormat.format(moneyLong));
80. }
81. public String format(Number moneyNum) {
82. return format(numberFormat.format(moneyNum));
83. }
84. private String convertIntegerTochinese(String moneyStr) {
//将参数中传入的阿拉伯数字转换成中文
85. String result;
86. StringBuffer C2CStrBufer = new StringBuffer();
87. ; i < moneyStr.length(); i++) {
88. C2CStrBufer.append(NumberMap.get(moneyStr.substring(
89. i, i + )));
90. }
91. // 拾佰仟万亿等都是汉字里面才有的单位,加上它们
92. int indexOfDot = C2CStrBufer.indexOf(DOT);
93. ;
94. ; i > ; i--) {
95. C2CStrBufer.insert(i, HighnumberofMoney.get(EMPTY
96. + moneyPatternCursor));
97. moneyPatternCursor = moneyPatternCursor == ?
98. : moneyPatternCursor + ;
99. }
100. String fractionPart = C2CStrBufer.substring(C2CStrBufer
101. .indexOf("."));
102. C2CStrBufer.delete(C2CStrBufer.indexOf("."),
103. C2CStrBufer.length());
104. ) {
105. C2CStrBufer.replace(C2CStrBufer.indexOf("零拾"),
106. C2CStrBufer.indexOf(, ZERO);
107. }
108. ) {
109. C2CStrBufer.replace(C2CStrBufer.indexOf("零佰"),
110. C2CStrBufer.indexOf(, ZERO);
111. }
112. ) {
113. C2CStrBufer.replace(C2CStrBufer.indexOf("零仟"),
114. C2CStrBufer.indexOf(, ZERO);
115. }
116. ) {
117. C2CStrBufer.replace(C2CStrBufer.indexOf("零万"),
118. C2CStrBufer.indexOf(, TEN_THOUSAND);
119. }
120. ) {
121. C2CStrBufer.replace(C2CStrBufer.indexOf("零亿"),
122. C2CStrBufer.indexOf(, HUNDRED_MILLION);
123. }
124. ) {
125. C2CStrBufer.replace(C2CStrBufer.indexOf("零零"),
126. C2CStrBufer.indexOf(, ZERO);
127. }
128. )
129. C2CStrBufer.delete(C2CStrBufer.length() - ,
130. C2CStrBufer.length());
131. C2CStrBufer.append(fractionPart);
132. result = C2CStrBufer.toString();
133. return result;
134. }
135. private String convertPointTochinese(String moneyStr) {
//对小数点后面的数字进行汉字处理
136. String result;
137. StringBuffer C2CStrBufer = new StringBuffer(moneyStr);
138. int indexOfDot = C2CStrBufer.indexOf(DOT);
139. C2CStrBufer.replace(indexOfDot, indexOfDot + , YUAN);
140. C2CStrBufer.insert(C2CStrBufer.length() - , JIAO);
141. C2CStrBufer.insert(C2CStrBufer.length(), FEN);
142. )// 没有零头,加整
143. C2CStrBufer.replace(C2CStrBufer.indexOf("零角零分"),
144. C2CStrBufer.length(), "整");
145. )// 没有零分,加整
146. C2CStrBufer.replace(C2CStrBufer.indexOf("零分"),
147. C2CStrBufer.length(), "整");
148. else {
149. )
150. C2CStrBufer.delete(C2CStrBufer.indexOf("零角"),
151. C2CStrBufer.indexOf();
152. }
153. result = C2CStrBufer.toString();
154. return result;
155. }
156. private boolean isConversion(String moneyStr) {
//判断参数传来的数据是否符合进行转换的条件
157. int fractionDigits = moneyStr.length() -
moneyStr.indexOf(DOT) - ;
158. boolean flag = true;
159. ){
160. System.out.println("金额" + moneyStr + "
的小数位多于两位。");
// 精度不能比分低
161. flag = false;
162. }
163. return flag;
164.
165. }
166. public static void main(String args[]) {
167. System.out.println("请输入金额数:");
168. Scanner scanner = new Scanner(System.in);
169. String str = scanner.next();
170. System.out.println("转换后的金额为:");
171. System.out.println(getInstance().format(new Double(str)));
172. }
}
Java 实现金额转换 代码示例的更多相关文章
- java基础之----java常见异常及代码示例
概述 java中有两种错误类型,一个是Exception,一个是Error,都在java.lang包下,一般来说程序中的try...catch捕获的是Exception类型的异常,而Error类型的错 ...
- 完整的java字符串编码转换代码
package book.String; import java.io.UnsupportedEncodingException; /** *//** * 转换字符串的编码 * @author joe ...
- java视频格式转换代码
http://blog.163.com/zzf_fly/blog/static/20958915820127217443816/ package com.gkzx.online.action; imp ...
- java请求登录接口代码示例
前言 近期研究如何利用java代码如何获取其他系统中所需的数据,自己总结的方法如下: 1.工具类代码 /** * <pre> * 方法体说明:向远程接口发起请求,返回字符串类型结果 * @ ...
- java进制转换代码
定义十进制的数直接写,定义8进制的数以0开头,定义二进制的数以0b开头,定义十六进制的数以0x开头需要将十进制的数以二进制的数表示出来可以参照下例: int a = 10; System.out.pr ...
- java 数字金额转换中文金额
public static String digitUppercase(double n){ String fraction[] = {"角", "分"}; S ...
- [置顶] think in java interview-高级开发人员面试宝典代码示例
下载资源地址为: http://download.csdn.net/detail/lifetragedy/6379755 这是think in java interview中的代码示例,包括JAVA基 ...
- 使用XStream注解实现Java对象与XML互相转换的代码示例
本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例. 我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件.如:jdom.dom4j等 ...
- 位置信息类API调用的代码示例合集:中国省市区查询、经纬度地址转换、POI检索等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 中国省市区查询:2017最新中国省市区地址 经纬度地址转换:经纬度 ...
随机推荐
- 重装系统之win10不能进入bios界面
原因 自Win10发布以来,新出厂的预装Win10的电脑都默认在UEFI模式下启动操作系统.UEFI启动是一种新的主板引导项,正被看做是有近20多年历史的BIOS 的继任者.顾名思义,快速启动是可以提 ...
- 广电的宽带网络真流氓,替换google的广告为百度的广告
以前联通也有干过这事,最近联通,有没有继续干,不清楚.没有用联通了. 最近,连到某wifi,发现网站的google广告,居然显示成百度的,特别去访问另一家网站,发现,本该是google广告的位置,同样 ...
- es5中for...in 和es6中 for..of遍历
//定义一个数组 var arr=['A','B','C']; //定义一个对象 var obj={name:'张三',age:20} // for..in 遍历数组 得到索引 for(var x i ...
- Random快速产生相同随机数的原因及解决方案
老生常谈,还是那三句话: 学历代表你的过去,能力代表你的现在,学习代表你的将来 十年河东,十年河西,莫欺少年穷 学无止境,精益求精 问题描述:很多时候我们可能需要在极短的时间内生成大量的随机数,但是你 ...
- ubuntu16.04在GTX1070环境下安装 cuda9.1
设备要求 系统:Ubuntu16.04 显卡:GTX 1070 驱动:nvidia系列,显卡驱动的版本必须大于等于cuda的sh文件名里面的版本号 驱动可从 此处 下载,我已经整理好了 检查安装驱动 ...
- tmux使用总结
ctrl+b +%:增加垂直分屏 ctlr+b +左右箭头: 在垂直分屏中移动 ctrl+b+c:新建窗口(不分屏) ctrl+b+数字键: 切换窗口 ctrl+b+d: 断开窗口 tmux a : ...
- 软件工程启程篇章:结对编程和进阶四则运算(197 & 199)
0x01 :序言:无关的事 I wrote a sign called "Dead End" in front of myself, but love crossed it wit ...
- Linux内核及分析 第八周 进程的切换和系统的一般执行过程
学习笔记: 一.进程调度与进程调度的时机分析 1.不同类型的进程有不同需求的调度需求: 第一种分类: —I/O-bound:频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 —CPU-boun ...
- 广商博客冲刺第六七天new
第四五天沖刺傳送門 第一版的網頁已經放到 云服務器(估計快到期了) 傳送門. (不怎么會玩服務器啊..求指教..目前問題如下: 1.我的電腦mysql密碼跟服務器的密碼不一樣..上傳的時候要把代碼里面 ...
- 利用ThreadLocal管理事务
package com.itheima.util; import java.sql.Connection; import java.sql.SQLException; //封装了所有与事务有关的方法 ...