读书人

金额转换,该怎么解决

发布时间: 2012-09-17 12:06:51 作者: rapoo

金额转换
小弟刚学Java,请教大哥大姐们一个问题:阿拉伯数字转换成中国传统的形式如:(¥1011)—>(一千零佰一拾一元整)输出。提示:输入时只输入数字,输出中国传统形式的字符串。

[解决办法]
zi ji yan jiu ba


Java code
public class Reader {  private String strNum;  private String strNumChFormat;  private String strNumTemp;  private int intNumLen;  private String strBegin;  public Reader(String strNum) {    this.strNum = strNum;  }  public boolean check(String strNum) {    boolean valid = false;        if (strNum.substring(0,1).equals("0")){     this.strNum = strNum.substring(1);    }    try {      new Double(strNum);      valid = true;    }    catch (NumberFormatException ex) {      System.out.println("Bad number format!");    }    return valid;  }  public void init() {    strNumChFormat = "";    intNumLen = strNum.length();    strNumTemp = strNum;    strNumTemp = strNumTemp.replace('1', '一');    strNumTemp = strNumTemp.replace('2', '二');    strNumTemp = strNumTemp.replace('3', '三');    strNumTemp = strNumTemp.replace('4', '四');    strNumTemp = strNumTemp.replace('5', '五');    strNumTemp = strNumTemp.replace('6', '六');    strNumTemp = strNumTemp.replace('7', '七');    strNumTemp = strNumTemp.replace('8', '八');    strNumTemp = strNumTemp.replace('9', '九');    strNumTemp = strNumTemp.replace('0', '零');    strNumTemp = strNumTemp.replace('.', '点');    strBegin = strNumTemp.substring(0, 1);  }  public String readNum() {    if (check(strNum)) {      init();      try {        for (int i = 1, j = 1, k = 1; i < intNumLen; i++) {          if (strNumTemp.charAt(intNumLen - 1) == '零' && i == 1) {            strNumChFormat = "位";          }          else if (strNumTemp.charAt(intNumLen - i) == '零' && j == 1) {            strNumChFormat = "位" + strNumChFormat;          }          else if (strNumTemp.charAt(intNumLen - i) == '点') {            j = 1;            k = 1;            strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;            continue;          }          else {            strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;          }          if (strNumTemp.charAt(intNumLen - i - 1) != '位' &&              strNumTemp.charAt(intNumLen - i - 1) != '零') {            if (j == 1 && i < intNumLen) {              strNumChFormat = '拾' + strNumChFormat;            }            else if (j == 2 && i < intNumLen) {              strNumChFormat = '百' + strNumChFormat;            }            else if (j == 3 && i < intNumLen) {              strNumChFormat = '千' + strNumChFormat;            }          }          if (j == 4 && i < intNumLen) {            j = 0;          }          if (k == 4 && i < intNumLen) {            strNumChFormat = '万' + strNumChFormat;          }          else if (k == 8 && i < intNumLen) {            k = 0;            strNumChFormat = '亿' + strNumChFormat;          }          j++;          k++;        }        while (strNumChFormat.indexOf("位") != -1) {          strNumChFormat = strNumChFormat.replaceAll("位", " ");        }        if (strNumChFormat.substring(0, 2) == "一拾") {          strNumChFormat = strNumChFormat.substring(1, strNumChFormat.length());        }        if (strNumChFormat.indexOf("点") >= 0) {          String rebegin = strNumChFormat.substring(0,              strNumChFormat.indexOf("点"));          String relast = strNumChFormat.substring(strNumChFormat.indexOf("点"),              strNumChFormat.length());          for (int i = 1; i <= relast.length(); i++) {            relast = relast.replaceAll("拾", "");            relast = relast.replaceAll("百", "");            relast = relast.replaceAll("千", "");            relast = relast.replaceAll("万", "");            relast = relast.replaceAll("亿", "");          }          strNumChFormat = rebegin + relast;        }      }      catch (ArrayIndexOutOfBoundsException ex) {        ex.printStackTrace();      }      catch (Exception ex) {        ex.printStackTrace();      }      int off = strNumChFormat.indexOf("点");      strNumChFormat = strBegin + strNumChFormat.substring(0);    }    else {      strNumChFormat = "";    }    return strNumChFormat;  }  public static void main(String args[]) {    try {      String number = args[0].toString();      System.out.println("The number is: " + number);      Reader reader = new Reader(number);      System.out.println("Output String: " + reader.readNum());    }    catch (Exception ex) {      System.out.println("Please input like that: javac Reader <number>");    }  }} 


[解决办法]

Java code
/** * 念10万以内的任意数字。例如534念作伍佰叁十肆, * 203念作贰佰零叁。7003念作柒千零叁。 */public class Exec5 {    public static void main(String[] args) {        int n = 10;                //拆分数字        /*         * 个位数字放在数组的末尾,         *    十位数字放在倒数第二个,依次类推         */        int[] number = new int[10];        int num = 0;  //拆出的数字个数        int len = number.length;        int temp = n;        while(temp > 0){            //存储拆分出的数字            number[len - 1 - num] = temp % 10;            num++;            temp /= 10; //去掉个位数字        }                //转换为大写        char[] upper = {'零','壹',                '贰','叁','肆','伍','陆','柒','捌','玖'        };        char[] right = {' ','拾','佰','千','万'};                String s = "";        boolean b = false;        for(int i = len - num;i < len;i++){            if(number[i] == 0){                b = true;            }else{                if(b){                    s = s + "零";                    b = false;                }                s = s + upper[number[i]] +                     right[len - i - 1];            }                    }                System.out.println(s);    }}
[解决办法]
package NumToRMB;

public class Class1 {
public static String ConvertNumberToChinese(String x, String[] Nums, String[] Digits, String[] Units)
{
String S = ""; //返回值
int p = 0; //字符位置指针
int m = x.length() % 4; //取模

// 四位一组得到组数
int k = (m > 0 ? x.length() / 4 + 1 : x.length() / 4);

// 外层循环在所有组中循环
// 从左到右 高位到低位 四位一组 逐组处理
// 每组最后加上一个单位: "[万亿]","[亿]","[万]"
for (int i = k; i > 0; i--)
{
int L = 4;
if (i == k && m != 0)
{
L = m;
}
// 得到一组四位数 最高位组有可能不足四位
String s = x.substring(p, p + L);
int l = s.length();

// 内层循环在该组中的每一位数上循环 从左到右 高位到低位
for (int j = 0; j < l; j++)
{
//处理改组中的每一位数加上所在位: "仟","佰","拾",""(个)
int n = java.lang.Integer.parseInt(s.substring(j, j+1));
if (n == 0)
{
if ((j < l - 1)
&& (java.lang.Integer.parseInt(s.substring(j + 1, j + 1+ 1)) > 0) //后一位(右低)
&& !S.endsWith(Nums[n]))
{
S += Nums[n];
}
}
else
{
//处理 1013 一千零"十三", 1113 一千一百"一十三"
if (!(n == 1 && (S.endsWith(Nums[0]) | S.length() == 0) && j == l - 2))
{
S += Nums[n];
}
S += Digits[l - j - 1];
}
}
p += L;
// 每组最后加上一个单位: [万],[亿] 等
if (i < k) //不是最高位的一组
{
if (java.lang.Integer.parseInt(s) != 0)
{
//如果所有 4 位不全是 0 则加上单位 [万],[亿] 等
S += Units[i - 1];
}
}
else


{
//处理最高位的一组,最后必须加上单位
S += Units[i - 1];
}
}
return S;
}

// 测试程序
public static void main(String[] args) throws Exception
{
//数字 数组
String[] Nums = new String[] {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
//位 数组
String[] Digits = new String[] {"", "拾", "佰", "仟"};
//单位 数组
String[] Units = new String[] {"", "[万]", "[亿]", "[万亿]"};

System.out.println(ConvertNumberToChinese("111112100113", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("1100000000", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("1000000000", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("40000000013", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("40000000001", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("400000010000", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("40101031013", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("40101031113", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("101140101031013", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("100000001000013", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("100000001000113", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("100011003", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("10010103", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("10110013", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("130000", Nums, Digits, Units));

//System.in.read();
}

}

读书人网 >J2SE开发

热点推荐