数字转货币金钱中文大写

第一版

package com.demo;

/**
 * @author Administrator
 * @date 2018/11/29 22:46
 */
public class NumToChinese {

	private String[] suffixArr = new String[]{"", "拾", "佰", "仟", "万", "拾万", "佰万", "仟万", "亿", "拾亿", "佰亿", "仟亿"};
	private String[] prefixArr = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

	private String operateNum(int num) {
		String value = String.valueOf(num);
		StringBuilder result = new StringBuilder();
		for (int i = 0; i < value.length(); i++) {
			result.append(prefixArr[(int) value.charAt(i) - 48]);
			result.append(suffixArr[value.length() - 1 - i]);
		}
		return result.toString();
	}

	public static void main(String[] args) {
		System.out.println(new NumToChinese().operateNum(12345));
	}
}

输出结果

壹万贰仟叁佰肆拾伍

缺点:

1.不支持小数

2.如果末尾为小数,则会出现零

3.如果连续两个零,会出现零零等

 

第二版

更新功能:1.支持小数的输入2.支持连续两个零的输入3.对小数点后的连续零不做过滤

package com.demo;

/**
 * @author Administrator
 * @date 2018/11/29 22:46
 */
public class NumToChinese {

	private String[] suffixArr = new String[]{"", "拾", "佰", "仟", "万", "拾万", "佰", "仟", "亿", "拾", "佰", "仟"};
	private String[] prefixArr = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

	private String operateNum(double num) {
		String value = String.valueOf(num);
		String prefixValue = value.split("\\.")[0];
		String suffixValue = value.contains(".") ? value.split("\\.")[1] : "";

		StringBuilder result = new StringBuilder();
		//计算小数前后的数字变大写
		for (int i = 0; i < prefixValue.length(); i++) {
			result.append(prefixArr[(int) prefixValue.charAt(i) - 48]);
			result.append(suffixArr[prefixValue.length() - 1 - i]);
		}

		result = new StringBuilder(result.toString().replaceAll("零.?零.?", "零"));
		//计算小数点后的数字变大写
		for (int i = 0; i < suffixValue.length(); i++) {
			if (i == 0) {
				result.append("点");
			}
			result.append(prefixArr[(int) suffixValue.charAt(i) - 48]);
		}

		return result.toString();
	}

	public static void main(String[] args) {
		System.out.println(new NumToChinese().operateNum(1200345.001));
	}
}

输出结果

壹佰贰拾万零叁佰肆拾伍点零零壹

缺点:1.对于两个以上的零则还无法过滤2.double如果数字过大,会自动转为科学计数法,造成下标溢出

第三版

更新功能:1.支持多个零的过滤2.Java中输入数字会造成精度丢失,因此采用输入前缀与后缀进行判别

package com.demo;

import java.math.BigDecimal;

/**
 * @author Administrator
 * @date 2018/11/29 22:46
 */
public class NumToChinese {

	private String[] suffixArr = new String[]{"", "拾", "佰", "仟", "万", "拾万", "佰", "仟", "亿", "拾", "佰", "仟"};
	private String[] prefixArr = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

	
	private String operateNum(long prefix, long suffix) {
		String prefixValue = String.valueOf(prefix);
		String suffixValue = String.valueOf(suffix);

		String result = "";
		//计算小数前后的数字变大写
		for (int i = 0; i < prefixValue.length(); i++) {
			result += prefixArr[(int) prefixValue.charAt(i) - 48];
			result += suffixArr[prefixValue.length() - 1 - i];
		}

		result = result.replaceAll("零.?零.?(零.?)*", "零");
		//计算小数点后的数字变大写
		for (int i = 0; i < suffixValue.length(); i++) {
			if (i == 0) {
				result += "点";
			}
			result += prefixArr[(int) suffixValue.charAt(i) - 48];
		}

		return result;
	}

	public static void main(String[] args) {
		System.out.println(new NumToChinese().operateNum(120000045,12345));
	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值