论坛首页 入门技术论坛

数字人命币转换为大写

浏览 529 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2020-10-21  
package com.study;

/**
* @description 记得有次去面试的时候,被问到将数字转化为人命币大写的题目,刚开始看到题目的时候觉得很容易,但是越看越觉得没有头绪;
*              今天在看C#的例子的时候,发现有用C#实现的实例,闲来无事,用Java也实现一下; 整数部分支持16位到万亿,
*              小数部分支持4位到毫,共计20位;
* @author xtayhame date 2020年10月21日
*
* @addr:huanghuagang.guangzhou
*/
public class ChinesNumber {
static String[] HB_UPPER = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "扒", "玖" };
static String[] HB_JZ1 = { "仟", "佰", "拾", "" };
static String[] HB_JZ2 = { "", "万", "亿", "万亿" };
static String[] HB_JZ3 = { "角", "分", "厘", "毫" };

/**
* 将数字转换为大写
*
* @param val
* @return
*/
public static String toChinese(String money) {
String ret = "";
String[] monegArray = money.split("\\.");
String interGalNum = monegArray[0];
int unitLength = (interGalNum.length() + 3) / 4;

if (interGalNum.length() > 16) {
System.out.println("暂不支持超过16位整数的数字.");
return null;
}

String addStr = "";
String preStr = "";
for (int i = 0; i < unitLength; i++) {
String innerRet = "";
// 如果是第一次截取,可能是四位或者不够四位
if (i == 0) {
preStr = interGalNum.substring(addStr.length(), interGalNum.length() - (unitLength - 1) * 4);
} else {
// 从左到右分别获取四位数
preStr = interGalNum.substring(addStr.length(), addStr.length() + 4);
}

String newPreStr = "";
// 为方便处理,不足4位,补0
if (preStr.length() < 4) {
newPreStr = String.format("%04d", Integer.parseInt(preStr));
} else {
newPreStr = preStr;
}
String currUnit = HB_JZ2[unitLength - i - 1]; // 获取当前的HB_JZ2值
for (int j = 0; j < newPreStr.length(); j++) {
String num2 = String.valueOf(newPreStr.charAt(j));
if ("0".equals(num2)) {
continue;
}
innerRet = innerRet + HB_UPPER[Integer.parseInt(num2)] + HB_JZ1[j];
}
ret = ret + innerRet + " " + currUnit + " ";
addStr += preStr;
}

// 处理小数
if (monegArray.length == 2) {
String innerRet = "";
String decimalNum = monegArray[1];
// 小数最多只能是4位
if (decimalNum.length() > 4) {
decimalNum = decimalNum.substring(0, 4);
}

for (int i = 0; i < decimalNum.length(); i++) {
String num1 = String.valueOf(decimalNum.charAt(i));
innerRet = innerRet + HB_UPPER[Integer.parseInt(num1)] + HB_JZ3[i];
}
ret = ret + innerRet;
}

return ret;
}

public static void main(String[] args) {
String a = "1234567891234567.6789";
System.out.println(ChinesNumber.toChinese(a));
}
}
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics