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

本文介绍如何用Java将浮点数转换成人民币读法的字符串。算法处理数值整数部分最多12位,提取整数和小数部分,小数部分简单转换,整数部分通过4位一节进行处理,结合单位如‘元’、‘万’、‘亿’。处理过程中涉及不同位置的0和非0数字的转换规则,以及连续多个0的特殊情况。文章提供了一个完整的处理整数部分的算法流程,并附带源代码。
摘要由CSDN通过智能技术生成

       在这里,首先声明一点:以下算法处理的数值整数部分最多为12位(也就是最多可以读到“几千亿”,如果需要扩展"万亿",只需在此基础上做小的更改即可,原理是一样的'),同时,输入数值默认大于0。

 

       首先,自已实现这个函数的大方面的思路是:首先把这个浮点数分成整数部分和小数部分。提取整数部分很容易,直接将这个浮点数强制类型转换成一个整数即可,这个整数就是浮点数的整数部分;再使用浮点数减去整数就可以得到这个浮点数的小数部分。

       

       接下来,分开处理整数部分和小数部分。小数部分的处理很简单,直接将小数截断到保留2位数字,转换成几角几分的字符串即可:

       例如:小数部分为0.783,截断后(关于这里是否四舍五入的问题,则可以看具体要求了,一点点的差别罢了)为0.78,直接将“7”、“8”转换成人民币读法,然后分别在后面加上“角”和“分”即可。

 

       重点和难点在于整数部分,这部分处理则稍微复杂一点:比如整数部分长度不一的问题;加单位“亿、万”的问题;中间一个零的问题;最后一个零的问题;中间连续多个零的问题;末尾多个零的问题等等。但静下心来分析不难发现:中国的数字习惯是4位一节的,一个4位的数字可被转成几千几百几十几(在这里还是一般情况,未考虑0的情况,不急,后面慢慢解决,考虑的是大的方向),至于后面添加什么单位则不确定,如果这节4位数字出现在1~4位(但且从最低位开始算起),则后面添加单位元;如果这节4位数字出现在5~8位,则后面添加单位万;如果这节4位数字出现在9~12位,则后面添加单位亿;多于12位这里暂不考虑。

 

       这里,设想已经输入一个浮点数,并且已成功地取得了它的整数部分(由于把该浮点数强制转换成long类型值作为整数部分后,浮点数最高位的0是自动消除的,所以整数部分的处理不必考虑最高位存在若干0的问题)和小数部分,并且均赋给了long类型的变量(这里先不考虑整数部分等于0的情形,程序中单独处理)。

 

       然后,把代表整数部分的long类型变量转换成String类型,取得该String的长度len,接下来就是遍历这个字符串了(一层for循环)。那么,对于正在处理的第i个字符,就存在很多问题值得思考了。下面列出在循环里可能遇到的情况和相应的解决方法:

 

       Q1:要问自已的第一个问题是:这个字符是属于1~4位、或者5~8位呢,还是处于9~12位呢?在这里,假设1~4位是第0段,5~8位是第1段,9~12位是第2段。这里我是这样解决这个问题的,利用(len - i - 1) / 4来计算该字符属于哪一段(本人在下面已经测试过,不信的人可以自已在草稿上测试)。

       Q2:确定了当前字符属于哪一段之后,那么,在该段内部,考虑到一个字符在段的不同位置需要不同处理的问题(比如:处于某段最后一位的

以下是一个可能的实现: ```python def number_to_chinese(num): # 数字到中文的映射 chinese_num = { 0: '零', 1: '壹', 2: '贰', 3: '叁', 4: '肆', 5: '伍', 6: '陆', 7: '柒', 8: '捌', 9: '玖' } # 单位到中文的映射 chinese_unit = { 0: '', 1: '拾', 2: '佰', 3: '仟', 4: '万', 8: '亿' } # 将浮点数分成整数和小数两部分 integer_part, decimal_part = str(num).split('.') integer_part = int(integer_part) # 将整数部分转换成中文 integer_str = str(integer_part) integer_len = len(integer_str) chinese_str = '' zero_flag = False # 是否需要在连续的零后面添加一个零 for i, digit in enumerate(integer_str): # 处理整数位上的数字 chinese_str += chinese_num[int(digit)] # 添加数字对应的单位 if (integer_len - i - 1) in chinese_unit: chinese_str += chinese_unit[integer_len - i - 1] # 添加万和亿的单位 if (integer_len - i - 1) % 4 == 0: chinese_str += chinese_unit[integer_len - i - 1] # 处理连续的零 if digit == '0': zero_flag = True else: if zero_flag: chinese_str += chinese_num[0] zero_flag = False # 处理小数部分 if decimal_part: chinese_str += '点' for digit in decimal_part: chinese_str += chinese_num[int(digit)] return chinese_str + '元' def currency_to_chinese(num): # 将浮点数转换成字符串形式 num_str = '%.2f' % num # 处理负数 if num_str[0] == '-': return '负' + currency_to_chinese(abs(num)) # 处理整数和小数部分 integer_part, decimal_part = num_str.split('.') # 处理整数部分 chinese_str = number_to_chinese(integer_part) # 处理小数部分 if decimal_part == '00': chinese_str += '整' else: chinese_str += number_to_chinese(decimal_part) + '分' return chinese_str print(currency_to_chinese(123456789.99)) # 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元玖角玖分 print(currency_to_chinese(-123.45)) # 负壹佰贰拾叁元肆角伍分 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值