因为复习java基础知识,碰到了阿拉伯数字转换成人民币的面试题,在网上搜索到了不少的相关内容,结果简单测试了下,就发现了很多BUG,为了避免面试时碰到这样的题目,我就自己分析琢磨了。思前想后弄了好久(我菜),弄出了这么个小程序。从应用的角度来看,应该是没有什么意义了啊,也就是和有类似需求的人交流交流了。如果有什么不对的地方,或者可以更好地实现的地方,或者更好的思路,算法什么的,请大家批评指正啊。我就是个小菜鸟,呵呵!
import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Pattern;
public class ConvertMoney {
/**本人是菜鸟,彻彻底底的菜鸟,因为面试题,搜索网上的代码,结果发现有很多BUG
* 怕面试的时候真的遇到这样的题目,只好自己弄明白。琢磨了半天,最终成型。
*
*因为是菜鸟,所以基本的逻辑和思路都是比较简单的,如果您有更好的思路请留言
*
* 详细思路是这样的:
* 判断从控制台获得输入的字符串是否符合要求
* 分支:先判断是否输入,再判断是否是符合正则表达式的数字,再判断是否超出范围
* 符合要求返回精确到小数点后2位的字符串
* 把得到的字符串转换成人民币习惯的字符串
* 分支:先以"."为分隔符,把字符串拆分成 整数部分 + 小数部分
* 转换整数部分
* 转换小数部分
* 相加得到需要的人民币格式的字符串
*
* @author Peter Zhang
*/
private static final int SIZE = 16;
//最大为9999999999999.99 小于拾万亿
private final static String REGEX_NUM = "^\\d+(\\.\\d+)?$"; // 是数字
private final static String REGEX_DOUBLE = "^\\d{1,13}(\\.){1}\\d{0,2}$"; //最大为9999999999999.99的 double
private final static String REGEX_LONG ="\\d{1,13}";//最大为9999999999999 的long
private static final String CN_ZERO = "零";
private static final String CN_SYMBOL = "¥:";
private static final String CN_DOLLAR = "圆";
private static final String CN_INTEGER = "整";
private static final String[] DIGITS = new String[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
private static final String[] SMALLUNITS = new String[] { "", "拾", "佰", "仟" };
private static final String[] BIGUNITS = new String[] { "", "万", "亿", "万" };
private static final String[] DECIMALS = new String[] { "角", "分" };
// 测试
public static void main(String[] args) {
String num = getNum();//得到精确到小数点后两位的浮点数
String rmb = transToRMB(num);
System.out.println(rmb);
}
/**把阿拉伯数字转成人民币的写法输出
*
* @param num
* @return rmb
*/
private static String transToRMB(String num) {
String rmb = ""; //
if(Double.valueOf(num)==0.00){
rmb = CN_SYMBOL + CN_ZERO + CN_DOLLAR ;
return rmb;
}else{ //把浮点数拆分成 整数部分 + 小数部分
String integers = ""; //整数部分
String decimals = ""; //小数部分
String intOut = ""; //最终输出的整数部分
String decOut = ""; //最终输出的小数部分
String[] temp = num.split("\\."); //把num以"."为分隔符,分成两个String
integers = temp[0];
decimals = temp[1];
//转换整数部分
String intPart = "";
if(Double.parseDouble(integers)>0){ //最多13位 到万亿
int countZero =0;
for(int i=0;i<integers.length();i++){
//从左到右的每个字符
intPart = integers.substring(i,i+1);
int big = (integers.length() - i - 1) / 4 ;
int small = (integers.length() - i - 1 ) % 4 ;
if(intPart.equals("0")){
countZero++;
//处理 "[1-9]{1}0{12}" 12个0 的情况
if((integers.length()==13)&&(i==1)){
intOut += BIGUNITS[big];
}
}else{
if(countZero>0){
intOut += CN_ZERO;
}
countZero = 0;
intOut += DIGITS[Integer.parseInt(intPart)] + SMALLUNITS[small];
}
if(small==0 && countZero<4){
intOut += BIGUNITS[big];
}
}
intOut +=CN_DOLLAR;
}else{ // 整数部分为零
intOut += "";
}
//转换小数部分
String decPart = "";
if(Integer.parseInt(decimals)>0){ // 精确到两位 i只能是 0 和 1
//小数部分2位 有1 或者 2者都不为0
for(int i=0;i<decimals.length();i++){
//从左到右的每个字符
decPart = decimals.substring(i,i+1); //
if(!decPart.equals("0")){
decOut += DIGITS[Integer.parseInt(decPart)]+DECIMALS[i];
}else{
if(!intOut.equals("")){//整数部分不为零时,显示"零"
if(i==0){
decOut += CN_ZERO;
}
}
}
}
}else{ //都为0
decOut += CN_INTEGER ;
}
rmb = intOut + decOut;
return rmb;
}
}
/**
* 从命令行得到一个字符串,通过checkNum()方法检查是否符合要求
* @return 如果符合要求,则调用roundString()方法返回double;
* 否则,提示错误,返回-1
*/
private static String getNum(){
Scanner scan = new Scanner(System.in);
String input = null;
System.out.println( "请输入一个数字(最多到小数点后两位):");
input = scan.next();
scan.close();//关闭流
if(!checkNum(input)){
return "0";
}else{
return trimNum(input);
}
}
/**
* 把输入的数字精确为保留小数点后两位的浮点数,返回其字符串值
* @param input 通过checkNum()方法后的input
* @return bd2.toString
*/
private static String trimNum(String input) {
BigDecimal bd1 = new BigDecimal(input);
BigDecimal bd2 = bd1.setScale(2,BigDecimal.ROUND_HALF_UP);
return bd2.toString();
}
/**
* 验证输入是否符合要求(是Long 或者 Double 且长度不能超过16)
* @param input
* @return
*
*/
private static boolean checkNum(String input){
if(input==null||input.length()==0||input.trim().equals("")){
System.out.println("您没有输入");
return false;
}else{
boolean b = input.matches(REGEX_NUM);
// boolean b = Pattern.matches(REGEX, input);
if(!b){
System.out.println("您输入的不是一个数字");
return false;
}else{
if(input.length()>SIZE){
System.out.println("您输入的数字超出最大范围");
return false;
}else{
if(input.matches(REGEX_LONG)){ //符合long
return true;
}
if(!input.matches(REGEX_DOUBLE)){ //不符合精确到小数点后一位或两位的double
System.out.println("您输入的数字超出最大范围");
return false;
}
return true;
}
}
}
}
}
分享到:
相关推荐
阿拉伯数字金额转换成汉字金额,比如1000.00 转换成 壹仟元。
【Java菜鸟教程】是针对初学者精心编写的教程,旨在帮助新手快速掌握Java编程语言的基础知识。本教程全面覆盖了Java的核心概念和技术,是学习Java编程的理想起点。 首先,Java是一种面向对象的编程语言,由Sun ...
Java分为三个主要的体系结构版本:Java SE(标准版)、Java EE(企业版)、Java ME(微型版)。Java SE是核心,为桌面和服务器提供了基础的Java平台;Java EE构建在Java SE之上,提供了创建企业级应用程序和服务的...
这份名为“从Java菜鸟到专家的资料”的压缩包文件包含了丰富的学习资源,旨在帮助初学者逐步成长为Java领域的专家。以下是对各个文件的详细解读: 1. **J2EE研究文集.chm**:这个文件专注于Java企业级应用开发,...
"Java菜鸟专用很好"这个标题暗示了Java是适合初学者入门的语言,而描述中的“菜鸟一用就会”进一步强调了其易于理解和学习的特性。 Java语言的发展历史始于1991年,由James Gosling领导的Green小组为数字家电开发了...
"Java培训教程 菜鸟到高手"是一套旨在帮助初学者全面掌握Java编程技能的教程。这个教程的目标是通过系统性的学习,将新手逐步引领至高级开发者水平。 首先,Java基础知识是学习的起点。包括Java的历史、特性以及为...
根据提供的文件信息,我们可以推断出这是一本关于Java编程的学习指南或教程,旨在帮助初学者逐步提升自己的技能,从“菜鸟”(新手)成长为更熟练的“笨鸟”。这里,“菜鸟”通常用来形容初学者,“笨鸟”则可能意味...
### 一、JAVA面试题库的特点 - **内容选择性**:该题库旨在减轻面试者的负担,因此剔除了过时的知识点以及那些出现频率较低的问题。 - **答题策略**:推荐采用“正面陈述-特殊补充-锦上添花”的结构来组织答案,...
JAVA菜鸟级入门教程
在Java编程语言中,工具类(Utility Classes)是那些提供了静态方法或属性,通常用于执行特定辅助任务的类。它们不包含公开构造器,因为它们的设计不允许实例化。Java标准库(Java API)中就包含了许多这样的工具类...
Java源代码文件可以使用javac命令编译成Java字节码文件,然后使用java命令解释执行Java字节码文件。 Java语法 Java语言的语法包括注释、数据类型、数组、表达式、控制结构、函数等方面。 注释 Java语言的注释...
"Java图解创意编程:从菜鸟到互联网大厂之路" 《Java图解创意编程:从菜鸟到互联网大厂之路》这本书是一本面向初学者的编程书籍,旨在帮助读者从零基础开始学习Java编程,并逐步掌握互联网大厂常用的核心技术。本书...
Java是一种高级编程语言,特别适合初学者学习。它以其独特的特性和优势在IT行业中占据了重要的地位。本教程将深入探讨Java的基本概念和历史发展。 Java的主要特点体现在以下几个方面: 1. **面向对象**:Java是一...
Java是一种广泛使用的面向对象的高级编程语言,它是由Sun Microsystems公司在1995年推出的。Java的设计初衷是实现一种可以在各种不同设备和平台上运行的编程语言。为了达到这个目标,Java被设计为具有良好的跨平台...
菜鸟一枚,朋友需要在excel中将大写数字转换为阿拉伯数字,由于是文本格式的,我也不会,就研究用了vb来实现。当时想着复制粘贴,结果网上没找到,于是自己胡写了一些,一般情况测试通过。 这是vb源码。 普通excel...
【Java菜鸟进阶宝典】是一份专为Java初学者准备的综合学习资源,涵盖了从基础知识到高级技术的广泛内容,旨在帮助新手快速提升技能,成为熟练的Java开发者。这份资料包包含了多个主题,覆盖了Java开发的核心领域,如...
Java提供了两个主要的技术开发平台:Java SE(标准版)用于桌面应用程序的开发,而Java EE(企业版)则针对网络程序和企业级应用。 要开始学习Java,你需要安装JDK(Java Development Kit),并配置相应的环境变量...