转换阿拉伯数字为人名币大写
这是本周面试的一道题,当时在现场没做出来~~~,回来之后,三下两除二就弄出来了,尬!!!
先贴下代码把:(如有错或者好的解决方案,还望大佬提出,小弟不胜感激🤭)
package com.lql.test.day_05;
import java.math.BigDecimal;
import java.util.Scanner;
/**
* @author :BalalaEnergy
* @date :Created in 2021/3/12 22:02
* @description:
* @modified By:
*/
public class TestConvertRMBNum {
private static final String[] RMB_HAN = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
private static final String[] RMB_DW = {"圆", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"};
private static final String[] RMB_DW_POINT = {"角", "分"};
private static final String ZERO_NUM_STR = "^(0*)+(\\.[0]{1,2})?$";
private static final String ZERO_NUM_REGEX = "([0]{1,2})?$";
/**
* 亿级数最大长度
*/
private static final int Y_LEN = 12;
/**
* ASCII 0
*/
private static final int ASCII_NUM_ZERO = 48;
/**
* 最大精度
*/
private static final int POINT_MAX_LEN = 2;
/**
* 小数点
*/
private static final String POINT = ".";
/**
* 错误信息
*/
private static final String ERROR = "error";
private static final String WHOLE_STR = "整";
private static final String ZERO_ZERO = "00";
public static String outRMB(String RMB) {
// 去除00.00这种数据
Pattern r = Pattern.compile(ZERO_NUM_STR);
Matcher m = r.matcher(RMB);
if (m.matches()) {
return RMB_HAN[0] + RMB_DW[0] + WHOLE_STR;
}
boolean isPointNum = false;
// 1、参数校验
if (RMB.contains(POINT)) {
isPointNum = true;
}
char[] chars = RMB.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i] == '.') {
continue;
}
int num = Integer.valueOf(chars[i]) - ASCII_NUM_ZERO;
if (!(num >= 0 && num <= 9)) {
return "error: 请输入0~9的阿拉伯数字,请重新输入!";
}
}
if (RMB.length() > Y_LEN) {
return "error:您输入的参数太长,请重新输入!";
}
if (isPointNum) {
if (RMB.substring(RMB.indexOf(POINT) + 1).length() > POINT_MAX_LEN) {
return "error:最大精度仅支持两位,请重新输入!";
}
}
// 2、装换数字
// 2.1 分割小数
// 整数金额
String strNum;
// 小数金额
String strPoint;
// 整数汉字
String strHanWhole;
// 小数汉字
String strHanPoint = "";
if (isPointNum) {
strNum = RMB.substring(0, RMB.indexOf(POINT));
strHanWhole = convertNumToHanZi(strNum);
strPoint = RMB.substring(RMB.indexOf(POINT) + 1);
r = Pattern.compile(ZERO_NUM_REGEX);
m = r.matcher(strPoint);
if (!m.matches()) {
strHanPoint = convertNumToHanZi(strPoint);
}
} else {
strNum = RMB;
strHanWhole = convertNumToHanZi(strNum);
}
// 3、添加单位
strHanWhole = addDW(strHanWhole, 0);
if (strHanPoint != "") {
strHanPoint = addDW(strHanPoint, 1);
}
// 去除小数后的末位零
if (strHanPoint != "" && strHanPoint.endsWith(RMB_HAN[0])) {
strHanPoint = strHanPoint.substring(0, strHanPoint.length() - 1);
}
if (strHanPoint == "" || ZERO_ZERO.equals(strHanPoint)) {
strHanWhole = strHanWhole + WHOLE_STR;
}
// 角加整
if (strHanPoint.endsWith(RMB_DW_POINT[0])) {
strHanPoint = strHanPoint + WHOLE_STR;
}
if (strHanPoint.endsWith(RMB_HAN[0])) {
strHanPoint = strHanPoint.substring(0, strHanPoint.length() - 1);
}
if (strHanWhole.endsWith(RMB_HAN[0]) && strHanPoint.startsWith(RMB_HAN[0])) {
strHanWhole = strHanWhole.substring(0, strHanWhole.length() -1);
}
return strHanWhole + strHanPoint;
}
/**
* 通过传递进来的数字转换为中文汉字
*
* @param nums
* @return
*/
public static String convertNumToHanZi(String nums) {
String hanZiNum = "";
for (int i = 0; i < nums.length(); i++) {
int value = Integer.valueOf(nums.substring(i, i + 1));
for (int j = 0; j < RMB_HAN.length; j++) {
if (value == j) {
hanZiNum += RMB_HAN[j];
break;
}
}
}
return hanZiNum;
}
/**
* 通过传递的数值添加单位
*
* @param str 字符串
* @param type 0:整数 1:小数
* @return
*/
public static String addDW(String str, int type) {
String temp = "";
boolean last_zero = false;
int zero_num = 0;
int len = str.length();
for (int i = 0; i < str.length(); i++) {
// 4、多个相邻的零只显示一个
if (str.substring(i, i + 1).equals(RMB_HAN[0])) {
zero_num++;
} else {
zero_num = 0;
}
if (zero_num > 1) {
if (len == 4) {
temp = temp.substring(0, temp.length() - 1) + RMB_DW[len];
zero_num = 0;
}
--len;
continue;
}
if (zero_num == 1) {
temp += str.substring(i, i + 1);
--len;
continue;
}
switch (type) {
case 0:
temp += str.substring(i, i + 1) + RMB_DW[--len];
break;
case 1:
temp += str.substring(i, i + 1) + RMB_DW_POINT[i];
break;
default:
break;
}
}
return temp;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一金额:");
BigDecimal num;
try {
num = sc.nextBigDecimal();
String nums = num.toString();
String msg = outRMB(nums);
if (msg.contains(ERROR)) {
System.out.println("提示:" + msg.substring(msg.indexOf(":") + 1));
} else {
System.out.println("当前金额为:" + outRMB(nums));
}
} catch (Exception e) {
System.out.println("提示:您输入的参数有误,请输入0~9的阿拉伯数字");
}
}
}
下面说一下当时的面试情况~
最近在找工作,于是面试了很多家公司,每个公司的面试题呢也做了很多,基本没什么太大的难度(毕竟面试的是初级开发人员),然后就面试有一家的题就是要求把阿拉伯数字转换为人名币大写,我以为是和之前一样,笔试,结果是上机敲代码。。。,这就算了,提供的电脑是Linux系统😂~~,提供的编译环境呢是eclipse,就是对于我平时来说用的不多的东西,就很尴尬,上机的地方是在一堆开发的后面,当时就感觉压力山大,生怕做不出来后面的大佬投来菜鸡的目光,结果,果然没做出来啊😂,而且还耗了很多时间 。。。
总之就一个字:尬!!😂
总结:
最后吧,个人的自身实力有待还是有待提高,这周面试的很多,也拿到了几个简历,下下周就要奔向新的战场!周五的时候和以为大佬交谈的时候大佬给我提了一些建议:
-
认清楚学习的方向
之前的话,自己一直想的是学习些新技术就能够成为大佬,但其实真正的大佬是对看问题的深度研究,对细节的把控与掌握,新技术得学,但更重要的是基础与细节,知识都是连贯的,修万里长城得一砖一瓦的搭建!!
-
找到自己的职业规划
大佬问到这个问题的时候,其实整个人都是蒙的,因为我并不理解其意思,现在想的就是提升技术,然后挣更多的钱😂,就现在也还是蒙的,我觉得这不是一件简单的事,因为的我对未来还是充满了想象!