字符串的格式为:十二斤,五十千克等,是数量+单位形式
替换完为:12斤,50千克等
不用考虑小数,但是要考虑零
C币不多了,求各位大神帮忙
字符串的格式为:十二斤,五十千克等,是数量+单位形式
替换完为:12斤,50千克等
不用考虑小数,但是要考虑零
C币不多了,求各位大神帮忙
楼主,您所提问的问题其实不是难的,观察下中文的数值写法,“十”,“百”,“千”,“万”,“亿”这些修饰符其实是一个基数。主要修饰它前面的数字,
有了前面的数字,只要想要的乘以对应的基数(10,100,1000,10000,100000000)再分别相加就可以得到对应的阿拉伯数字了,当然,中文数字对应的
阿拉伯数字还是要自己判断的。这就是思路,有了思路,只需要编写捕获到中文数值中的数字,问题就迎刃而解啦。但是,有一点说明,对应一些复杂的
中文数字的话,需要二次捕获数值再相加,例如前面的层数提到的 五千六百九十七万三千二百一十二斤,其中 五千六百九十七万。万修饰符前面的数字
也是组合而来。所以得从 五千六百九十七中再捕获一次数字。具体实现如下(c#写法,控制台显示):
正则如下:用于捕获中文数字
([零一二三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟亿]+亿)?零?([一二三四五六七八九十百千壹贰叁肆伍陆柒捌玖拾佰仟]+万)?零?([一二三四五六七八九十百壹贰叁肆伍陆柒捌玖拾佰][千仟])?零?([一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾][百佰])?零?([一二三四五六七八九壹贰叁肆伍陆柒捌玖]?[十拾])?零?([一二三四五六七八九壹贰叁肆伍陆柒捌玖])?
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
namespace regexp_help
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入要转换的中文数量:");
string strPreviousText = Console.ReadLine();
string strRegExp = @"([零一二三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟亿]+亿)?零?([一二三四五六七八九十百千壹贰叁肆伍陆柒捌玖拾佰仟]+万)?零?([一二三四五六七八九十百壹贰叁肆伍陆柒捌玖拾佰][千仟])?零?([一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾][百佰])?零?([一二三四五六七八九壹贰叁肆伍陆柒捌玖]?[十拾])?零?([一二三四五六七八九壹贰叁肆伍陆柒捌玖])?";
string strAllValue = "";
string strSpecifier = "";
int dFormatValue = 0;
MatchCollection matchs = Regex.Matches(strPreviousText, strRegExp); //匹配中文数量
strAllValue = matchs[0].ToString();
strSpecifier = strPreviousText.Remove(0, matchs[0].ToString().Length);
foreach (Match match in matchs)
{
int i = 0;
GroupCollection groups = match.Groups;
foreach (Group group in groups)
{
if (i != 0) {//首个捕获组不获取,因为它是整个数字文本
if (group.ToString() != "")
{
dFormatValue += formatTextToNumber(group.ToString());
}
}
i++;
}
}
Console.WriteLine("转换后的文本:{0}", dFormatValue + strSpecifier);
Console.ReadKey();
}
public static int formatTextToNumber(string strVal) {
int dReturn = 0;
if (strVal.Length == 1)
{
dReturn = getNumber(strVal);
}
else {
string strNumber = strVal.Substring(0, strVal.Length - 1);
string strSpecifier = strVal.Substring(strVal.Length - 1, 1);
if (strVal.Length == 2)
{
dReturn = getNumber(strNumber) * getBaseNumber(strSpecifier);
}
//复杂数字要递归取阿拉伯数字,如五百二十万,五百二十相对于“万”修饰符是组合数字
if (strVal.Length > 2) {
string strRegExp = @"([零一二三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟亿]+亿)?零?([一二三四五六七八九十百千壹贰叁肆伍陆柒捌玖拾佰仟]+万)?零?([一二三四五六七八九十百壹贰叁肆伍陆柒捌玖拾佰][千仟])?零?([一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾][百佰])?零?([一二三四五六七八九壹贰叁肆伍陆柒捌玖]?[十拾])?零?([一二三四五六七八九壹贰叁肆伍陆柒捌玖])?";
MatchCollection matchs = Regex.Matches(strNumber, strRegExp); //匹配中文数量
foreach (Match match in matchs)
{
int i = 0;
GroupCollection groups = match.Groups;
foreach (Group group in groups)
{
if (i != 0)
{//首个捕获组不获取,因为它是整个数字文本
if (group.ToString() != "")
{
dReturn += formatTextToNumber(group.ToString());
}
}
i++;
}
}
dReturn *= getBaseNumber(strSpecifier);
}
}
return dReturn;
}
//获取单数字文本对应阿拉伯数字
public static int getNumber(string strVal) {
int dFormatValue = 0;
switch (strVal)
{
case "一":
case "壹":
dFormatValue = 1;
break;
case "二":
case "贰":
dFormatValue = 2;
break;
case "三":
case "叁":
dFormatValue = 3;
break;
case "四":
case "肆":
dFormatValue = 4;
break;
case "五":
case "伍":
dFormatValue = 5;
break;
case "六":
case "陆":
dFormatValue = 6;
break;
case "七":
case "柒":
dFormatValue = 7;
break;
case "八":
case "捌":
dFormatValue = 8;
break;
case "九":
case "玖":
dFormatValue = 9;
break;
case "十":
case "拾":
dFormatValue = 10;
break;
default:
dFormatValue = 0;
break;
}
return dFormatValue;
}
//获取修饰符对用基数
public static int getBaseNumber(string strVal) {
int dFormatValue = 10;
switch (strVal)
{
case "十":
case "拾":
dFormatValue = 10;
break;
case "百":
case "佰":
dFormatValue = 100;
break;
case "千":
case "仟":
dFormatValue = 1000;
break;
case "万":
dFormatValue = 10000;
break;
case "亿":
dFormatValue = 100000000;
break;
default:
dFormatValue = 10;
break;
}
return dFormatValue;
}
}
}