51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2184|回复: 15
打印 上一主题 下一主题

[原创] 在线等思路!!!!

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2012-3-28 14:40:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在线等一个西文转中文的思路!不需要代码,只求一思路,或者说是伪代码!急急!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

16#
 楼主| 发表于 2012-3-31 21:24:45 | 只看该作者
真的很谢谢~!很好的思路!JAVA没学好,但是能看懂,引用了!
回复 支持 反对

使用道具 举报

该用户从未签到

15#
 楼主| 发表于 2012-3-31 21:21:24 | 只看该作者
思路很好  很感谢!
回复 支持 反对

使用道具 举报

该用户从未签到

14#
发表于 2012-3-29 16:23:25 | 只看该作者
回复 4# zxsky110


   给你顶下吧
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 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
回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 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[length];
        
        for(int i = 0, j = length - 1; i < length; i++, j--) {
            newChar[j] = 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();
    }

}
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 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[0]);
        } 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();
    }
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 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[i]);
        }
        String newString3 = changeSerial(newString2.toString()); //再次颠倒序列:一零零,四二三零,零四五六
        String[] stringArray = newString3.split(",");
        for (int i = 0, length = stringArray.length; i < length; i++) {
            //为数组内的每个字符串加上单位,并去掉多余的零
            stringArray[i] = formart(stringArray[i]); //一百,四千二百三十,零四百五十六
        }
        int length = stringArray.length;
        for (int i = length - 2; i >= 0; i--) {
            if (i == length - 2) {
                stringArray[i] = stringArray[i] + "万";
                continue;
            }
            if (i == length - 3) {
                stringArray[i] = stringArray[i] + "亿";
                continue;
            }
        }
        StringBuffer returnString = new StringBuffer();
        for (int i = 0; i < length; i++) {
            returnString.append(stringArray[i]);
        }
        return returnString.toString();
    }
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2012-3-29 16:03:06 | 只看该作者
回复 8# zxsky110

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

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

了):
回复 支持 反对

使用道具 举报

该用户从未签到

8#
 楼主| 发表于 2012-3-29 10:59:33 | 只看该作者
回复 6# ryugun


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

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2012-3-29 10:58:27 | 只看该作者
回复 6# ryugun


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

使用道具 举报

该用户从未签到

6#
发表于 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());
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2012-3-29 09:53:12 | 只看该作者
不懂自动化测试,围观!
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2012-3-29 09:49:20 | 只看该作者
回复 2# 泡芙拓


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

使用道具 举报

该用户从未签到

3#
发表于 2012-3-28 15:35:15 | 只看该作者
没明白
回复 支持 反对

使用道具 举报

该用户从未签到

2#
发表于 2012-3-28 15:00:23 | 只看该作者
你是要做一个转化工具吗?不太理解
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-25 07:30 , Processed in 0.075654 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表