题目:读入一个浮点数值,将其转换为中文金额的大写形式.如123.45,转化为壹佰贰拾叁元肆角伍分.编写程序,针对一下情况完善.
1.当金额为整数时,只表示整数部分,省略小数部分.并添加“整”字.如123,转化为壹佰贰拾叁元整.
2.当金额中含有连续的0时,只需输出一个零.如10005表示为壹万零伍元整
高手给个简单点的思路啊.还有可能碰到的问题给出点提示.先谢谢了.
//中文数字字符数组
straChineseNumber = new String[] {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
/**
* Description 将数字金额转换为中文金额
* @param <p>BigDecimal bigdMoneyNumber 转换前的数字金额
* @return String
调用:myToChineseCurrency("101.89")="壹佰零壹圆捌角玖分"
myToChineseCurrency("100.89")="壹佰零捌角玖分"
myToChineseCurrency("100")="壹佰圆整"
*/
public String DoNumberCurrencyToChineseCurrency(BigDecimal bigdMoneyNumber) {
String strChineseCurrency = "";
//零数位标记
boolean bZero = true;
//中文金额单位下标
int ChineseUnitIndex = 0;
DoPrintMessage("Calling Method DoNumberCurrencyToChineseCurrency");
try {
if (bigdMoneyNumber.intValue() == 0)
return "零圆整";
//处理小数部分,四舍五入
double doubMoneyNumber = Math.round(bigdMoneyNumber.doubleValue() * 100);
//是否负数
boolean bNegative = doubMoneyNumber < 0;
//取绝对值
doubMoneyNumber = Math.abs(doubMoneyNumber);
//循环处理转换操作
while (doubMoneyNumber > 0) {
//整的处理(无小数位)
if (ChineseUnitIndex == 2 && strChineseCurrency.length() == 0)
strChineseCurrency = strChineseCurrency + "整";
//非零数位的处理
if (doubMoneyNumber % 10 > 0) {
strChineseCurrency = straChineseNumber[(int)doubMoneyNumber % 10] + straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
bZero = false;
}
//零数位的处理
else {
//元的处理(个位)
if (ChineseUnitIndex == 2 ) {
//段中有数字
if (doubMoneyNumber > 0) {
strChineseCurrency = straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
bZero = true;
}
}
//万、亿数位的处理
else if (ChineseUnitIndex == 6 || ChineseUnitIndex == 10) {
//段中有数字
if (doubMoneyNumber % 1000 > 0)
strChineseCurrency = straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
}
//前一数位非零的处理
if (!bZero)
strChineseCurrency = straChineseNumber[0] + strChineseCurrency;
bZero = true;
}
doubMoneyNumber = Math.floor(doubMoneyNumber / 10);
ChineseUnitIndex ++;
}
//负数的处理
if (bNegative)
strChineseCurrency = "负" + strChineseCurrency;
}
catch (Exception e) {
DoPrintMessage("Exception Reason : Call Method DoNumberCurrencyToChineseCurrency Error");
DoPrintMessage("Exception Message : " + e.getMessage());
e.printStackTrace();
return "";
}
return strChineseCurrency;
}
第一个类,用于测试的
package org.esun.test;
import org.esun.pojo.MyRead;
public class Test1 {//本类用于测试
public static void main(String[] args) {
new MyRead().copy();
}
}
第二个,用来读取数据的
package org.esun.pojo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class MyRead {//本类用来读数据
public void copy(){
BufferedReader br=null;
try {
br=new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入金额:");
String s=br.readLine();
if (Yz.checking(s)) {
new Money().transform(s);
}else {
System.out.print("您输入的金额不正确,请重新输入");
this.copy2();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void copy2(){
BufferedReader br=null;
try {
br=new BufferedReader(new InputStreamReader(System.in));
System.out.print(":");
String s=br.readLine();
if (Yz.checking(s)) {
new Money().transform(s);
}else {
System.out.print("您输入的金额不正确,请重新输入");
this.copy2();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
第三个,用来判断输入的数字合法性的
package org.esun.pojo;
public class Yz {//本类用于验证数字合法性
public static boolean checking(String s){
if (s.matches("[0-9]{1,12}(\\.([0-9]{1,2}))?")) {
return true;
}else {
return false;
}
}
}
最后一个,用来拼接中文的
package org.esun.pojo;
public class Money {//本类用于金额转换
String[] zw={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾"};
String result="";
void transform(String q){
String[] srr=q.split("\\.");
String s=srr[0];
while (s.length()<12) {
s="0"+s;
}
String s1=s.substring(0, 4);
String s2=s.substring(4, 8);
String s3=s.substring(8);
if (!s1.equals("0000")) {
this.pingjie1(s1);
result+="亿";
}
if (!s2.equals("0000")) {
this.pingjie1(s2);
result+="万";
}
if (!s3.equals("0000")) {
this.pingjie1(s3);
result+="元";
} else {
result+="元";
}
if (srr.length>1) {
String s4=srr[1];
while (s4.length()<2) {
s4=s4+"0";
}
this.pingjie2(s4);
}else {
result+="整";
}
if ('零'==result.charAt(0)) {
System.out.println("金额为:"+result.substring(1));
}else {
System.out.println("金额为:"+result);
}
}
void pingjie1(String s){//此方法用于拼接元
int n=Integer.parseInt(s);
if ((Integer.parseInt(s.charAt(0)+"")!=0)) {
result+=zw[n/1000]+"仟";
}
if ((Integer.parseInt(s.charAt(0)+"")==0)&&(Integer.parseInt(s.charAt(1)+"")!=0)) {
result+=zw[0];
}
if ((Integer.parseInt(s.charAt(1)+"")!=0)) {
result+=zw[n/100%10]+"佰";
}
if ((Integer.parseInt(s.charAt(1)+"")==0)&&((Integer.parseInt(s.charAt(2)+"")!=0)||(Integer.parseInt(s.charAt(3)+"")!=0))) {
result+=zw[0];
}
if ((Integer.parseInt(s.charAt(2)+"")!=0)) {
result+=zw[n/10%10]+"拾";
}
if ((Integer.parseInt(s.charAt(2)+"")==0)&&(Integer.parseInt(s.charAt(3)+"")!=0)&&(Integer.parseInt(s.charAt(1)+"")!=0)) {
result+=zw[0];
}
if ((Integer.parseInt(s.charAt(3)+"")!=0)) {
result+=zw[Integer.parseInt(s.charAt(3)+"")];
}
}
void pingjie2(String s){//此方法用于拼接角和分
int n=Integer.parseInt(s);
if (Integer.parseInt(s.charAt(0)+"")!=0) {
result+=zw[n/10]+"角";
}
if ((Integer.parseInt(s.charAt(0)+"")==0)&&(Integer.parseInt(s.charAt(1)+"")!=0)) {
result+=zw[0]+zw[Integer.parseInt(s.charAt(1)+"")]+"分";
}
if ((Integer.parseInt(s.charAt(0)+"")!=0)&&(Integer.parseInt(s.charAt(1)+"")!=0)) {
result+=zw[Integer.parseInt(s.charAt(1)+"")]+"分";
}
}
}
整数部分:9999999999999999(16位长,仟万亿)
小数部分:3位,多于3位舍去(不做四舍五入)
运行结果:
1.23 壹元贰角叁分
1234567890123456.123 壹仟贰佰叁拾肆万伍仟陆佰柒拾捌亿玖仟零壹拾贰万叁仟肆佰伍拾陆元壹角贰分叁厘
0.0798 柒分玖厘
10,001,000.09 壹仟万零壹仟元玖分
01.107700 壹元壹角柒厘
public class MoneyUtil {
/** 大写数字 */
private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
"柒", "捌", "玖" };
/** 整数部分的单位 */
private static final String[] IUNIT = { "元", "拾", "佰", "仟", "万", "拾", "佰",
"仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" };
/** 小数部分的单位 */
private static final String[] DUNIT = { "角", "分", "厘" };
/**
* 得到大写金额。
*/
public static String toChinese(String str) {
str = str.replaceAll(",", "");// 去掉","
String integerStr;// 整数部分数字
String decimalStr;// 小数部分数字
// 初始化:分离整数部分和小数部分
if (str.indexOf(".") > 0) {
integerStr = str.substring(0, str.indexOf("."));
decimalStr = str.substring(str.indexOf(".") + 1);
} else if (str.indexOf(".") == 0) {
integerStr = "";
decimalStr = str.substring(1);
} else {
integerStr = str;
decimalStr = "";
}
第二个需求可以设置一个布尔型标志,初始化为false,当遇到0时,标志置为true,然后再遇到0则忽略,直到遇到非0,则标志置为false,同时添加一个“零”。