62,616
社区成员
发帖
与我相关
我的任务
分享
import java.io.*;
public class Test {
public static void main(String[] args) {
String strNum="";
double dNum;
System.out.println("输入:");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
try{
strNum=br.readLine();
}catch(IOException e){}
dNum=Double.parseDouble(strNum);
System.out.println("四舍五入,精确到(分),转化成大写:");
System.out.println(changeToBig(dNum));
System.gc();
}
public static String changeToBig(double value) {
char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
char[] vunit = { '万', '亿' }; // 段名表示
char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
long midVal = (long) (value * 100+0.5); // 转化成整形,四舍五入
String valStr = String.valueOf(midVal); // 转化成字符串
String head = valStr.substring(0, valStr.length() - 2); // 取整数部分
String rail = valStr.substring(valStr.length() - 2); // 取小数部分
String prefix = ""; // 整数部分转化的结果
String suffix = ""; // 小数部分转化的结果
// 处理小数点后面的数
if (rail.equals("00")) { // 如果小数部分为0
suffix = "整";
} else {
suffix = digit[rail.charAt(0) - '0'] + "角"
+ digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来
}
// 处理小数点前面的数
char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组
boolean preZero = false; // 标志当前位的上一位是否为有效0位(如万位的0对千位无效)
byte zeroSerNum = 0; // 连续出现0的次数
for (int i = 0; i < chDig.length; i++) { // 循环处理每个数字
int idx = (chDig.length - i - 1) % 4; // 取段内位置
int vidx = (chDig.length - i - 1) / 4; // 取段位置
if (chDig[i] == '0') { // 如果当前字符是0
preZero = true;
zeroSerNum++; // 连续0次数递增
if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
prefix += vunit[vidx - 1];
preZero = false; // 不管上一位是否为0,置为无效0位
}
}
else {
zeroSerNum = 0; // 连续0次数清零
if (preZero) { // 上一位为有效0位
prefix += digit[0]; // 只有在这地方用到'零'
preZero = false;
}
prefix += digit[chDig[i] - '0']; // 转化该数字表示
if (idx > 0)
prefix += hunit[idx - 1];
if (idx == 0 && vidx > 0) {
prefix+=vunit[(vidx+1)%2];
for(int j=0;j<(vidx+1)/2-1;j++){
prefix+=vunit[1];
}
}
}
}
if (prefix.length() > 0)
prefix += '圆'; // 如果整数部分存在,则有圆的字样
return prefix + suffix; // 返回正确表示
}
}
/**
* 金额转换处理类,a.小写转大写;(b.大写转小写)
* <ul>
* <li>处理能力:</li>
* <li>a.整数部分:9999999999999999(16位长,仟万亿级)</li>
* <li>b.小数部分:3位(可扩展,单位?),多于3位舍去(不四舍五入)</li>
* <li>可无限扩展,方法:IUNIT后依次递加合适的单位,并处理0出现在关键位置</li>
* </ul>
* @author JIM
* @version 2.1
*/
public class CurrencyUtil {
/** 大写数字 */
private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
"柒", "捌", "玖" };
/** 整数部分的单位 */
private static final String[] IUNIT = { "元", "拾", "佰", "仟", "万", "拾", "佰",
"仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" };
/** 小数部分的单位 */
private static final String[] DUNIT = { "角", "分", "厘" };
/** 整数部分长度限制,仟万亿级 */
private static int LIMIT = 16;
/**
* 得到中文金额。
* @return 中文金额
*/
public static String toChinese(String str) {
// 去掉","
String number = getFormatNum(str);
// 不是金额,直接返回
if (!isMoney(number)) {
return number;
}
// 整数部分数字
String integerStr;
// 小数部分数字
String decimalStr;
// 初始化:格式数字;分离整数部分和小数部分;确定长度
if (number.indexOf(".") > 0) {
integerStr = number.substring(0, number.indexOf("."));
decimalStr = number.substring(number.indexOf(".") + 1);
} else if (number.indexOf(".") == 0) {
integerStr = "";
decimalStr = number.substring(1);
} else {
integerStr = number;
decimalStr = "";
}
// integerStr去掉首0,不必去掉decimalStr的尾0(超出部分舍去)
if (!integerStr.equals("")) {
integerStr = Long.toString(Long.parseLong(integerStr));
if (integerStr.equals("0")) {
integerStr = "";
}
}
// overflow超出处理能力,直接返回
if (integerStr.length() > LIMIT) {
System.out.println(number + ":超出处理能力");
return number;
}
// 整数部分数字
int[] integers = toArray(integerStr);
// 设置万单位
boolean isMust5 = isMust5(integerStr);
// 小数部分数字
int[] decimals = toArray(decimalStr);
// 返回大写金额
return getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);
}
/**
* 整数部分和小数部分转换为数组,从高位至低位
*/
private static int[] toArray(String number) {
int[] array = new int[number.length()];
for (int i = 0; i < number.length(); i++) {
array[i] = Integer.parseInt(number.substring(i, i + 1));
}
return array;
}
/**
* 得到中文金额的整数部分。
* @return 整数部分
*/
private static String getChineseInteger(int[] integers, boolean isMust5) {
StringBuffer chineseInteger = new StringBuffer("");
String key = "";
int length = integers.length;
// int lastNum = 1;
// int lengthOfZero = 0;
for (int ii = 0; ii < length; ii++) {
// 1234(万)5678(亿)9012(万)3456(元)
// 0出现在关键位置:元、万、亿、万亿、兆、万兆、亿兆、万亿兆
// 处理顺序:不限,只跟具体位置有关,不必从高位到低位
// 特殊情况:10(拾元、壹拾元、壹拾万元、拾万元)
if (integers[ii] == 0) {
// 万(亿)(必填)
if ((length - ii) == 13)
key = IUNIT[4];
// 亿(必填)
else if ((length - ii) == 9)
key = IUNIT[8];
// 万(不必填)
else if ((length - ii) == 5 && isMust5)
key = IUNIT[4];
// 元(必填)
else if ((length - ii) == 1)
key = IUNIT[0];
// 0遇非0时补零,不包含最后一位
if ((length - ii) > 1 && integers[ii + 1] != 0)
key += NUMBERS[0];
// 其余情况
else
key += "";
// if(ii==5) break;
}
chineseInteger.append(integers[ii] == 0 ? key
: (NUMBERS[integers[ii]] + IUNIT[length - ii - 1]));
key = "";
}
return chineseInteger.toString();
}
/**
* 得到中文金额的小数部分。
* @return 小数部分
*/
private static String getChineseDecimal(int[] decimals) {
StringBuffer chineseDecimal = new StringBuffer("");
for (int ii = 0; ii < decimals.length; ii++) {
// 舍去3位小数之后的
if (ii == 3)
break;
chineseDecimal.append(decimals[ii] == 0 ? ""
: (NUMBERS[decimals[ii]] + DUNIT[ii]));
}
return chineseDecimal.toString();
}
/**
* 格式化数字:去掉","。
* @param num 数字
* @return 格式化后的数字
*/
private static String getFormatNum(String number) {
return StringUtil.replace(number, ",", "");
}
/**
* 判断第5位数字的单位"万"是否应加。
* @return true是false否
*/
private static boolean isMust5(String integerStr) {
int length = integerStr.length();
if (length > 4) {
String subInteger = "";
if (length > 8) {
// 取得从低位数,第5到第8位的字串
subInteger = integerStr.substring(length - 8, length - 4);
} else {
subInteger = integerStr.substring(0, length - 4);
}
return Integer.parseInt(subInteger) > 0;
} else {
return false;
}
}
/**
* 判断金额字符串是否合法 不合法:a.包含多于一个".";b.包含"."、","和数字以外的字符;c.¥/$?。
* @return true是false否
*/
private static boolean isMoney(String number) {
try {
Double.parseDouble(number);
} catch (Exception ex) {
System.out.println(number + "不是合法金额");
return false;
}
return true;
}
public static void main(String[] args) {
String num = "1234567890123456.43";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "0.979";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "09999999999999999";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "10,001,000.09";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "01.107000";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "1.0778879";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "1,002,002,020,000,201.897675434";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "201000000";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
}
}