在线等思路!!!!
在线等一个西文转中文的思路!不需要代码,只求一思路,或者说是伪代码!急急!!! 你是要做一个转化工具吗?不太理解 没明白 回复 2# 泡芙拓我用VBS做一个转换,讲西文数字转换成中文的,例如101000 转换成壹拾万零壹仟 我要一种思路,语言自己可以写的出来,写出来一种,想换换思路,想不到别的了! 不懂自动化测试,围观! 本帖最后由 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()); 回复 6# ryugun
这个没有问题但要处理问题连续0 的问题例如10001 读作一万零一还会出现万零等问题 回复 6# ryugun
如果用你这样的话,什么语言都一样的,很简单的就写出来了! 回复 8# zxsky110
的确,上午没注意看,以为只是简单的翻译下,上面的思路不可行
,原来你是要将数值译成正确的中文读数,对吧?比如:10042300456--->一百亿四千二百三十万零四百五十六 对吗?
再详细一点,你的源字符串只包含数字么?如果只是数字,那么可以考虑下这个思路(如果还包含其他非数字字符,那就相对麻烦点
了): 代码我给你贴上来,无聊花了点脑力想算法。。。不够优化,也可能有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();
} 接着上面:是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();
} 继续:
/**
* 颠倒字符串序列
* @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:13 编辑
把我的思路说一次:在注释里基本已经写明白了,我用数字举例子
待转化的字符串:10042300456
第一次转化:就是上午发错的那个思路,直接译文::一零零四二三零零四五六
第2次转化:六五四零零三二四零零一
第3次转化:六五四零,零三二四,零零一
第4次转化:一零零,四二三零,零四五六
前几次转化的目的就是为了得到一个按 四位 分割的字符串,我用的方法比较笨,可以优化
第5次转化:一百,四千二百三十,零四百五十六
其中本次转化较复杂:在第4次转化好的基础上,分别将每个逗号里的4位(或3、2、1位)进行添加单位(千,百,十),并去掉多余的0
第6次转化:一百亿四千二百三十万零四百五十六(本次转化就是为每四位数添加上对应的大单位,万,亿)
对了,最大支持到 9999亿9999万9999
回复 4# zxsky110
给你顶下吧 思路很好很感谢! 真的很谢谢~!很好的思路!JAVA没学好,但是能看懂,引用了!
页:
[1]