算法--java实现将数字转换成人民币大写(迅雷面试题)
今天去迅雷面试,是个数字转换成人民币的算法题:
public class Rmb {
/**
* 人民币的基本信息和操作
*
* @author soyoungboy
* @version 1.0
*/
private double number; //人民币的数量
private static final String[] hanArr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};//汉字计数符号
private static final String[] unitArr = {"", "拾", "佰", "仟"};//汉字计数单位
private static final String[] unitArrs = {"万", "亿", "万", "兆", "万", "亿", "万", "圆"}; //顺序添加单位
//private String[] unitsArr = {"万", "亿"}; //汉字计数大单位
public Rmb() {
}
/**
* 构造器初始化人民币数量
*
* @param number 给定的初始化人民币数
*/
private Rmb(double number) {
this.number = number;
}
/**
* 把一个浮点数分解成long型部分和小数部分字符串,把人民币换成了整数,浮点数在取小数部分时临界值有误差
*
* @return 返回分解后的字符串数组,第一个数组元素是整数部分,第二个是小数部分字符串
*/
private String[] divideNum() {
double num = Math.round(number * 100);//对number进行四舍五入取整
long integerPart = (long) num; //连同小数点后两位取成整数 ,避免使用减法
//double decimalsPart = num-integerPart;//小数部分,临界时产生了误差
String decimalsPartStr;
long b = integerPart % 10; //小数点后第二位
long a = (integerPart / 10) % 10;//小数点后第一位
integerPart /= 100;
if (a == 0 && b == 0) {
decimalsPartStr = null;
} else {
decimalsPartStr = "" + a + b;
}
return new String[]{String.valueOf(integerPart), decimalsPartStr};
}
/**
* 把一个数字字符转换成汉语的人民币读法
*
* @return 返回汉语人民币读法的字符串形式
*/
private String toHanStr() {
String[] results = new String[9]; //用来暂时存储每四位分段后的数字字符串
String[] resultStrs = new String[9];//用来暂时存储每四位分段后转换成的人民币读法
StringBuilder result = new StringBuilder();//最终的转换结果
String[] divideStr = divideNum(); //得到浮点数分解成的long型部分和小数部分字符串,第一个数组元素是整数部分字符串,第二个是小数部分字符串
results[8] = divideStr[1];
for (int i = divideStr[0].length(), j = 8; i > 0 && j > 0; i -= 4, j--) {
try {
results[j - 1] = divideStr[0].substring(i - 4, i);
} catch (Exception e) {
results[j - 1] = divideStr[0].substring(0, i);
break;
}
}
if (results[8] == null) {
resultStrs[8] = "整";
} else if (results[8].charAt(1) == '0') {
resultStrs[8] = hanArr[results[8].charAt(0) - 48] + "角"; //根据ASCII码和hanArr数组吧数字改成汉语大写
} else {
resultStrs[8] = hanArr[results[8].charAt(0) - 48] + "角" + hanArr[results[8].charAt(1) - 48] + "分";
}
for (int i = 0; i < 8; i++) {
if (results[i] != null) {
resultStrs[i] = "";
resultStrs[i] += hanArr[results[i].charAt(0) - 48] + unitArr[results[i].length() - 1]; //根据ASCII码和数组长度选择数的单位
for (int j = 1; j < results[i].length(); j++)
if (results[i].charAt(j - 1) == '0' && results[i].charAt(j) != '0')
resultStrs[i] += "零" + hanArr[results[i].charAt(j) - 48] + unitArr[results[i].length() - 1 - j]; //根据ASCII码和数组长度选择数的单位
else if (results[i].charAt(j) != '0')
resultStrs[i] += hanArr[results[i].charAt(j) - 48] + unitArr[results[i].length() - 1 - j];
}
}
for (int i = 0; i < 8; i++) {
if (resultStrs[i] != null) {
result.append(resultStrs[i]).append(unitArrs[i]);
}
}
result.append(resultStrs[8]);
return result.toString();
}
public static void main(String[] args) {
double l;
byte[] bye = new byte[50];
System.out.println("请输入要转换的人民币数量:");
try {
System.in.read(bye);
} catch (Exception e) {
e.printStackTrace();
}
String s = new String(bye);
l = Double.parseDouble(s);
Rmb r = new Rmb(l);
s = r.toHanStr();
System.out.println(s);
}
}
结果:
请输入要转换的人民币数量:
456789
肆拾伍万陆仟柒佰捌拾玖圆整
后悔没坚持参加面试。
如果code代码出处:https://www.teakki.com/p/57df787e1201d4c1629ba891
算法--java实现将数字转换成人民币大写(迅雷面试题)的更多相关文章
- js 将数字转换成人民币大写的方法
//将数字转换成人民币大写的方法 var digitUppercase = function (n) { var fraction = ['角', '分']; var digit = [ '零', ' ...
- C# 数字转换成汉字大写 数值转换成汉字大写
1.数字转换成汉字大写 public string NumToChinese(string x) { //数字转换为中文后的数组 //转载请注明来自 http://www.shang11.com st ...
- js 将数字转换成中文大写
//完成将 toChineseNum, 可以将数字转换成中文大写的表示,处理到万级别,例如 toChineseNum(12345),返回 一万二千三百四十五. const toChinesNum = ...
- 完成将 toChineseNum, 可以将数字转换成中文大写的表示,处理到万级别,例如 toChineseNum(12345),返回 一万二千三百四十五
const toChineseNum = (num) => { const unit = ['', '十', '百', '千'] const counts = ['零', '一', '二', ' ...
- .net数字转换成汉字大写
public class Num2Rmb { private String[] hanArr={"零","壹","贰","叁&qu ...
- java算法:统计数字-将数字转换成字符串,然后使用字符串String.valueOf()方法进行判断
题目: 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. 样例 样例 1: 输入: k = 1, n = 1 输出: 1 解释: 在 [0, 1] 中,我们发现 1 出现了 ...
- 比较java与c语言中数字转换成字符的不同
java java中将数字转换成字符非常方便,只要用一个"+"然后在跟一个空格行了.比如,你输入一个122 ,就会变成"122 ". import java.u ...
- java 将一个正整数翻译成人民币大写的读法
程序如下: import java.lang.StringBuffer; /** 给定一个浮点数,将其装换成人民币大写的读法 88.5:捌十捌元零伍角 */ public class Num2Rmb ...
- java中汉字自动转换成拼音
java中汉字自动转换成拼音 1.需要下载jar包 pinyin4j.2.5.0.jar ,加入到WEB-INF下的lib里边,右键add to bulid path. 2.[代码]PinYinUti ...
随机推荐
- WPF制作带明细的环形图表
效果 明细用Popup实现的,录gif时,Popup显示不出来,不知道为什么,所以静态图凑合看吧 大体思路 图表使用Arc+Popup实现 图表分为两部分,一是环形部分,一是标注的明细部分. 环形部分 ...
- 【下一代核心技术DevOps】:(七)持续集成Jenkins的应用(Aliyun Pipiline持续构建)
1. 前言 使用Jenkins比较好的就是可以在整个构建顺序中增加自定义的动作,比如构建成功给Leader发个邮件,给团队核心发个微信什么的. 当然最基本的核心还是它可以构建多种开发语言的项目,此类构 ...
- 基于HTML5 Canvas WebGL制作分离摩托车
工业方面制作图表,制作模型方面运用到 3d 模型是非常多的,在一个大的环境中,构建无数个相同的或者不同的模型,构建起来对于程序员来说也是一件相当头疼的事情,我们利用 HT 帮大家解决了很大的难题,无数 ...
- Python_函数_复习_习题_24
# 函数 # 可读性强 复用性强# def 函数名(): # 函数体 #return 返回值# 所有的函数 只定义不调用就一定不执行 #先定义后调用 #函数名() #不接收返回值#返回值 = 函数名( ...
- 2-Twenty Fifth Scrum Meeting-20151231
前言 因为服务器关闭,我们的开发项目也遭遇停滞一个星期.与网站开发负责人员协商之后,29号开放服务器.我们的项目也能够继续下去.比规定的开发时间(截止为2015/12/29)推迟. 事项安排 1.开发 ...
- 《linux内核设计与实现》第三章
1.进程 进程就是正在执行的程序代码的实时结果,不仅包含可执行代码,还包括其他资源,比如:打开的文件,挂起的信号,内核内部数据结构,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程 ...
- Linux内核分析作业 NO.8 完结撒花~~~
进程的切换和系统的一般执行过程 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 ...
- 第七周linux内核分析
可执行程序的装载 作者 黎静+ 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...
- 软件工程_9th weeks
PSP DATE START_TIME END_TIME EVENT TYPE TIME 4.30-5.3 5:30 4:00 旅游 娱乐 72h 5.3 14:00 17:0 ...
- python模块_pcharm导入包的问题
1.添加pip包 2.导入项目需要由内置包(library root)