实现数字和现金的转换
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Scanner;
public class AmountOfConversion {
// 定义HashMap的value值
public static final String EMPTY = "";
public static final String ZERO = "零";
public static final String ONE = "壹";
public static final String TWO = "贰";
public static final String THREE = "叁";
public static final String FOUR = "肆";
public static final String FIVE = "伍";
public static final String SIX = "陆";
public static final String SEVEN = "柒";
public static final String EIGHT = "捌";
public static final String NINE = "玖";
public static final String TEN = "拾";
public static final String HUNDRED = "佰";
public static final String THOUSAND = "仟";
public static final String TEN_THOUSAND = "万";
public static final String HUNDRED_MILLION = "亿";
public static final String YUAN = "元";
public static final String JIAO = "角";
public static final String FEN = "分";
public static final String DOT = ".";
private static AmountOfConversion formatter = null;
// 创建AmountOfConversion的实例对象
// 创建初始化一个HashMap对象
private HashMap NumberMap = new HashMap();
private HashMap HighnumberofMoney = new HashMap();
// 创建初始化一个NumberFormat对象
private NumberFormat numberFormat = NumberFormat.getInstance();
private AmountOfConversion() {
// 在用new创建AmountOfConversion对象时,为HashMap对象进行key-value的映射
numberFormat.setMaximumFractionDigits(4);
// 设置数据的小数部分的最大位数是4位
numberFormat.setMinimumFractionDigits(2);
// 设置数据的小数部分的最小位数是2位
numberFormat.setGroupingUsed(false);
/* 设置此格式中是不可以使用组。如果设置可以使用组, 则数 1234567 可能被格式化为 "1,234,567" */
NumberMap.put("0", ZERO);
NumberMap.put("1", ONE);
NumberMap.put("2", TWO);
NumberMap.put("3", THREE);
NumberMap.put("4", FOUR);
NumberMap.put("5", FIVE);
NumberMap.put("6", SIX);
NumberMap.put("7", SEVEN);
NumberMap.put("8", EIGHT);
NumberMap.put("9", NINE);
NumberMap.put(DOT, DOT);
HighnumberofMoney.put("1", TEN);
HighnumberofMoney.put("2", HUNDRED);
HighnumberofMoney.put("3", THOUSAND);
HighnumberofMoney.put("4", TEN_THOUSAND);
HighnumberofMoney.put("5", TEN);
HighnumberofMoney.put("6", HUNDRED);
HighnumberofMoney.put("7", THOUSAND);
HighnumberofMoney.put("8", HUNDRED_MILLION);
}
public static AmountOfConversion getInstance() {
// 判断AmountOfConversion对象formatter是否初始化
if (formatter == null)
formatter = new AmountOfConversion();
return formatter;
}
// 进行金额转换的多种数据类型
public String format(String moneyStr) {
String result = "不能进行金额转换!!";
if (isConversion(moneyStr)) {
result = convertIntegerTochinese(moneyStr);
result = convertPointTochinese(result);
}
return result;
}
public String format(double moneyDouble) {
return format(numberFormat.format(moneyDouble));
}
public String format(int moneyInt) {
return format(numberFormat.format(moneyInt));
}
public String format(long moneyLong) {
return format(numberFormat.format(moneyLong));
}
public String format(Number moneyNum) {
return format(numberFormat.format(moneyNum));
}
private String convertIntegerTochinese(String moneyStr) {
// 将参数中传入的阿拉伯数字转换成中文
String result;
StringBuffer C2CStrBufer = new StringBuffer();
for (int i = 0; i < moneyStr.length(); i++) {
C2CStrBufer.append(NumberMap.get(moneyStr.substring(i, i + 1)));
}
// 拾佰仟万亿等都是汉字里面才有的单位,加上它们
int indexOfDot = C2CStrBufer.indexOf(DOT);
int moneyPatternCursor = 1;
for (int i = indexOfDot - 1; i > 0; i--) {
C2CStrBufer.insert(i, HighnumberofMoney.get(EMPTY
+ moneyPatternCursor));
moneyPatternCursor = moneyPatternCursor == 8 ? 1
: moneyPatternCursor + 1;
}
String fractionPart = C2CStrBufer.substring(C2CStrBufer.indexOf("."));
C2CStrBufer.delete(C2CStrBufer.indexOf("."), C2CStrBufer.length());
while (C2CStrBufer.indexOf("零拾") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零拾"), C2CStrBufer
.indexOf("零拾") + 2, ZERO);
}
while (C2CStrBufer.indexOf("零佰") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零佰"), C2CStrBufer
.indexOf("零佰") + 2, ZERO);
}
while (C2CStrBufer.indexOf("零仟") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零仟"), C2CStrBufer
.indexOf("零仟") + 2, ZERO);
}
while (C2CStrBufer.indexOf("零万") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零万"), C2CStrBufer
.indexOf("零万") + 2, TEN_THOUSAND);
}
while (C2CStrBufer.indexOf("零亿") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零亿"), C2CStrBufer
.indexOf("零亿") + 2, HUNDRED_MILLION);
}
while (C2CStrBufer.indexOf("零零") != -1) {
C2CStrBufer.replace(C2CStrBufer.indexOf("零零"), C2CStrBufer
.indexOf("零零") + 2, ZERO);
}
if (C2CStrBufer.lastIndexOf(ZERO) == C2CStrBufer.length() - 1)
C2CStrBufer.delete(C2CStrBufer.length() - 1, C2CStrBufer.length());
C2CStrBufer.append(fractionPart);
result = C2CStrBufer.toString();
return result;
}
private String convertPointTochinese(String moneyStr) {
// 对小数点后面的数字进行汉字处理
String result;
StringBuffer C2CStrBufer = new StringBuffer(moneyStr);
int indexOfDot = C2CStrBufer.indexOf(DOT);
C2CStrBufer.replace(indexOfDot, indexOfDot + 1, YUAN);
C2CStrBufer.insert(C2CStrBufer.length() - 1, JIAO);
C2CStrBufer.insert(C2CStrBufer.length(), FEN);
if (C2CStrBufer.indexOf("零角零分") != -1)// 没有零头,加整
C2CStrBufer.replace(C2CStrBufer.indexOf("零角零分"), C2CStrBufer
.length(), "整");
else if (C2CStrBufer.indexOf("零分") != -1)// 没有零分,加整
C2CStrBufer.replace(C2CStrBufer.indexOf("零分"),
C2CStrBufer.length(), "整");
else {
if (C2CStrBufer.indexOf("零角") != -1)
C2CStrBufer.delete(C2CStrBufer.indexOf("零角"), C2CStrBufer
.indexOf("零角") + 2);
}
result = C2CStrBufer.toString();
return result;
}
private boolean isConversion(String moneyStr) {
// 判断参数传来的数据是否符合进行转换的条件
int fractionDigits = moneyStr.length() - moneyStr.indexOf(DOT) - 1;
boolean flag = true;
if (fractionDigits > 2) {
System.out.println("金额" + moneyStr + "的小数位多于两位。");
// 精度不能比分低
flag = false;
}
return flag;
}
public static void main(String args[]) {
System.out.println("请输入金额数:");
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
System.out.println("转换后的金额为:");
System.out.println(getInstance().format(new Double(str)));
}
}
分享到:
相关推荐
本工程提供的就是一个Java实现XIRR的例子,它包含了测试类,可以直接运行并验证结果的准确性。 XIRR的计算基于现金流的时间价值理论,它考虑了资金的时间价值和现金流的间隔不均匀性。假设有一系列现金流(可以是正...
在本项目中,我们主要探讨的是如何使用Java编程语言来实现一个模拟肯德基快餐店的点餐收银系统。这个系统将包含用户界面、菜单管理、订单处理、支付结算等多个核心功能模块,旨在提供一个便捷、高效的点餐体验。 ...
在Java中,可以编写一个辅助方法,将数字转换为中文大写的表示,例如“壹”、“贰”等。这个过程可能涉及到字符串处理和数字比较,可以使用switch语句或者映射表来实现。 在开发ATM模拟程序时,我们还需要考虑以下...
2. **服务对象(Service Objects)**:在Java POS中,服务对象是设备驱动程序,它们实现了POS API接口,使得应用程序能够与硬件设备进行通信。例如,`ReceiptPrinter`服务对象用于控制打印机,`CashDrawer`服务对象...
### 嵌入式JavaPOS系统测试的设计与实现 #### 摘要及引言解析 本文档旨在探讨嵌入式JavaPOS系统测试的设计与实现,重点在于介绍如何利用JUnit测试框架来完成针对该系统的白盒测试。文章首先概述了嵌入式技术在现代...
### JAVA循环练习题知识点解析 #### 1. 斐波那契数列生成 ...以上练习题覆盖了JAVA编程中的循环结构、条件判断、数组操作、字符串处理、数学运算等多个方面,旨在全面锻炼和提升学习者的编程技能。
在这个Java实现的系统中,积分管理是POS系统的一个扩展功能,它允许顾客通过消费积累积分,提高客户忠诚度。 积分点更新生成是指当顾客进行购物时,系统会根据购买的商品金额或特定促销活动,自动计算并更新顾客的...
输出结果为 “Programming…Programming…Programming…” 而不是预期的 “Programming…Having class…”,原因是 `lee` 对象实际上并没有实现 `Student_i` 接口中可能存在的 `work()` 方法,因此无法成功转换为 ...
DSP实现了特定设备的功能,如打印机、扫描枪、现金抽屉等,并通过JavaPOS API提供给应用程序。 2. **适配器(Adapter)**:适配器是JavaPOS和硬件设备之间的桥梁,它将设备的特定协议转换为JavaPOS接口定义的通用...
在这个例子中,提供了“现金”和“刷卡”两种支付方式。 6. **按钮(JButton)**: `button1` 和 `button2` 分别代表“确认支付”和“取消支付”操作。`ActionListener` 接口用于监听按钮点击事件。 7. **事件...
对于身份证号输入,`idtifyField`也有一个`ActionListener`,但在这个示例中,没有执行任何具体操作,只是获取了输入的身份证号,并将其转换为字符串`idtifyword`。 `roomField`同样有一个`ActionListener`,但在这...
在压缩包文件名称“财务薪酬现金发放BY火0413.java”中,我们看到了一个Java源代码文件。这可能是用于处理财务、薪酬或现金发放业务逻辑的代码示例。由于它被提及在一个关于调试信息的话题中,我们可以假设这个Java...
`UpperCaseDocument`是一个自定义的文档类,当用户在`nameField`中输入文字时,会自动转换为大写,这通常是为了保持一致性,便于数据处理。`JComboBox`对象`jcb1`用于提供支付方式的选择,初始设置为“现金”和...
这是一个自定义的文档类,可能是为了确保用户在`nameField`中输入的文本始终转换为大写。通过设置`nameField`的文档为`UpperCaseDocument`,系统会自动将输入转化为大写字母,有助于保持数据的一致性。 4. **...
1. **数据处理**:首先,要能够从数据库或Excel文件中读取财务数据,这通常涉及SQL查询、数据清洗和数据转换。确保数据准确无误是财务报表的前提。 2. **报表格式设计**:报表的布局和格式应当符合会计准则和企业...
JSP页面在客户端请求时会被服务器转换成对应的Servlet,并执行相应的Java代码,生成动态内容返回给用户。在财务管理系统中,JSP可以用来创建用户界面,展示报表、输入表单等,使得用户可以直接与系统进行交互。 ...
- **市场的作用**:市场促进了商品与产品的转换,为商品提供了交易的平台。 - **货币的发展**:货币经历了从实物货币到商品货币再到信用货币的发展历程,每一步都是社会经济进步的结果。 - **银行的角色**:银行作为...