用java编写一个程序,将浮点数转换成人民币读法字符串
2017-04-12 14:10
363 查看
题目出自李刚老师的《疯狂Java讲义(第二版)》第四章练习题2
编程思路:
先将浮点数乘以100,强制转换为long型整数(用int会出现数据溢出),然后用得到后的整数依次除以10的(i)次幂,得到该整数第(i+1)位的数值,然后将中文读法字符串和单位按顺序排好,根据一些判定条件,给出相应的转换。
此处要注意的有:
1.本程序只考虑万亿级,万亿以上不考虑在内(即最大为9999,9999,9999.99);
2.高位为零时不予输出,直到第一个不为零的位开始输出(如0009,9999,9999.99前3个0不输出);
3.低位连续出现两个或两个以上零时,只读一个,且要亿级、萬级、圆级要带上相应单位
(如9990,0999.99会输出九千九百九十萬零九百九十九元九角九分);
public class Num2RMB
{
//定义一个输入的double数据
public double input;
//定义中文数字数组
String[] chinese = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
//定义单位数组(单位按照位数从小到大来排序)
String[ ] unit = {"分","角","圆","拾","佰","仟","萬","拾","佰","仟","亿","拾","佰","仟"};
//定义一个构造器,初始化输入的double数据;
public Num2RMB()
{
input = 9900090090.4687;
}
//编写转化方法,思路,将该数乘以100,再除以10的i次幂,再取整,如果结果不为零,则加上结果和单位;
public void readInChinese(double input)
{
//此处a不能用int,会造成数据溢出,所用要用long,将double数乘以100,等到一个long数
long a = (long)(input*100);
int b;
int count = 0;//用于记录当前位的上一位是否为0,默认亿亿位为0
for (int i=13; i>=0; i--)
{
b = (int)(a/Math.pow(10.0, i));//b=a/10的b所在位数减1次幂
if (b != 0)
{
a = (long)(a-b*Math.pow(10.0, i));//b不为0时,a=a去掉最高位数,为下一次转换做准备
System.out.print(chinese+unit[i%14]);//输出数字和单位
}
else if (i%4 == 2 && i/2==1)//若b=0,则判断此位是否要输出圆
{
System.out.print(unit[i%14]);
count = b;
}
else if (i%4 == 2)//判断是否要输出亿或者萬
{
System.out.print(unit[i%14]+chinese[b]);
}
else if (count !=0)//判断是否要输出零
{
System.out.print(chinese[b]);//当b=0时,若count!=0,则输出chinese[0],即零
count = b;
}
else
{
//以上条件都不满足时,不打印
count = b;
}
}
}
//主程序入口,先创建对象,然后执行readInChinese方法
public static void main(String[ ] args)
{
Num2RMB n = new Num2RMB();
n.readInChinese(n.input);
}
}
[b]新手入门,不对之处欢迎指正。
编程思路:
先将浮点数乘以100,强制转换为long型整数(用int会出现数据溢出),然后用得到后的整数依次除以10的(i)次幂,得到该整数第(i+1)位的数值,然后将中文读法字符串和单位按顺序排好,根据一些判定条件,给出相应的转换。
此处要注意的有:
1.本程序只考虑万亿级,万亿以上不考虑在内(即最大为9999,9999,9999.99);
2.高位为零时不予输出,直到第一个不为零的位开始输出(如0009,9999,9999.99前3个0不输出);
3.低位连续出现两个或两个以上零时,只读一个,且要亿级、萬级、圆级要带上相应单位
(如9990,0999.99会输出九千九百九十萬零九百九十九元九角九分);
public class Num2RMB
{
//定义一个输入的double数据
public double input;
//定义中文数字数组
String[] chinese = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
//定义单位数组(单位按照位数从小到大来排序)
String[ ] unit = {"分","角","圆","拾","佰","仟","萬","拾","佰","仟","亿","拾","佰","仟"};
//定义一个构造器,初始化输入的double数据;
public Num2RMB()
{
input = 9900090090.4687;
}
//编写转化方法,思路,将该数乘以100,再除以10的i次幂,再取整,如果结果不为零,则加上结果和单位;
public void readInChinese(double input)
{
//此处a不能用int,会造成数据溢出,所用要用long,将double数乘以100,等到一个long数
long a = (long)(input*100);
int b;
int count = 0;//用于记录当前位的上一位是否为0,默认亿亿位为0
for (int i=13; i>=0; i--)
{
b = (int)(a/Math.pow(10.0, i));//b=a/10的b所在位数减1次幂
if (b != 0)
{
a = (long)(a-b*Math.pow(10.0, i));//b不为0时,a=a去掉最高位数,为下一次转换做准备
System.out.print(chinese+unit[i%14]);//输出数字和单位
}
else if (i%4 == 2 && i/2==1)//若b=0,则判断此位是否要输出圆
{
System.out.print(unit[i%14]);
count = b;
}
else if (i%4 == 2)//判断是否要输出亿或者萬
{
System.out.print(unit[i%14]+chinese[b]);
}
else if (count !=0)//判断是否要输出零
{
System.out.print(chinese[b]);//当b=0时,若count!=0,则输出chinese[0],即零
count = b;
}
else
{
//以上条件都不满足时,不打印
count = b;
}
}
}
//主程序入口,先创建对象,然后执行readInChinese方法
public static void main(String[ ] args)
{
Num2RMB n = new Num2RMB();
n.readInChinese(n.input);
}
}
[b]新手入门,不对之处欢迎指正。
相关文章推荐
- 将一个浮点数转换成人民币读法字符串(java)
- 将一个浮点数转换成人民币读法字符串(java)
- 将一个浮点数转换成人民币读法字符串(java)
- java程序---将一个浮点数转换成人民币读法
- 将浮点数转换成人民币读法字符串(JAVA)
- 输入一个浮点数,打印出相对应的人民币读法的字符串,如:1605.22转换后为:壹仟陆佰零伍元贰角贰分
- Java实现浮点数转换成人民币读法字符串
- 实现浮点数转换成人民币读法字符串(Java)
- 疯狂Java练习题 将浮点数转换成人民币读法字符串
- Java小程序——将浮点数转换成人民币读法
- 疯狂java讲义 第四章 01人民币的转换读法小程序
- 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- 【C语言】编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- C语言 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- 编写程序,测试字符串“你好,欢迎来到Java世界”的长度,将字符串的长度转换成字符串进行输出,并对其中的“Java”四个字母进行截取,输出截取字母以及它在字符串中的位置。
- java编写程序查找出在一个字符串中出现次数最多的字母
- 【c语言】编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- java程序,编写一个程序,输出一个字符串中的大写英文字母数,小写英文字母数及非英文字母数