zxsky110 发表于 2012-3-28 14:40:00

在线等思路!!!!

在线等一个西文转中文的思路!不需要代码,只求一思路,或者说是伪代码!急急!!!

泡芙拓 发表于 2012-3-28 15:00:23

你是要做一个转化工具吗?不太理解

原点 发表于 2012-3-28 15:35:15

没明白

zxsky110 发表于 2012-3-29 09:49:20

回复 2# 泡芙拓


    我用VBS做一个转换,讲西文数字转换成中文的,例如101000   转换成壹拾万零壹仟   我要一种思路,语言自己可以写的出来,写出来一种,想换换思路,想不到别的了!

alex765264 发表于 2012-3-29 09:53:12

不懂自动化测试,围观!

ryugun 发表于 2012-3-29 10:44:05

本帖最后由 ryugun 于 2012-3-29 10:50 编辑

我用java代码实现,具体思路用什么语言都差不多:
主要思路为:循环读取你要转换的字符串的每个字符,然后逐个判断,根据不同的数字,然后进行处理就行了,很简单

StringBuffur newString = new StringBuffur(); //定义用于接受转化后的字符串
char[] StringToChar= aaa.toCharArray(); //将你需要转化的字符串转化成一个char数组

for(int i = 0, i < StringToChar.length; i++ ) { //循环遍历你要转化的字符串的每个字符(例如:123456789)
    switch (StringToChar【i】) {//这里这么写会有问题。。。。。不详细解释了,也可以用if代替
            case 0:
                newString .append("零");
                continue;
            case 1:
                newString .append("一");
                continue;
            ………………………………//类似于上面
      }
}

//转化完毕之后,输入出新的字符串即可
System.out.println(newString.toString());

zxsky110 发表于 2012-3-29 10:58:27

回复 6# ryugun


    这个没有问题但要处理问题连续0 的问题例如10001   读作一万零一还会出现万零等问题

zxsky110 发表于 2012-3-29 10:59:33

回复 6# ryugun


如果用你这样的话,什么语言都一样的,很简单的就写出来了!

ryugun 发表于 2012-3-29 16:03:06

回复 8# zxsky110

的确,上午没注意看,以为只是简单的翻译下,上面的思路不可行
,原来你是要将数值译成正确的中文读数,对吧?比如:10042300456--->一百亿四千二百三十万零四百五十六   对吗?

再详细一点,你的源字符串只包含数字么?如果只是数字,那么可以考虑下这个思路(如果还包含其他非数字字符,那就相对麻烦点

了):

ryugun 发表于 2012-3-29 16:04:01

代码我给你贴上来,无聊花了点脑力想算法。。。不够优化,也可能有BUG,没测试几次,。。。
public class ddddddddddddd {

    /**
   * @param args
   */
    public static void main(String[] args) {
      try {
            System.out.println(formatString("10042300456"));
      } catch (Exception e) {
            e.printStackTrace();
      }
    }

    /**
   * 格式化字符串
   * @param string 10042300456
   * @return
   * @throws Exception
   */
    private static String formatString(String string) throws Exception {
      
      String string1 = translate(string); //译文:一零零四二三零零四五六
      String newString = changeSerial(string1); //颠倒后的序列:六五四零零三二四零零一
      char[] newChar = newString.toCharArray();
      StringBuffer newString2 = new StringBuffer();
      for (int i = 0, length = newChar.length; i < length; i++) { //格式化字符串:六五四零,零三二四,零零一
            if ((i != 0) && (i%4 == 0)) {
                newString2.append(",");
            }
            newString2.append(newChar);
      }
      String newString3 = changeSerial(newString2.toString()); //再次颠倒序列:一零零,四二三零,零四五六
      String[] stringArray = newString3.split(",");
      for (int i = 0, length = stringArray.length; i < length; i++) {
            //为数组内的每个字符串加上单位,并去掉多余的零
            stringArray = formart(stringArray); //一百,四千二百三十,零四百五十六
      }
      int length = stringArray.length;
      for (int i = length - 2; i >= 0; i--) {
            if (i == length - 2) {
                stringArray = stringArray + "万";
                continue;
            }
            if (i == length - 3) {
                stringArray = stringArray + "亿";
                continue;
            }
      }
      StringBuffer returnString = new StringBuffer();
      for (int i = 0; i < length; i++) {
            returnString.append(stringArray);
      }
      return returnString.toString();
    }

ryugun 发表于 2012-3-29 16:04:30

接着上面:是java的同一个类
/**
   * 为字符串加上单位,并去掉多余的零
   * @param stringArray
   * @return
   */
    private static String formart(String string) {
      char[] aaa = string.toCharArray();
      String unitString = addUnitForString(aaa);
      
      unitString = unitString.replace("零千", "零"); //修改"零千"为"零"
      unitString = unitString.replace("零百", "零"); //修改"零百"为"零"
      unitString = unitString.replace("零十", "零"); //修改"零十"为"零"
      for (int i = 0; i < 3; i++) {
            unitString = unitString.replace("零零", "零"); //修改"零零"为"零",修改3次
      }
      
      if(unitString.endsWith("零")) {
            unitString = unitString.substring(0, unitString.length() - 1);//去掉最后一个字符串"零"
      }
      if ("零".equals(unitString)) {
            return "";
      }
      
      return unitString;
    }

    /**
   * 为字符串添加单位
   * @param aaa
   * @return
   */
    private static String addUnitForString(char[] aaa) {
      StringBuffer bbb = new StringBuffer();
      int length = aaa.length;
      if (1 == length) {
            bbb.append(aaa);
      } else if (2 == length) {
            for (int i = 0; i < length; i++) { //格式字符串:零千三百二十零
                bbb.append(aaa);
                if (i == 0) {
                  bbb.append("十");
                  continue;
                }
            }
      } else if (3 == length) {
            for (int i = 0; i < length; i++) { //格式字符串:零千三百二十零
                bbb.append(aaa);
                if (i == 0) {
                  bbb.append("百");
                  continue;
                }
                if (i == 1) {
                  bbb.append("十");
                  continue;
                }
            }
      } else if (4 == length) {
            for (int i = 0; i < length; i++) { //格式字符串:零千三百二十零
                bbb.append(aaa);
                if (i == 0) {
                  bbb.append("千");
                  continue;
                }
                if (i == 1) {
                  bbb.append("百");
                  continue;
                }
                if (i == 2) {
                  bbb.append("十");
                  continue;
                }
            }
      }
      
      return bbb.toString();
    }

ryugun 发表于 2012-3-29 16:04:48

继续:
/**
   * 颠倒字符串序列
   * @param string
   * @return
   */
    private static String changeSerial(String string) {
      int length = string.length();
      char[] oldChar = string.toCharArray();
      char[] newChar = new char;
      
      for(int i = 0, j = length - 1; i < length; i++, j--) {
            newChar = oldChar;
      }
      return String.valueOf(newChar);
    }



    /**
   * 将数字翻译成中文
   * @param string
   * @return
   * @throws Exception
   */
    private static String translate(String string) throws Exception {
      StringBuffer returnString = new StringBuffer();
      char[] newChars = string.toCharArray();
      for (int i = 0, length = newChars.length; i < length; i++) {
            String aaaaa = String.valueOf(newChars);
            switch (Integer.valueOf(aaaaa)) {
                case 0:
                  returnString.append("零");
                  continue;
                case 1:
                  returnString.append("一");
                  continue;
                case 2:
                  returnString.append("二");
                  continue;
                case 3:
                  returnString.append("三");
                  continue;
                case 4:
                  returnString.append("四");
                  continue;
                case 5:
                  returnString.append("五");
                  continue;
                case 6:
                  returnString.append("六");
                  continue;
                case 7:
                  returnString.append("七");
                  continue;
                case 8:
                  returnString.append("八");
                  continue;
                case 9:
                  returnString.append("九");
                  continue;
                default:
                  throw new Exception();
            }
      }
      
      return returnString.toString();
    }

}

ryugun 发表于 2012-3-29 16:11:52

本帖最后由 ryugun 于 2012-3-29 16:13 编辑

把我的思路说一次:在注释里基本已经写明白了,我用数字举例子
待转化的字符串:10042300456

第一次转化:就是上午发错的那个思路,直接译文::一零零四二三零零四五六
第2次转化:六五四零零三二四零零一
第3次转化:六五四零,零三二四,零零一
第4次转化:一零零,四二三零,零四五六
                前几次转化的目的就是为了得到一个按 四位 分割的字符串,我用的方法比较笨,可以优化
第5次转化:一百,四千二百三十,零四百五十六
         其中本次转化较复杂:在第4次转化好的基础上,分别将每个逗号里的4位(或3、2、1位)进行添加单位(千,百,十),并去掉多余的0

第6次转化:一百亿四千二百三十万零四百五十六(本次转化就是为每四位数添加上对应的大单位,万,亿)
对了,最大支持到 9999亿9999万9999

泡芙拓 发表于 2012-3-29 16:23:25

回复 4# zxsky110


   给你顶下吧

zxsky110 发表于 2012-3-31 21:21:24

思路很好很感谢!

zxsky110 发表于 2012-3-31 21:24:45

真的很谢谢~!很好的思路!JAVA没学好,但是能看懂,引用了!
页: [1]
查看完整版本: 在线等思路!!!!