asp.net C# 中文字符与整数之间的互相转换

asp教程.net c# 中文字符与整数之间的互相转换
数字转中文基本思路:

  即进行分解

  1:计算最基本的[0,9999]的数字翻译

  2:通过 '万' 字连接两个相邻的由(1)式计算所得的结果,得到[0,99999999]范围的翻译。

  3:通过 '亿' 字连接,得到大数范围内的翻译。

 

中文转数字基本思路:

  主要问题:1:在哪里进行乘法?2:乘法的作用范围呢?

  容易进入的误区:

  1:只考虑在哪里进行乘法,如一千万

    (容易想到如,当计算到'万'字时,离它最近的单位为'千',这种情况下进行乘法,而除乘法外,则进行顺序计算)。 

    **测试数据:一亿三千万。由该算法得到表达式为:1e8 + 3000 * 10000。由于是顺序计算,实际计算时为 (1e8 + 3000) * 10000

          得到了错误答案。

   2:考虑到了(1)中遇到的问题,但对乘法作用范围判断出错。如数据一亿三千万,正确表达式为1e8 + (3000 * 10000)

     误以为进行类似只有 '+' 与 '*' 的算式表达式的计算即可,即考虑了 '*' 与 '+' 的优先级。

    如此如“一亿三千万”能得到正确答案了。

    **测试数据:一亿零一百二十万。按(2)的算法,则为:1e 8 + 100 + (20 * 10000)。

        而实际结果应为:1e8 + (100 + 20) * 10000,得到了错误答案。

  总结出的解法:即考虑1:在哪里进行乘法?2:乘法的作用范围呢?

    **如一亿零一百二十万。当遇到‘万’时,由前面的‘百’<‘万’决定了当前需要进行乘法。

    **再由‘万’之前遇到的第一个 > ‘万’的单位(此处为亿),决定了 乘法的作用范围在两者之间。

    得到该翻译的正确表达式:1e8 + (100 + 20) * 10000

 

    private class num2chinese
     {
         private static readonly string unit = "个十百千";
         private static readonly string ala = "0123456789";
         private static readonly string ch = "零一二三四五六七八九";

         private static string transsmall(string num)
         {/*[0,一万)区间的翻译*/
             string str = "";
             string nn = num.trimstart('0');
             bool flag = false;
             int j = 0;
             for (int i = nn.length - 1; i >= 0; i--, j++)
             {
                 int no = ala.indexof(nn[i]);
                 if (no != 0) flag = true;
                 if (flag)
                 {
                     if (j != 0 && no != 0)
                         str += unit[j];
                     if (!(no == 0 && str[str.length - 1] == '零'))
                         str += ch[no];
                 }
             }
             char[] s = str.tochararray();
             array.reverse(s);
             str = new string(s);
             return str;
         }

         private static string trans(string num, int range, char ss)
         {/*递归求解。[0,千]通过'万'字可拼接成[0,千万],同理[0,千万]通过亿字连接。
参数含义:
 将num字串按每range作为一组进行分解,并通过ss字符进行连接。(4位一组或八位一组)*/
             string ret = "";
             string input = num.trimstart('0');

             for (int i = input.length - range; i > -range; i -= range)
             {
                 int st = i, len = range;/*st与len分别表示每组串的起始位置及长度*/
                 if (i < 0)
                 {
                     st = 0;
                     len = range + i;
                 }
                 string tmp = input.substring(st, len);
                 long nn = long.parse(tmp);
                 string cur = "";
                 if (nn == 0)
                 {
                     ret = ss + ret;
                     continue;
                 }
                 if (ss == '万')
                 {
                     cur = transsmall(tmp) + ss;
                 }
                 else
                 {
                     cur = trans(tmp, 4, '万') + ss;
                 }/*计算得到每组的值后,拼接ss字符到末尾*/
                 if (nn % 10 == 0 && ret.length > 0 && ret[0] != '零')
                 {/*当前组末尾有零时判断是否+零*/
                     int ll = num.length - st - len;
                     ll = ll > 8 ? 8 : ll;/
   /*最大单位为亿,则当前组之后8位范围内无零则不输出零
   例:一亿零五,零需要输出,一亿亿零五(而非一亿零亿零五)*/
                     string tt = num.substring(st + len, ll);
                     if (tt.trim('0') != "")//后八位存在非0值
                         cur += '零';
                 }
                 if (ss == '万' && nn < 1000 ||
                     ss == '亿' && nn < (long)1e7)
                 {/*当前组前位空缺时,前位补零*/
                     cur = '零' + cur;
                 }
                 ret = cur + ret;
             }

             int s = 0, _len = ret.length - 1;
             if (ret[0] == '零')
             {
                 s = 1;
                 _len--;
             }
             if (ret[ret.length - 2] == '零')
             {
                 _len--;
             }/*去掉多余的前位零和后位的ss单位符之后的子串*/
             ret = ret.substring(s, _len);
             return ret;
         }

         public static string transbiginteger(string ss)
         {/*调用trans进行翻译与异常处理,支持大数*/
             string ret = ss.trimstart('0');
             string tt = "0123456789";
             char[] ch = tt.tochararray();
             ret = ret.trim(' ');
             if (ret.trim(ch) != "")
             {
                 messagebox.show("输入数据非法!");
                 return "";
             }
             if (ret == "")
             {
                 return "零";
             }
             ret = trans(ret, 8, '亿');
             return ret;
         }
     }

     private class chinesenumconvert
     {/*整数转数字类,不支持大数
  关键点:在哪里进行乘法?计算乘法的范围?*/
         private static readonly string digit = "零一二三四五六七八九";
         private static readonly string unit = "个十百千万亿";
         private static readonly int[] num = { 1, 10, 100, 1000, 10000, 100000000 };

         private static bool checkstring(string word)
         {/*简单判断输入是否合法  1;其他字符。 2:有非零数字相邻*/
             word = word.trim(' ');
             string tt = digit + unit;
             string tmp = word.trim(tt.tochararray());
             if (tmp != "")
                 return false;
             for (int i = 0; i < word.length - 1; i++)
             {
                 if (digit.indexof(word[i]) >= 1
                     && digit.indexof(word[i + 1]) >= 1)
                 {
                     return false;
                 }
             }
             return true;
         }

         public static long chinesenum2int(string word)
         {
             if (!checkstring(word))
             {
                 messagebox.show("输入数据非法!");
                 return 0;
             }
             long sum = 0;
             long tmp = 0;
             long[] tt = new long[150];

             int dig = -1, unit0 = -1, unit1 = -1, unit2 = -1;
             if (unit.indexof(word[0]) >= 0)
             {
                 word = "一" + word;
             }
             if (unit.indexof(word[word.length - 1]) < 0)
             {
                 if (word.length >= 2 && (tmp = unit.indexof(word[word.length - 2])) > 0)
                 {
                     word = word + unit.tochararray()[tmp - 1];
                 }
                 else
                 {
                     word += '个';
                 }
             }
             for (int i = 1; i < word.length; i++)
             {
                 dig = digit.indexof(word[i - 1]);
                 unit0 = unit.indexof(word[i]);

                 if (unit0 >= 0)
                 {
                     unit1 = -1; unit2 = -1;
                     int idx = -1;
                     for (int j = i - 1; j >= 0; j--)
                     {
                         unit1 = unit.indexof(word[j]);
                         if (unit1 >= 0) break;
                     }//是否需要做乘法
                     for (int j = i - 1; j >= 0; j--)
                     {
                         unit2 = unit.indexof(word[j]);
                         if (unit2 > unit0)
                         {
                             idx = j;
                             break;
                         }
                     }//决定乘法的作用范围
                     if (unit1 >= 0 && unit0 >= unit1)
                     {
                         if (dig >= 0) sum += dig;
                         if (unit2 == -1)
                         {
                             sum *= num[unit0];
                         }
                         else
                         {
                             sum = (sum - tt[idx]) * num[unit0] + tt[idx];
                         }
                     }
                     else
                     {
                         if (dig < 0) dig = 1;
                         sum += dig * num[unit0];
                     }
                 }
                 tt[i] = sum;
             }
             return sum;
         }

时间: 2024-11-02 01:26:46

asp.net C# 中文字符与整数之间的互相转换的相关文章

asp.net DataGrid 中文字符排序的实现代码_实用技巧

废话不多说,看例子: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12">     <mx:Script>         <!--[CDA

【ASP】从URL获取中文字符然后查找数据库后输出GBK中文

正题 昨天项目中遇到了些困难,研究了一下午终于搞定了. 事情是这样的:我们的客户端需要访问接口从服务器获取相关数据,接口用get的方式.就是在浏览器里面输入xxxx&xx=xxx&yy=yyy的方式,接口从Request中获取参数然后再访问数据库. 之前参数都是数字或者英文,所以一直没问题,但是昨天要做模糊查询的功能,需要参数中输入中文,于是就出问题了.解析不出结果.尝试了各种方法,包括各种中文转换成UTF-8或者UTF-8转换成GBK等等函数都不尽如意.最后还是通过各种google,然后

asp.net C#读取中文字符代码

asp教程.net c#读取中文字符代码 private static void fnfileprocess() { streamreader reader = new streamreader(@"d:1500.txt", encoding.getencoding("gb2312")); streamwriter writeren = new streamwriter(@"d:english.txt", false, encoding.utf8

asp检测是否为中文字符函数_应用技巧

<% '****************************** '函数:CheckChinese(strng) '参数:strng,待验证字符 '描述:检测是否为中文字符,返回值:中文为true,否则false '示例:<%=CheckChinese(strng)%> '****************************** Function CheckChinese(strng) CheckChinese = true Dim regEx, Match Set regEx

ASP连接MySQL,数据库中的中文字符在页面中显示的是“?”

问题描述 我将MySQL的编码格式全部设为了utf8,包括表.字段,但是网页中显示的中文字符为"?".(网页的编码格式也是UTF-8,文件也是.)从网页中插入中文数据到数据库,数据库中却是乱码.求教大神们,这个为问题我已经弄了一天了. 解决方案 本帖最后由 qq_27764721 于 2016-05-10 17:06:21 编辑解决方案二:自己先顶一下.会不会是类库的问题?我用的MySQLDriverCS.解决方案三:问题解决了.

asp检测是否为中文字符函数

<% '****************************** '函数:CheckChinese(strng) '参数:strng,待验证字符 '描述:检测是否为中文字符,返回值:中文为true,否则false '示例:<%=CheckChinese(strng)%> '****************************** Function CheckChinese(strng) CheckChinese = true Dim regEx, Match Set regEx

匹配中文字符的正则表达式

原文:匹配中文字符的正则表达式 匹配中文字符的正则表达式: [u4e00-u9fa5]   评注:匹配中文还真是个头疼的事,有了这个表达式就好办了   匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)   匹配空白行的正则表达式:ns*r 评注:可以用来删除空白行   匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? /> 评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部

UTF-8和GBK等中文字符编码格式介绍及相互转换

我们有很多时候需要使用中文编码格式,比如gbk.gb2312等,但是因为主要针对中文编码设置,因此并不完全通用,这样一来就有了在各编码间相互转换的需求,比如和UTF8的转换.可是在我使用的过程中,却发现编码转换并没有想象中的简单,或者说可能会出错,即使你使用的系统API.我在使用中,产生一些疑惑,搜索资料也没有完全解决我的问题,因此整理了这篇文章.文章末尾列出了我参考的一些资料或者代码实现等,在此谢过. 本文先各个中文编码进行介绍,只做简单介绍,不涉及详细原理(本文结尾附有链接可参阅),然后实例

字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?

转自:  http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不在意,但这些名词有时候实在让人迷惑,对想学习计算机知识的人来说,搞懂它也十分重要,我也是在学习中慢慢了解了一些这方面的知识. 1. ASCII码      在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被