题目:要求从键盘输入一数字,然后中文输出(要符合中文语法)
例:12434   输出 一万二千四百三十四

解决方案 »

  1.   

    String num = "零壹贰叁肆伍陆柒捌玖";
        String dw = "圆拾佰仟万亿";
        String m = "30020.23";
        String mm[] = null;
        mm = m.split("\\.");
        String money = mm[0];    String result = num.charAt(Integer.parseInt("" + mm[1].charAt(0))) + "角" +
            num.charAt(Integer.parseInt("" + mm[1].charAt(1))) + "分";    for (int i = 0; i < money.length(); i++) {
          String str = "";
          int n = Integer.parseInt(money.substring(money.length() - i - 1,
                                                   money.length() - i));
          str = str + num.charAt(n);
          if (i == 0) {
            str = str + dw.charAt(i);
          }
          else if ( (i + 4) % 8 == 0) {
            str = str + dw.charAt(4);
          }
          else if (i % 8 == 0) {
            str = str + dw.charAt(5);
          }
          else {
            str = str + dw.charAt(i % 4);
          }
          result = str + result;
        }
        result = result.replaceAll("零([^圆]{1})", "零");
        result = result.replaceAll("零+", "零");
        result = result.replaceAll("零圆", "圆");
        System.out.println(result);
      

  2.   

    第一我是一楼
    第二这是我以前写的代码
       你的要求比我的简单,所以看明白我的思路,写你那个就更容易了,只需要把小数位去掉,把"圆"字去掉,然后把先面的变一下就OK了
        String num = "零壹贰叁肆伍陆柒捌玖";
        String dw = "圆拾佰仟万亿";    String num = "一二三四五六七八九";
        String dw = "十百千万亿";写代码要去学别人的思路思想,而不是看结果!要学会举一反三!
      

  3.   

    lip009(深蓝忧郁) ( ) 信誉:100    Blog 
    说的好,善于学习!
      

  4.   

    我的写法 混乱了些    public static String integerToChineseString(int valueIn)
        {
            char[] v = new char[] { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
            char[] d = new char[] { ' ', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾' };
            char n = '负';
            if (valueIn == 0)
            {
                return String.valueOf(v[0]);
            }
            long value = valueIn;
            String str = "";
            if (value < 0)
            {
                str += n;
                value = Math.abs(value);
            }
            for (int i = (int)Math.log10(value); i >= 0; i--)
            {
                int val = (int)(value % Math.pow(10, i + 1) / Math.pow(10, i));
                if (val == 0 && i != 0 && ((int)(value % Math.pow(10, i) / Math.pow(10, i - 1))) == 0
                    && i % 4 != 0)
                {
                    continue;
                }
                str += (((val == 0 && i % 4 == 0) || (i == (int)Math.log10(value) && val == 1 && i % 4 == 1)) ? ""
                    : v[val])
                    + ""
                    + ((val == 0 && i % 4 != 0)
                        || (i % 4 == 0 && (((int)(value % Math.pow(10, i + 4) / Math.pow(10, i))) == 0)) ? ""
                        : d[i])
                    + ((i % 4 == 0 && (((int)(value % Math.pow(10, i + 4) / Math.pow(10, i))) == 0)) ? String.valueOf(v[0])
                        : "");
            }
            return str.trim();
        }
      

  5.   

    深蓝兄的几个replaceAll()和正则表达式用的漂亮 :)
      

  6.   

    突然发现替换有点问题,改下:
        result = result.replaceAll("零([^亿圆])", "零");
        result = result.replaceAll("零+", "零");
        result = result.replaceAll("零[亿圆]", "$1");
      

  7.   

    汗自己一个,又漏掉东西了:
        result = result.replaceAll("零([^亿圆])", "零");
        result = result.replaceAll("零+", "零");
        result = result.replaceAll("零([亿圆])", "$1");
      

  8.   

    我的那段修改了一下
                str += (((val == 0 && i % 4 == 0 && (((int)(value % Math.pow(10, i + 4) / Math.pow(10,
                    i))) != 0)) || (i == (int)Math.log10(value) && val == 1 && i % 4 == 1)) ? ""
                    : v[val])
                    + ""
                    + ((val == 0 && i % 4 != 0)
                        || (i % 4 == 0 && (((int)(value % Math.pow(10, i + 4) / Math.pow(10, i))) == 0)) ? ""
                        : d[i]);
    深蓝兄 我用1000000020.23测试你的方法 还是有点问题的 
      

  9.   

    to:alabaza(在我带他去面试之前,我给他的代码补上注释。因为写注) ( ) 信誉:100    Blog 
     在上面已经给出正确的了,往上看看:
          result = result.replaceAll("零([^亿圆])", "零");
        result = result.replaceAll("零+", "零");
        result = result.replaceAll("零([亿圆])", "$1");
      

  10.   

    to: lip009(深蓝忧郁) 拾亿零贰佰万壹仟零贰拾
    壹拾亿零贰佰零壹仟零贰拾圆贰角叁分少了个万字啊 :)
      

  11.   

    接一楼的程序,帮你改了一下,顺便自己也学习了一下
    public static String tochinessupper(String number)
    {
    String num = "零壹贰叁肆伍陆柒捌玖";
        String dw = "圆拾佰仟万亿";
        String m = number;
        String mm[] = null;
        String money=null;
        String result=null;
        if(m.indexOf(".")!=-1)
        {
         mm = m.split("\\.");
        money = mm[0];
        result = num.charAt(Integer.parseInt("" + mm[1].charAt(0))) + "角" +num.charAt(Integer.parseInt("" + mm[1].charAt(1))) + "分";
        }
        else
        {
         money=m;
         result="";
        }
        
        for (int i = 0; i < money.length(); i++) 
        {
          String str = "";
          int n = Integer.parseInt(money.substring(money.length() - i - 1,money.length() - i));
          str = str + num.charAt(n);
          if (i == 0) 
          {
            str = str + dw.charAt(i);
          }
          else if ( (i + 4) % 8 == 0) 
          {
            str = str + dw.charAt(4);
          }
          else if (i % 8 == 0) 
          {
            str = str + dw.charAt(5);
          }
          else 
          {
            str = str + dw.charAt(i % 4);
          }
          result = str + result;
        }
        result = result.replaceAll("零([^圆]{1})", "零");
        result = result.replaceAll("零+", "零");
        result = result.replaceAll("零圆", "圆");
        return result;
    }
      

  12.   

    还有BUG,再改下:
    String num = "零壹贰叁肆伍陆柒捌玖";
        String dw = "圆拾佰仟万亿";
        String m = "30020.23";
        String mm[] = null;
        mm = m.split("\\.");
        String money = mm[0];    String result = num.charAt(Integer.parseInt("" + mm[1].charAt(0))) + "角" +
            num.charAt(Integer.parseInt("" + mm[1].charAt(1))) + "分";    for (int i = 0; i < money.length(); i++) {
          String str = "";
          int n = Integer.parseInt(money.substring(money.length() - i - 1,
                                                   money.length() - i));
          str = str + num.charAt(n);
          if (i == 0) {
            str = str + dw.charAt(i);
          }
          else if ( (i + 4) % 8 == 0) {
            str = str + dw.charAt(4);
          }
          else if (i % 8 == 0) {
            str = str + dw.charAt(5);
          }
          else {
            str = str + dw.charAt(i % 4);
          }
          result = str + result;
        }    result = result.replaceAll("零([^亿万圆])", "零");
        result = result.replaceAll("亿零+万","亿零");
        result = result.replaceAll("零+", "零");
        result = result.replaceAll("零([亿万圆])", "$1");
        result =result.replaceAll("^壹拾","拾");    System.out.println(result);
      

  13.   

    再改替换:
        result = result.replaceAll("零([^亿万圆角分])", "零");
        result = result.replaceAll("亿零+万","亿零");
        result = result.replaceAll("零+", "零");
        result = result.replaceAll("零([亿万圆])", "$1");
        result =result.replaceAll("壹拾","拾");
      

  14.   

    我觉得这样更好,简单明了。(小数点没算,题目上没有说是钱啊) String[] num = new String[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    String[] unit = new String[]{"","拾","佰","仟","万","拾万","佰万","仟万","亿","拾亿","佰亿","仟亿"};
    String src = "1000300020";
    String desc = ""; // 转换数字
    int len = src.length();
    String[] descc = new String[len];
    for (int i=0; i<len; i++) {
    descc[i] = num[src.charAt(i) - '0'];
    System.out.println(descc[i]);
    } // 中间结果串
    for (int i=0; i<len; i++) {
    desc += descc[i]; 
    if (!(descc[i].equals("零"))) {
    desc += unit[len-1-i];
    }
    } // 去掉多余的”零“
    desc = desc.replaceAll("零+", "零");
    desc = desc.replaceAll("^零+", "");
    desc = desc.replaceAll("零+$", ""); System.out.println(desc);
      

  15.   

    多了一行
    System.out.println(descc[i]);
    可以去掉的
      

  16.   

    我是初学者 我用String类写了个程序 是依次读入数字并转换成汉语数字 然后再按位数插入单位 由于方法比较笨所以只实现了千位以内的 之后的代码会翻番所以不写了 这个方法好读不好写
    很好理解 因为考虑零比如0000 0203 1008 0002等数的汉语正确语法显示所以代码很长 希望有同是初学的朋友交流共同进步   
    程序:
    ///////////////////////////////////////////Numbers.java///////////////////////////////////////////
    import java.io.*;
    public class Numbers
    {
      public static void main(String [] args)
      {
    int ch =0;
    String zero = new String("零");
    String S="",S1="",S2="",S3="",S4="",S5="",S6="",S7="",S8="",S9="",S0="";//个十百千万......
    System.out.println("请输入数字:[输入字母即可退出]");

    while(true)
    {
     try{ ch=System.in.read(); }            //逐个读取数字         
     catch(Exception e){ System.out.println(e.getMessage());}

     switch(ch)
     {   case '\r':                           //回车之后
           break;
      case '\n':                           //换行符之后
           
    int x=S.length();

    if(1==x)  {} //判断数字位数,插入单位(十百千万) 主要是零在各个位置导致的汉语语法问题
    ////////////////////////////////////////////////////////////////////////////////////
    if(2==x)  { S0=S.substring(0,1);S1=S.substring(1);//最高十位 解决!
                           
    if(S0.equals(zero))S=S1;
    else if(S1.equals(zero))S=S0+"十";
    else S=S0+"十"+S1;}
    ///////////////////////////////////////////////////////////////////////////////////////
    if(3==x)  { S0=S.substring(0,1);S1=S.substring(1,2);S2=S.substring(2);//最高百位 解决!
                       
    if(S0.equals(zero))
    { if(S1.equals(zero))S=S2;
     else if(S2.equals(zero))S=S1+"十";
     else S=S1+"十"+S2; }
                       
    else if(S1.equals(zero))
    { if(S2.equals(zero))S=S0+"百";
     else S=S0+"百零"+S2; }
                        
     else if(S2.equals(zero)) S=S0+"百"+S1+"十";
                        
     else  S=S0+"百"+S1+"十"+S2; }
     /////////////////////////////////////////////////////////////////////////最高千位 解决!
     if(4==x)  
     {  
        S0=S.substring(0,1);S1=S.substring(1,2);
    S2=S.substring(2,3);S3=S.substring(3);
                       
    if(S0.equals(zero))
    { if(S1.equals(zero))
    { if(S2.equals(zero))S=S3;
       else if(S3.equals(zero))S=S2+"十";
       else S=S2+"十"+S3; } 
                             
       else if(S2.equals(zero))
       { if(S3.equals(zero))S=S1+"百";
     else S=S1+"百零"+S3; }
                             
        else if(S3.equals(zero)) S=S1+"百"+S2+"十";
        else  S=S1+"百"+S2+"十"+S3; }
                             
        else if (S1.equals(zero)) 
        { if (S2.equals(zero)) 
         { if (S3.equals(zero)) S=S0+"千";
           else S=S0+"千零"+S3; }
           else if(S3.equals(zero)) S=S0+"千零"+S2+"十"; 
           else S=S0+"千零"+S2+"十"+S3; }
           
     else if(S2.equals(zero))
      { if(S3.equals(zero)) S=S0+"千"+S1+"百";
        else S=S0+"千"+S1+"百零"+S3; }
                         
        else if(S3.equals(zero)) S=S0+"千"+S1+"百"+S2+"十";
                        
        else S=S0+"千"+S1+"百"+S2+"十"+S3; }
           
     ///////////////////////////////////////////////////////////////////////////////////
        if(5==x)  {}//万    同上理 代码翻番 
           
        if(6==x)  {}//十万  从这开始出现几十几万的问题 可以解决!
           
        if(7==x)  {}//百万   
           
        if(8==x)  {}//千万   
           
        if(9==x)  {}//亿     

        //在处理零的问题时是

        System.out.println(S);        //输出结果
        S="";
        break;
    //////////////////////////////////////////////////////////////////////////////////////
     default: 
               switch(ch)                     //进行转换大写汉字
           { 
             case '1': S=S+"一";break;
             case '2': S=S+"二";break;
             case '3': S=S+"三";break;
             case '4': S=S+"四";break;
             case '5': S=S+"五";break;
             case '6': S=S+"六";break;
             case '7': S=S+"七";break;
             case '8': S=S+"八";break;
             case '9': S=S+"九";break;
             case '0': S=S+"零";break;
             default:  System.out.println("你输入的不是纯数字"); return;
           }
           
        }       
           
     }  

      }

       }
      

  17.   

    我也来凑个热闹,带小数点的没考虑,因为我自己都不知道怎么念:
    public class IntegerConvert {
    static char[] dw = {0x20, '拾', '佰', '仟', '万', '亿'};
    static char[] ints = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};

    private static String convert(int c) {
    String out = "";
    int base = 0;

    if(0 == c) { return "零"; }

    for(; c != 0; c /= 10) {
    if(c % 10 != 0) {
    out =  new Character(ints[c % 10]).toString() +
           new Character(dw[base]).toString() + out;
    }
    base++;
    }

    return out;
    }

    public static void main(String[] args) {
    int test1 = 12434;
    int test2 = 10000;
    int test3 = 10001;
    int test4 = 0;
    int test5 = 1;
    int test6 = 10100; System.out.println("test1: " + convert(test1));
    System.out.println("test2: " + convert(test2));
    System.out.println("test3: " + convert(test3));
    System.out.println("test4: " + convert(test4));
    System.out.println("test5: " + convert(test5));
    System.out.println("test6: " + convert(test6));
    }
    }
      

  18.   

    呵呵,我也是个学生.来凑个热闹...声名我的只是为了题目而完成的.没有太大的意义.对于小数的输入我也想过一些方法,只是没有写出来.也没有对异常的处理.对于程序的优化,也没有太多的概念.还请各位大人口下留情.import java.io.*;public class Turn {

    public static void main(String args[]){

    Turn t = new Turn();
    try{
    BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
    String s=in.readLine();
    t.print(s);
    for(int i=0; i<=s.length()-1; i++){
    t.diffract(Integer.parseInt(String.valueOf(s.charAt(i))));
    t.unit(s.length()-i);
    }
    }
    catch(Exception e){
    e.printStackTrace();
    }

    }

    public void diffract(int i){
    switch(i){
    case 1:print("一");break;
    case 2:print("二");break;
    case 3:print("三");break;
    case 4:print("四");break;
    case 5:print("五");break;
    case 6:print("六");break;
    case 7:print("七");break;
    case 8:print("八");break;
    case 9:print("九");break;
    case 0:print("零");break;
    }
    }

    public void unit(int i){
    //打印单位
    switch(i){
    case 1:break;
    case 2:print("十");break;
    case 3:print("百");break;
    case 4:print("千");break;
    case 5:print("万");break;
    case 6:print("十万");break;
    case 7:print("百万");break;
    }
    }

    public void print(String unit){
    System.out.print(unit);
    }
    }
      

  19.   

    看我的  最大16位的正整数肯定正确!!!main函数参数读入的..
    public class ITCS {
    public static void main(String[] args) {

    String[] num = new String[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    String[] unit1 = new String[]{"","拾","佰","仟"};
    String[] unit2 = new String[]{"","万","亿","万"};
    String str=args[0],string = "",str_2 = null;
    System.out.print(str+"----->");
    str=Str(str);
    int i=str.length();
    if(i==1)
    string=num[Integer.parseInt(str)];
    else{
    int a=i/4,b=i%4,t=b;
    String[] str_1=new String[a];
    str_2=str.substring(0,b);
        boolean boo1=true;
        do{
    for(int r=0;r<str_2.length();r++){
    if(str_2.charAt(r)=='0'){
    if(Str(str_2.substring(r,str_2.length())).equals("0"))
    break;
    else if(!(string.substring(string.length()-1,string.length()).equals("零")))string=string+"零";
    }else
    string=string+num[Integer.parseInt(""+str_2.charAt(r))]+unit1[b-1];
    b--;
    }
    if(i!=a*4&!str_2.equals("0000"))
    string=string+unit2[a];
    b=4;
    if(a>0){
    str_2=str.substring(t,t+4);
    }
    t=t+4;
    if(a<=0)boo1=false;
    a--;
        }while(boo1);
    }
    //System.out.println(str_2+"~~~~~"+str_2.length());
    if(string.substring(0,2).equals("壹拾"))
    string=string.substring(1,string.length());
    System.out.println(string);
    }


    public static String Str(String str){
    //Tab tab = null;
    boolean boo=true;
    int i=0;
    while(boo){
    if(str.charAt(0)=='0'){
    i++;
    if(str.length()==1){
    boo=false;break;
    }
    str=str.substring(1,str.length());
    }
    else
    boo=false;
    }
    //tab.setS(str);tab.setI(i);
    return str;
    }}
      

  20.   

    哈哈,已经变成钱了。那我也贴一个自己以前写的一个按人民币习惯转换字符串的类。不过,暂时只支持12位。理论上是可以支持N位,可12位后我都不知道怎么读了。所以进行了截断。public class Transform
    {
    private String integerStr; //整数部分
    private String decimalStr; //小数部分
    private StringBuffer moneyStr = new StringBuffer("");
    private int pointLocation = -1;

    public static final char[] units = {'角', '圆', '万', '亿'};
    public static final char[] num = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};

    public Transform(String numberStr)
    {
    numberStr = trim(numberStr);
    if ( !check(numberStr) )
    {
    numberStr = "0";
    decimalStr = "0";
    }
    pointLocation = hasRadix(numberStr);
    cut(numberStr);
    }

    //消除字符串前端的零
    public String trim(String str)
    {
    return str.replaceAll("^0*","");
    }

    //检查是否为合法的金额字符串
    public boolean check(String str)
    {
    if ( !str.matches("\\d+.?\\d*") )
    {
    return false;
    }
    else
    {
    return true;
    }
    }

    //得到小数点所在位置
    public int hasRadix(String number)
    {
    return number.indexOf('.');
    }

    //将金额字符串分割为整数部分与小数部分。暂时:整数部分位数支持12,即至千亿;小数部分至角
    private void cut(String numberStr)
    {
    if ( pointLocation == -1 )
    {
    if ( numberStr.length() > 12 )
    {
    integerStr = numberStr.substring(numberStr.length()-12);
    }
    else
    {
    integerStr = numberStr;
    }
    decimalStr = "0";
    return;
    }

    integerStr = numberStr.substring(0, pointLocation);
    integerStr = (integerStr.length() > 12) ? integerStr.substring(integerStr.length()-12) : integerStr;
    String temp = numberStr.substring(pointLocation+1);
    if ( hasRadix(temp) != -1 )
    {
    temp = temp.substring(0, hasRadix(temp));
    }

    decimalStr = ( temp.length() > 1 ? temp.substring(0, 1) : temp );
    }

    //输出结果字符串,如遇非法字符串则输出"零圆"
    public String toString()
    {
    char[][] temp = split();
    for ( int a = 0; a < temp.length; a++ )
    {
    moneyStr.append(toTurnString(temp[a], temp.length-a));
    }

    if ( !decimalStr.equals("0") )
    {
    moneyStr.append(toTurnString(decimalStr.substring(0).toCharArray(), 0));


    return moneyStr.toString().equals("圆") ? "零圆" : moneyStr.toString();
    }

    //输出每一组的对应表示
    private String toTurnString(char[] number, int i)
    {
    StringBuffer temp = new StringBuffer("");
    boolean isZero = false;
    int zeroLen = 0;
    for ( int a = 0; a < number.length; a++ )
    {
    if ( number[a] == '0' )
    {
    zeroLen++;
    isZero = true;
    }
    else
    {
    isZero = false;
    }

    if ( !isZero )
    {
    if ( zeroLen != 0 )
    {
    temp.append(num[0]);
    zeroLen = 0;
    }

    temp.append(toTurnNum(number[a])).append(toTurnUnit(number.length-a, i));
    }
    else
    {
    if ( a == number.length-1 )
    {
    temp.append(toTurnUnit(number.length-a, i));
    }
    }
    }

    return temp.toString();
    }

    private char toTurnUnit(int len , int unit)
    {
    switch ( len )
    {
    case 1: return units[unit];
    case 2: return '拾';
    case 3: return '佰';
    case 4: return '仟';
    }
    return '0';
    }

    //将金额字符串的整数部分以四位为一组进行分割
    private char[][] split()
    {
    int lenTmp = integerStr.length();
    int strArrayLength = lenTmp/4+((lenTmp-lenTmp/4*4)>0 ? 1 : 0 );
    char[][] temp = new char[strArrayLength][];

    for ( int a = temp.length-1; a >= 0; a-- )
    {
    if ( a == 0 )
    {
    temp[a] = integerStr.substring(0, lenTmp).toCharArray();

    return temp;
    }

    temp[a] = integerStr.substring(lenTmp-4,lenTmp).toCharArray();
    lenTmp -= 4;
    }

    return temp;
    }

    public char toTurnNum(char c)
    {
    return num[c-(int)'0'];
    }
    }
      

  21.   

    我BOLG里写了一个大家可以看看哈!
    http://blog.csdn.net/zh029t 或 http://blog.csdn.net/LatestEntry.aspx?CategoryID=3 
      

  22.   

    我BLOG里写了一个大家可以看看哈!
    http://blog.csdn.net/zh029t 或 http://blog.csdn.net/LatestEntry.aspx?CategoryID=3
      

  23.   

    牛!
    不过在下有点点建议,
    望大家海含:
    第一段代码到最后,
    都好好欣赏了一番,
    发现个别代码一个大可改善的地方:
    没注释,
    变量没意义,
    中文拼不上,
    英文也对不上,
    既然写出来给大家观摩,
    何不漂亮一点呢,
    如果我们的代码都注定只有自己看,
    那写成这样也无可厚非。也是刚毕业,
    工作时看了老同志的代码,
    就真的感觉到了什么叫“垃圾”代码,
    是人都看不懂,
    Java好一点,
    C就天书一样!
    为不被别人骂自己写的是垃圾,
    我不得不多写点注释,
    推敲一下命名,
    最后format一下。刚在http://promosearch.atomz.com上看些咚咚,
    代码就比较整齐了,
    看起来有点养眼,
    师夷长技!
    师夷长技!
    共勉!
    共勉!
      

  24.   

    lip009(深蓝忧郁) ( ) 信誉:100    的程序有bug0000000030020.23
    -----------------------------
    万亿零叁万零贰拾圆贰角叁分
      

  25.   

    lip009(深蓝忧郁) 是真正牛人!
    建议在最后加上这段代码就完美了:
    while(result.startsWith("零")||result.startsWith("圆"))
    result=result.replaceFirst("[零圆]", "");可以避免“零三万元”,“圆零”,“零一分”这样的Bug
      

  26.   

    result =result.replaceAll("^[零圆佰仟万亿]+","");//加这一句也成.
      

  27.   

    好爽,希望自己以后也能接招,哈哈~~~~~~~~~```
    学习ing~~~~~~~```
      

  28.   

    to  lip009(深蓝忧郁) 还有bug
    就是输入类似 000.23时