A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 画饼 中级黑马   /  2013-5-30 22:57  /  1442 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;
/* 金额转换,阿拉伯数字转换成中国传统形式。例如:101000001010  
*  转换为   壹仟零壹拾亿零壹仟零壹拾圆整
*/

本来是想如果连续是零就不输出,但是现在连续是1也不输出,还有其他大大小小的bug,请问怎么下手把他该的完美点呢
public class Text10 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                String str ="11111";
                //拿了字符串反转的类进行了一下反转
                STRcaozuo3 Sc =new STRcaozuo3();
                //反转之后再传进去
                String Sb =Sc.Str1(str);
                               
                Strzhuan.Zhuan(Sb);

        }

}
class Strzhuan{
        @SuppressWarnings("null")
        public static String Zhuan(String s){
                String [] Str =new String []{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
                String [] Str1 =new String[]{"","拾","佰","仟","万","拾万","佰万","仟万","亿","拾亿","佰亿","仟亿","万亿"};
                StringBuffer Strbf =new StringBuffer("");
                String Ss =null;
                String S1 =null;
                String oid =null;
               
                for(int i =(s.length()-1);i<s.length()&&i!=-1;i--){
                        //把拿到的字符转成相应的数字
                        char cr =s.charAt(i);
                       
                        int P =Character.getNumericValue(cr);
                       
                       
                        Ss = (Str[P]);
                        //为什么空指针 前面遇到一个空指针麻烦了。已解决
                        if(Ss!=oid){
                        Strbf.append(Ss);
                        }
                       
                        S1=Str1[i];
                        if(P!=0){
                                Strbf.append(S1);
                        }
                        oid =Ss;
                       
                       
                       
                }
                Strbf.append("圆整");
                String S3 =new String(Strbf);
                System.out.println(S3);
                return Ss;
        }
}
class STRcaozuo3{
        //字符串缓冲区,用来追加每次循环遍历出来的字符串
        StringBuffer Strbf =new StringBuffer();
        public  String Str1(String str){
                //从大的指标从下走,并且指标不为-1,把拿到的值装进去缓冲区
                for(int I=(str.length()-1);I<str.length()&&I>-1;I--){
                        Strbf.append(str.charAt(I));
                       
                }
                //再把处理好的数据装回String并返回
                String is =new String(Strbf);
                return is;
        }
}

3 个回复

倒序浏览
可以试着用枚举来解决!
回复 使用道具 举报
本帖最后由 hou604720966 于 2013-5-31 23:39 编辑

已经写好了,你看看行不行了
  1. /**
  2.          * 功能描述:人民币转成大写,支持到分
  3.          *
  4.          * @param str
  5.          *            数字字符串
  6.          * @return String 人民币转换成大写后的字符串
  7.          */
  8.         public static String hangeToBig(String str) {
  9.                 double value;
  10.                 try {
  11.                         value = Double.parseDouble(str.trim());//将字符串转换为double类型
  12.                 } catch (Exception e) {
  13.                         System.err.println("输入的人民币非法");
  14.                         return null;
  15.                 }
  16.                 char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
  17.                 char[] vunit = { '万', '亿' }; // 段名表示
  18.                 char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
  19.                 long midVal = (long) (value * 100); // 转化成整形
  20.                 String valStr = String.valueOf(midVal); // 转化成字符串

  21.                 String head = valStr.substring(0, valStr.length() - 2); // 取整数部分
  22.                 String rail = valStr.substring(valStr.length() - 2); // 取小数部分

  23.                 String prefix = ""; // 整数部分转化的结果
  24.                 String suffix = ""; // 小数部分转化的结果
  25.                 // 处理小数点后面的数
  26.                 if (rail.equals("00")) { // 如果小数部分为0
  27.                         suffix = "整";
  28.                 } else {
  29.                         suffix = digit[rail.charAt(0) - '0'] + "角"//通过ASCII码获取相应的值'0'的ASCII码为48
  30.                         + digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来
  31.                 }
  32.                 // 处理小数点前面的数
  33.                 char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组
  34.                 char zero = '0'; // 标志'0'表示出现过0
  35.                 byte zeroSerNum = 0; // 连续出现0的次数
  36.                 for (int i = 0; i < chDig.length; i++) { // 循环处理每个数字
  37.                         int idx = (chDig.length - i - 1) % 4; // 取段内位置     '拾', '佰', '仟'
  38.                         int vidx = (chDig.length - i - 1) / 4; // 取段位置       '万', '亿'
  39.                         if (chDig[i] == '0') { // 如果当前字符是0
  40.                                 zeroSerNum++; // 连续0次数递增
  41.                                 if (zero == '0') { // 标志
  42.                                         zero = digit[0];
  43.                                 }
  44.                                 if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
  45.                                         prefix += vunit[vidx - 1];
  46.                                         zero = '0';
  47.                                 }
  48.                                 continue;
  49.                         }
  50.                         zeroSerNum = 0; // 连续0次数清零
  51.                         if (zero != '0') { // 如果标志不为0,则加上,例如万,亿什么的
  52.                                 prefix += zero;
  53.                                 zero = '0';
  54.                         }
  55.                         prefix += digit[chDig[i] - '0']; // 转化该数字表示
  56.                         if (idx > 0)
  57.                                 prefix += hunit[idx - 1];
  58.                         if (idx == 0 && vidx > 0) {
  59.                                 prefix += vunit[vidx - 1]; // 段结束位置应该加上段名如万,亿
  60.                         }
  61.                 }
  62.                
  63.                 if (prefix.length() > 0)
  64.                         prefix += '圆'; // 如果整数部分存在,则有圆的字样
  65.                 return prefix + suffix; // 返回正确表示
  66.         }
复制代码
回复 使用道具 举报
如果问题已经解决,再次编辑,修改主题类型为已解决,方便大家查看
否则继续追问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马