首先把这个浮点数分成整数部分和小数部分。提取整数部分很容易,直接将这个浮点数强制类型转换成一个整数即可,这个整数就是浮点数的整数部分;再使用浮点数减去整数,就可以得到这个浮点数的小数部分。
然后分开处理整数部分和小数部分,其中对小数部分的处理比较简单,直接截断保留2位数字,转换成几角几分的字符串。对整数部分的处理则稍微复杂一点儿,但只要认真分析不难发现,中国的数字习惯是4位一节的,一个4位的数字可被转换成几千几百几十几,至于后面添加什么单位则不确定,如果这一节4位数字出现在1~4位,则后面添加单位“元”;如果这一节4位数字出现在5~8位,则后面添加单位“万元”;如果这一节4位数字出现在9~12位,则后面添加单位“亿元”;多于12位就暂不考虑了。
package com.xing.controller;
import java.util.Arrays;
public class RMB {
private String[] hanArr = {"零", "壹", "贰", "叁", "肆",
"伍", "陆", "柒", "捌", "玖"};
private String[] unitArr = {"元","十", "百", "千","万","十", "百",
"千","亿","十", "百", "千"};
private String[] XiaoUnitArr = {"角","分"};
/**
* 将一个浮点数分解成整数部分和小数部分
* @param num 需要被分解的浮点数
* @return 分解出来的整数部分和小数部分。第一个数组元素是整数部分,第二个数组元素是小数部分
*/
private String[] divide(double num)
{
// 将一个浮点数强制类型转换为long类型,即得到它的整数部分
var zheng = (long) num;
// 浮点数减去整数部分,得到小数部分,小数部分乘以100后再取整得到2位小数
var xiao = Math.round((num - zheng) * 100);
// 下面用了两种方法把整数转换为字符串
return new String[] {zheng + "", String.valueOf(xiao)};
}
/**
* 将一个4位的数字字符串变成汉字字符串
* @param numStr 需要被转换的4位的数字字符串
* @return 4位的数字字符串被转换成汉字字符串
*/
private String toHanStr(String[] numStr)
{
var result = "";
int numLen = numStr[0].length();
// 依次遍历数字字符串的每一位数字
for (var i = 0; i < numLen; i++)
{
// 把char类型的数字转换成int类型的数字。由于它们的ASCII码值恰好相差48
// 因此把char类型的数字减去48得到int类型的数字,例如,'4’被转换成4
var num = numStr[0].charAt(i) - 48;
// 如果数字不是0,则需要添加单位(千、百、十)
if ( num != 0)
{
result += hanArr[num] + unitArr[numLen -1- i];
}
}
for (int i = 0; i < 2; i++) {
var num = numStr[1].charAt(i) - 48;
result += hanArr[num] + XiaoUnitArr[i];
}
return result;
}
public static void main(String[] args)
{
var nr = new RMB();
String[] divide = nr.divide(236711125.123);
// 测试把一个浮点数分解成整数部分和小数部分
System.out.println(Arrays.toString(nr.divide(236711125.123)));
// 测试把一个4位的数字字符串变成汉字字符串
System.out.println(nr.toHanStr(divide));
}
}
测试结果: