51Testing软件测试论坛
标题:
在线等思路!!!!
[打印本页]
作者:
zxsky110
时间:
2012-3-28 14:40
标题:
在线等思路!!!!
在线等一个西文转中文的思路!不需要代码,只求一思路,或者说是伪代码!急急!!!
作者:
泡芙拓
时间:
2012-3-28 15:00
你是要做一个转化工具吗?不太理解
作者:
原点
时间:
2012-3-28 15:35
没明白
作者:
zxsky110
时间:
2012-3-29 09:49
回复
2#
泡芙拓
我用VBS做一个转换,讲西文数字转换成中文的,例如101000 转换成 壹拾万零壹仟 我要一种思路,语言自己可以写的出来,写出来一种,想换换思路,想不到别的了!
作者:
alex765264
时间:
2012-3-29 09:53
不懂自动化测试,围观!
作者:
ryugun
时间:
2012-3-29 10:44
本帖最后由 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
回复
6#
ryugun
这个没有问题 但要处理问题 连续0 的问题 例如10001 读作一万零一 还会出现万零 等问题
作者:
zxsky110
时间:
2012-3-29 10:59
回复
6#
ryugun
如果用你这样的话,什么语言都一样的,很简单的就写出来了!
作者:
ryugun
时间:
2012-3-29 16:03
回复
8#
zxsky110
的确,上午没注意看,以为只是简单的翻译下,上面的思路不可行
,原来你是要将数值译成正确的中文读数,对吧?比如:10042300456--->一百亿四千二百三十万零四百五十六 对吗?
再详细一点,你的源字符串只包含数字么?如果只是数字,那么可以考虑下这个思路(如果还包含其他非数字字符,那就相对麻烦点
了):
作者:
ryugun
时间:
2012-3-29 16:04
代码我给你贴上来,无聊花了点脑力想算法。。。不够优化,也可能有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();
}
作者:
ryugun
时间:
2012-3-29 16:04
接着上面:是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();
}
作者:
ryugun
时间:
2012-3-29 16:04
继续:
/**
* 颠倒字符串序列
* @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();
}
}
作者:
ryugun
时间:
2012-3-29 16:11
本帖最后由 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
回复
4#
zxsky110
给你顶下吧
作者:
zxsky110
时间:
2012-3-31 21:21
思路很好 很感谢!
作者:
zxsky110
时间:
2012-3-31 21:24
真的很谢谢~!很好的思路!JAVA没学好,但是能看懂,引用了!
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2