求地址字符串总大写数字装换为阿拉伯数字的函数,在线等待!

DOUZHI80 2008-03-25 03:51:28
“锦江区红星路一段四十四号”,求函数,目标能解决将此地址串中的四十四转换为44的实现此类大小数字转换为阿拉伯数字的转换函数。
...全文
174 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlhxinxi83 2008-05-02
  • 打赏
  • 举报
回复
不考虑单位会出现很多问题的
superliu1122 2008-05-02
  • 打赏
  • 举报
回复
string[] strNum = new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
string strYour = "锦江区红星路一段四十四号";
strYour = Regex.Replace(strYour, "[十百千万]", "");
strYour = Regex.Replace(strYour, "[一二三四五六七八九零]",
delegate(Match m) { return (strNum as IList<string>).IndexOf(m.Value).ToString(); });
MessageBox.Show(strYour);

考虑不周哦

string strYour = "锦江区红星路一段十号";
出错
扑通 2008-05-02
  • 打赏
  • 举报
回复
有这么难吗?
FAFA2008 2008-05-02
  • 打赏
  • 举报
回复
太强了!
兔子-顾问 2008-05-02
  • 打赏
  • 举报
回复
其实,中文的写法中,总是写的有十百千万亿这些单位,单位都删除掉。保留数字就行了。我上面这个就2行。算最简单了。
兔子-顾问 2008-05-02
  • 打赏
  • 举报
回复
try this

string[] strNum = new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
string strYour = "锦江区红星路一段四十四号";
strYour = Regex.Replace(strYour, "[十百千万]", "");
strYour = Regex.Replace(strYour, "[一二三四五六七八九零]",
delegate(Match m) { return (strNum as IList<string>).IndexOf(m.Value).ToString(); });
MessageBox.Show(strYour);
兔子-顾问 2008-05-02
  • 打赏
  • 举报
回复

string[] strNum = new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
string strYour = "锦江区红星路一段四十四号";
strYour = Regex.Replace(strYour, "(?<=[^一二三四五六七八九零]|^)十(?=[^一二三四五六七八九零]|$)", "10");
strYour = Regex.Replace(strYour, "[十百千万亿兆]", "");
strYour = Regex.Replace(strYour, "[一二三四五六七八九零]",
delegate(Match m) { return (strNum as IList<string>).IndexOf(m.Value).ToString(); });
MessageBox.Show(strYour);


单位上多考虑几个。^_^继续找bug吧。
兔子-顾问 2008-05-02
  • 打赏
  • 举报
回复
也就是十比较特殊。给找到疏漏了。那就加上对十的处理好了


string[] strNum = new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
string strYour = "锦江区红星路一段四十四号";
strYour = Regex.Replace(strYour, "(?<=[^一二三四五六七八九零]|^)十(?=[^一二三四五六七八九零]|$)", "10");
strYour = Regex.Replace(strYour, "[十百千万]", "");
strYour = Regex.Replace(strYour, "[一二三四五六七八九零]",
delegate(Match m) { return (strNum as IList<string>).IndexOf(m.Value).ToString(); });
MessageBox.Show(strYour);


用这个可以了吧。这样没什么位数限制,一亿亿都没问题。
-过客- 2008-05-02
  • 打赏
  • 举报
回复
对于“锦江区红星路一段二十万一千零二号”这样的源字符串,1楼和无牙的都还是有问题的,借鉴两位的写了下

半年没怎么写代码了,现在写代码成了我的业余爱好了,半年前就是个菜鸟,现在更是菜到家了。不想写正则的,最后还是用了正则;想写个状态机的,结果却写得不伦不类。功能是实现了,不过代码写的比较乱,凑合着看吧

        private string UperNumberToLower(string srcStr)
{
srcStr = Regex.Replace(srcStr, @"(?<![零一二三四五六七八九])十", "一十");
srcStr = Regex.Replace(srcStr, @"十(?![零一二三四五六七八九])", "十零");
return Regex.Replace(srcStr, @"(?![万千百])[零一二三四五六七八九十百千万]+", new MatchEvaluator(UpToLowerDelegate));
}

private string UpToLowerDelegate(Match m)
{
string uNumber = m.Value;

int total = 0;
int unit = -1;
int standNum = -1;

List<string> listNum = new List<string>(new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" });
List<string> listUnit = new List<string>(new string[] { "十", "百", "千", "万" });
List<int> listInt = new List<int>(new int[] { 10, 100, 1000, 10000 });

for (int i = 0; i < uNumber.Length;i++ )
{
string strChar = uNumber[i].ToString();
if (listNum.IndexOf(strChar) > -1)
standNum = listNum.IndexOf(strChar);

if (listUnit.IndexOf(strChar) > -1)
{
if (listUnit.IndexOf(strChar) < unit)
total = total + standNum * listInt[listUnit.IndexOf(strChar)];
else
{
total = (total + standNum) * listInt[listUnit.IndexOf(strChar)];
unit = listUnit.IndexOf(strChar);
}
standNum = -1;
}

if (i == uNumber.Length - 1 && standNum != -1)
total = total + standNum;
}

return total.ToString();
}


调用
richTextBox2.Text = UperNumberToLower("锦江区红星路一段二十万一千零二号");


存在问题:
1、因为“十”在汉语里比较特殊,很多时候“一十”前面的“一”都会省略。上面程序对这一问题进行了处理,但同样带来一个问题,像“十里铺”这里本来不该处理的“十”被处理了,所以这时就要求限定需处理字符串的条件,比如只有符合“***号”这样的条件的字符串才做处理,那样的话,需要改一下正则。
2、最大处理到“万”,到“亿”的int要换成decimal,但是在计算某些值时有问题,懒得去处理了:P

还有哪里不符合的,请大家指出来,并给出例子
zzuyongp 2008-05-02
  • 打赏
  • 举报
回复
替换不就可以了 不过如果地址前面还出现四十四是否要替换呢?
心情解码 2008-04-30
  • 打赏
  • 举报
回复
学习..
sunrain_yingxi 2008-03-25
  • 打赏
  • 举报
回复
Response.Write(DecodeMoneyCn("四十四").ToString());

public double DecodeMoneyCn(string AText)
{
AText = AText.Replace("万万", "亿");
AText = AText.Replace("点", "元");
AText = AText.Replace("块", "元");
AText = AText.Replace("毛", "角");
double vResult = 0;
double vNumber = 0; // 当前数字
double vTemp = 0;
int vDecimal = 0; // 是否出现小数点
foreach (char vChar in AText)
{
int i = "零一二三四五六七八九".IndexOf(vChar);
if (i < 0) i = "零幺两三四五六七八九".IndexOf(vChar);
if (i < 0) i = "零壹贰叁肆伍陆柒捌玖".IndexOf(vChar);
if (i > 0)
{
vNumber = i;
if (vDecimal > 0)
{
vResult += vNumber * Math.Pow(10, -vDecimal);
vDecimal++;
vNumber = 0;
}
}
else
{
i = "元十百千万亿".IndexOf(vChar);
if (i < 0) i = "整拾佰仟万亿".IndexOf(vChar);
if (i == 5) i = 8;
if (i > 0)
{
if (i >= 4)
{
vTemp += vNumber;
if (vTemp == 0) vTemp = 1;
vResult += vTemp * Math.Pow(10, i);
vTemp = 0;
}
else vTemp += vNumber * Math.Pow(10, i);
}
else
{
i = "元角分".IndexOf(vChar);
if (i > 0)
{
vTemp += vNumber;
vResult += vTemp * Math.Pow(10, -i);
vTemp = 0;
}
else if (i == 0)
{
vTemp += vNumber;
vResult += vTemp;
vDecimal = 1;
vTemp = 0;
}
}
vNumber = 0;
}
}
return vResult + vTemp + vNumber;
}

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧