面试的时候碰到过这个问题,当时只说了一下自己的思路,现在把它写下来.
package amountchange;
import java.math.BigDecimal;
import org.omg.CORBA.TRANSIENT;
/**
*
* @author toflyhigh
* 2008-06
*
*/
public class AmountChange2RMB {
private static String bigLetter[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
"柒", "捌", "玖" };
private static String unit[] = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟",
"亿", "拾", "佰", "仟", "万" };
private static String unitSmall[] = { "分", "角" };
/**
*
* @param args
*/
public static void main(String[] args) {
String[] testStrs = { "1234567888888.100"/* 大十进制数 */,
"1001"/* 没有小数,且含相邻的两个零 */, "101005.1"/*零在单位所处的位置*/, "1010"/*零在元位*/ };
System.out.println(new BigDecimal(testStrs[2]).toString());
System.out.println(trans(testStrs[2]));
}
public static String trans(String str) {
BigDecimal dec = check2BigDecimal(str);
if (dec == null)
return null;
str = dec.toPlainString();
String[] sArr = str.split("\\.");
String intOnly = sArr[0];
String smallOnly = "";
if (sArr.length == 2)
smallOnly = sArr[1];
if (smallOnly.length() > 2) {
smallOnly = smallOnly.substring(0, 2);
}
return transInt(intOnly) + transSmall(smallOnly);
}
public static String transInt(String str) {
if ("0".equals(str))
return "";
StringBuffer newS = new StringBuffer();
char[] cArr = str.toCharArray();
for (int i = 0; i < cArr.length; i++) {
String u = unit[cArr.length - i - 1];
int position = "元万亿".indexOf(u);
// 遇到零,特殊处理
if (cArr[i] == '0') {
// 如果零在特殊位置上:比如个位,万位,亿位
if (position >= 0) {
// 如果零在个位:需要加上单位“元”
if (position == 0) {
newS.append(unit[cArr.length - i - 1]);
continue;
} else {// 如果零不在个位
// 零不在个位,且这个位后,紧跟着一个零:只需要加上单位
if (i < cArr.length - 1 && cArr[i + 1] == '0') {
newS.append(unit[cArr.length - i - 1]);
continue;
} else {// 零不在个位,且这个位后,没有紧跟着一个零:需要加上单位和大写数字(注意次序:单位在前,大写数字在后)
newS.append(unit[cArr.length - i - 1]);
newS.append(bigLetter[cArr[i] - 48]);
continue;
}
}
} else {// 零不在特殊位置上
// 零不在特殊位置上,且这个位后,紧跟着一个零:忽略这个零
if (i < cArr.length - 1 && cArr[i + 1] == '0') {
continue;
}
// 零不在特殊位置上,且这个位后,没有紧跟着一个零:需要加上大写数字
newS.append(bigLetter[cArr[i] - 48]);
continue;
}
}
// 不是零,常规处理
newS.append(bigLetter[cArr[i] - 48]);
newS.append(unit[cArr.length - i - 1]);
}
return newS.toString();
}
public static String transSmall(String str) {
//因为最多精确到分,所有str的长度最多位2
if (str == null || "".equals(str))
return "";
char[] cArr = str.toCharArray();
if (str.indexOf("0") == -1) {//不含有零,常规处理
StringBuffer newS = new StringBuffer();
for (int i = 0; i < cArr.length; i++) {
newS.append(bigLetter[cArr[i] - 48]);
newS.append(unitSmall[cArr.length - i - 1]);
}
return newS.toString();
} else {//含有零,分情况考虑
if (cArr[0] == '0' && cArr[cArr.length == 2 ? 1 : 0] == '0')//两个都为零
return "";
if (cArr[0] == '0' && cArr.length == 2 && cArr[1] != '0')//角位为零,分位不为零
return bigLetter[0] + bigLetter[cArr[1] - 48] + unitSmall[0];
if (cArr[0] != '0' && cArr.length == 2 && cArr[1] == '0')//分位为零,角位不为零
return bigLetter[cArr[0] - 48] + unitSmall[1];
}
return "";
}
public static BigDecimal check2BigDecimal(String str) {
try {
double f = Double.valueOf(str);// 0.0 0.1 -5 ""
if (f < 0)
System.out.println("输入数据小于0,请检查!");
return new BigDecimal(f);
} catch (NumberFormatException e) {
e.printStackTrace();
}
return null;
}
}
分享到:
相关推荐
Java中关于金额小写转换为大写的工具类
根据给定的信息,本文将详细解释一个Java程序如何实现金额数字到大写金额的转换功能。此程序的主要目的是为了在财务、会计等场景下能够准确地将数字形式的金额转换成汉字大写形式,这对于正式文件如发票、合同等非常...
在这个单位换算工具中,每个不同的单位(如米和公里)可能被表示为一个类,每个类包含与该单位相关的转换方法。 2. **面向对象设计** 在这个工具的设计中,可能会有一个基类“单位”(Unit),它定义了转换的基本...
本示例中的"人民币大小写转换java完美版"就是一个典型的实例,它解决了在Java编程中将数字金额转换为大写的汉字金额,这对于银行系统、财务软件或上机作业来说是至关重要的功能。下面我们将深入探讨这个主题,讲解...
通过以上步骤,我们可以创建一个功能完善的人民币大小写转换工具,帮助财务人员快速准确地完成工作。在开发过程中,除了技术实现,还需要考虑用户体验和安全性,确保转换的准确性和数据的安全性。
在Java编程语言中,开发一个GUI(图形用户界面)应用程序,用于将人民币金额转换成大写,是一项常见的任务,尤其在财务系统或者银行应用中。这个功能有助于避免因数字输入错误引发的潜在问题,因为汉字的大写金额比...
5. **人民币大小写转换**:这个实验涉及到字符串操作和格式化输出。在Java中,我们可以利用字符串的拼接、格式化方法以及正则表达式来实现人民币金额的数字与大写字符之间的转换。这不仅锻炼了字符串处理能力,还...
7. **大小写金额转换**:在金融领域,金额的表示有时需要区分大小写,例如1234.56和1,234.56。在Java中,可以使用`DecimalFormat`类进行格式化,添加千位分隔符和小数点后位数的控制。 8. **打印等腰三角形**:这...
在IT行业中,尤其是在财务软件和办公自动化领域,金额大小写转换是一个常见的需求。这个小工具显然是为了解决这个问题,将数字金额转换成我们日常在发票、支票等正式财务文档中使用的中文大写数字。在中文会计和法律...
**金额大小写转换**:定义两个字符串数组分别存储数字和货币单位,将数字转换为对应的汉字表示。 3. **综合题**: - C1. **找数组中最大/最小的数**:可以通过一次遍历找到数组中的最大值和最小值,或者采用分治...
1. **金额大小写改写**: 这个功能涉及到字符串处理和格式化。在Java中,我们可以使用`String`类的方法,如`toUpperCase()`和`toLowerCase()`来转换大小写。对于金额的处理,可能需要处理小数点和逗号分隔符,这...
### 人民币大小写转换VB代码解析 #### 一、引言 在财务处理或银行系统中,经常需要将数字金额转换为大写形式,尤其是在中国,这种需求尤为常见。例如,将“123456.78”转换为“壹拾贰万叁仟肆佰伍拾陆元柒角捌分”...
24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...
为了解决这类问题,可以采用以下两种方法:一是将货币金额转换为最小单位,如用分代替元来避免精度误差;二是使用BigDecimal类,特别是使用BigDecimal(String)构造器创建BigDecimal对象以避免在转换float或double到...
24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...
84.9. 题目1:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连. 117 84.10. 写一个方法,实现字符串的反转,如:输入...
4. 如果某一位是0,通常用“零”表示,但如果连续几个0,为了简化,可以只在最后一个0的位置写“零”; 5. 金额末尾添加“整”或“正”表示完整无缺; 6. 当数值为零时,大写金额为“零元整”; 7. 单位包括元、万元...
Java经典编程源码例程,可以做为你的学习设计参考。 第1章 Java语言概述 1 实例001 输出“Hello World” 2 实例002 输出控制台传递的参数 2 实例003 输出由“*”组成的三角形 3 ...实例082 字符串大小写转换 1