实现浮点数转换成人民币读法字符串

编写一个程序,将浮点数转换成人民币读法字符串,

例如:    将1006.333转换为壹千零陆元叁角叁分。

题意分析:

将浮点数分成整数部分和小数部分,分开处理整数部分和小数部分。

小数部分的处理比较简单,截取保留两位数字,并将其转换成几角几分的字符串即可。

整数部分可以以4位数字分为几个数组,每一个4位数字都是几千几百几十几(添加适当的单位)。

这4位数字若出现在1~4位,则后面添加‘元’,若出现在5~8位,则添加‘万’,若出现在9~12位,则添加‘亿’。

超过12位以后,暂不考虑,实际上,超过12位数后,double类型存储溢出,会造成数据的错误。

代码编译分析:

将浮点数分成整数部分和小数部分字符串,只要把double型的浮点数强制转换成long型即可得到整数部分,

将double型的浮点数减去long型的整数部分即可得到浮点数的小数部分,由于只需取两位则乘以100,再用

Math.round函数取整得到小数部分。用“zheng+”“ ”或"String.valueOf(xiao)"将整数转换为字符串。

将小数部分的字符串逐个进行判断,在其后面适当的增加角、分,即可转换成功。

将整数部分的字符串补零,使其字符串长度成为4的倍数,以便4位一组的分组。使用字符串截取函数截取后4

位的字符串,并使原字符串更新为除去后4位以后的字符串。

4位一组的字符串进行汉字字符的转换,若非最后一位数字且数字不为零,则需添加单位。

每四位的已转换好的汉字字符串连接时需注意顺序。

特殊情况分析:

若数字小数点后一位为0,如19.08,则需在小数部分转换时考虑小数部分字符串的长度,若长度为1,则特殊处理。

若数字如10009所示,后四位截取后为0009,转换时易出现错误,需将其转换为字符串9后再将其进行汉字字符的

转换。

若数字如1009所示,2个零相邻,则需对转换时单个字符为0时的前一个字符进行判断,是否需要进行转换操作。

若数字如1890所示,最后一位为零,则需对转换后的字符串进行判断最后一个字符是否为零,是否需要删去。

若数字如0.89,或10000.89所示,截取的4位字符串位0,则需单独进行转换操作。

 package 人民币读法;

 import java.util.Arrays;
import java.util.Scanner; // 编写一个程序,将浮点数转换成人民币读法字符串,例如,将1006.333转换为壹千零陆元叁角叁分
// D:\疯狂Java讲义\codes\04\4.6 NUM2RMB public class Rmb {
private String[] str1 = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] str2 = {"十","百","千"};
private String[] str3 = {"角","分"};
private String[] str4 = {"元","万","亿"};
// 把浮点数分解成整数部分字符串
private String divadeZheng(double num)
{
long zheng = (long)num;
// 整型转换成字符串
return zheng + "";
}
// 把浮点数分解成小数部分字符串
private String divadeXiao(double num)
{
long zheng = (long)num;
// 得到浮点数的小数部分
long xiao = Math.round((num-zheng)*100);
// 用方法把整型转换成字符串
return String.valueOf(xiao);
} // 把小数部分的数字字符串转换成汉字字符串
private String toStr1(String xiao)
{
String re1 = "";
int len = xiao.length();
if(len==2)
{
for(int i = 0;i<2;i++)
{
// 把字符串转换成数字
int num = xiao.charAt(i) - 48;
// 数字不为零则需要加单位,为零则不操作
if(num!=0)
{
re1 += str1[num] + str3[i];
}
}
}
// 若长度为1,例:12.09小数部分为9
if(len==1&&xiao.charAt(0)!='0')
{
int num = xiao.charAt(0) - 48;
// 此时只有分,加单位str3【1】
re1 +=str1[num] + str3[1];
}
return re1;
} // 把一个四位的数字字符串变成汉字字符串
private String toStr(String zheng)
{
String re = "" ;
int j = 0;
int lenz = zheng.length();
// 特殊情况如输入0.89时,整数字符串为0的处理
if(zheng.charAt(0)=='0'&&lenz==1)
{
re +="零";
return re;
}
// 遍历每一位数字
for(int i =0;i<lenz;i++)
{
int num = zheng.charAt(i) - 48;
// 若不是最后一位数字且数字不为零,则需要添加单位
if(i!=lenz-1&&num!=0)
{
re += str1[num]+str2[lenz-2-i];
}
// 对于连续0出现的特殊处理,如1009,第二个零不进行操作
else if(!(num==0&&re.charAt(j-1)=='零'))
{
re += str1[num];
}
j = re.length();
}
// 对特殊情况最后一位是零的处理,如1990,删除掉末尾的零
if(re.charAt(j-1)=='零')
{
re = re.substring(0, j-1);
}
return re;
}
// 对于金额的整数部分在12位数以内的处理,以4位数为一组,
// 如1234(亿),5678(万),1234(元).89,
private String zhengDivade(String zheng)
{
int len = zheng.length();
String Re = "";
int n = 0;
// 判断整数部分的长度,考虑需要分几个组
if(len>=9)
n = 3;
else if(len>=5)
n = 2;
else if(len>=1)
n = 1;
// 若位数非4的倍数,则在前面补0,直到位数为4的倍数为止
// 如 12,2345补为0012,2345
if(len%4!=0)
{
String zh = "";
int s = len%4;
// 在前面补0
for(int k=0;k<(4-s);k++)
{
zh += "0";
}
zh += zheng;
zheng = zh;
}
// 进行n个组合的串联
// 进行n次循环
for(int i=0;i<n;i++)
{
String Zheng = "";
String sss ="";
// 长度在变化
len = zheng.length();
// 提取出整数部分后四位,进行分开的转换
Zheng = zheng.substring(len-4);
// 除去已经提取的字符串以外的字符串,字符串更新
zheng = zheng.substring(0, len-4);
int m =0,me=0;
// 把字符串转换成整形数,如 0012换成12
for(int j=3;j>=0;j--)
{
m =(int) ((Zheng.charAt(j)-48)*Math.pow(10, 3-j));
me += m;
}
// 把数字12装换成字符串12
Zheng = String.valueOf(me);
// 把字符串12换成 壹拾贰
sss = this.toStr(Zheng);
// 衔接上 元 等单位,再加上已经转换好的 汉字字符串 ,此处注意每组字符串间的顺序
sss += str4[i]+Re;
Re = sss;
}
return Re;
} // 主方法,输入金额,并将整数部分和小数部分联接
public static void main(String[] args) {
// TODO Auto-generated method stub
Rmb s = new Rmb();
System.out.println("请输入整数部分为十二位以内的金额:");
Scanner in = new Scanner(System.in);
double a = in.nextDouble();
System.out.println("人民币读法为:");
// 将整数部分的汉字字符串和小数部分的汉字字符串联接
System.out.println(s.zhengDivade(s.divadeZheng(a))+s.toStr1(s.divadeXiao(a)));
} }

java人民币读法转换的更多相关文章

  1. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  2. JSONObject.fromObject(map)(JSON与JAVA数据的转换)

    JSON与JAVA数据的转换(JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互.) 上一篇文章中有这么 ...

  3. FastReport调用Delphi中的人民币大写转换自定义函数

    FastReport调用Delphi中的人民币大写转换自定义函数   FastReport调用Delphi中的人民币大写转换自定义函数 function TJzpzEdit1.MoneyCn(mmje ...

  4. Java文件编码格式转换

    转自博文<Java文件编码格式转换>: 默认被转换的格式为GBK,转换成的格式为UTF-8 import info.monitorenter.cpdetector.CharsetPrint ...

  5. java 实现视频转换通用工具类:视频截图-Ffmpeg(四)

    java 实现视频转换通用工具类:获取视频元数据信息(一) java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) java 实现视频转换通用工具类:视频相互转换-Ffmpeg ...

  6. java 实现视频转换通用工具类:视频相互转换-Ffmpeg(三)

    java 实现视频转换通用工具类:获取视频元数据信息(一) java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) 这节主要是ffmpeg的相关方法封装,在实际调用中主要使用f ...

  7. java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二)

    1.自动判断格式并调用相应的转换工具,默认方法 /** * 自动判断格式并调用相应的转换工具,默认方法 * @param srcVideoPath * @param tarVideoPath * @r ...

  8. java 实现视频转换通用工具类:获取视频元数据信息(一)

    java 做视频转换主要用到开源的ffmpeg或者mencoder,还要有MP4Box. 注:由于平时都没有时间写博客,所以思路我就不写了,有问题问我,不一定马上回复. 详细介绍: ffmpeg:ht ...

  9. android112 jni 把java的字符串转换成c的字符串,数组处理

    package com.itheima.charencode; import android.os.Bundle; import android.app.Activity; import androi ...

随机推荐

  1. dojo级联步骤

    dojo级联步骤 1.数据请求回来后,检查数据格式是否满足下拉框的数据格式: 2.通过firebug进行调试,检查select下拉框子项结点是否取道: 3.查看API文档,保证改变store的方法是正 ...

  2. Netty的并发编程实践2:volatile的正确使用

    长久以来大家对于volatile如何正确使用有很多的争议,既便是一些经验丰富的Java设计师,对于volatile和多线程编程的认识仍然存在误区.其实,volatile的使用非常简单,只要理解了Jav ...

  3. Caused by: Unable to locate parent package [json-default] for [class com.you.user.action.StudentActi

    1.错误描述 信息: Choosing bean (struts) for (com.opensymphony.xwork2.util.TextParser) 2014-7-13 1:52:04 or ...

  4. xml字符串转为XmlDocument

    string xml = "<xml><logistics_express_get_respose><express_detail><company ...

  5. Docker 小记 — Compose & Swarm

    前言 任何相对完整的应用服务都不可能是由单一的程序来完成支持,计划使用 Docker 来部署的服务更是如此.大型服务需要进行拆分,形成微服务集群方能增强其稳定性和可维护性.本篇随笔将对 Docker ...

  6. 芝麻HTTP:PhantomJS的安装

    PhantomJS是一个无界面的.可脚本编程的WebKit浏览器引擎,它原生支持多种Web标准:DOM操作.CSS选择器.JSON.Canvas以及SVG. Selenium支持PhantomJS,这 ...

  7. 芝麻HTTP: Scrapy小技巧-MySQL存储

    这两天上班接手,别人留下来的爬虫发现一个很好玩的 SQL脚本拼接. 只要你的Scrapy Field字段名字和 数据库字段的名字 一样.那么恭喜你你就可以拷贝这段SQL拼接脚本.进行MySQL入库处理 ...

  8. Python中进程

    程序 程序:编写完的代码称为程序. 进程 进程:又称重量级进程,正在执行中的程序称为进程.进程的执行会占用内存等资源.多个进程同时执行时,每个进程的执行都需要由操作系统按一定的算法(RR调度.优先数调 ...

  9. java 二叉树

    public class BinaryTree { private Node root; /** * 内部类实现结点类,可提高安全性 */ private static class Node{ Nod ...

  10. 【BZOJ2599】Race(点分治)

    [BZOJ2599]Race(点分治) 题面 BZOJ权限题,洛谷 题解 好久没写过点分治了... 在ppl的帮助下终于想起来了 orz ppl 首先回忆一下怎么求有没有正好是\(K\)的路径 维护一 ...