凶残的阿拉伯数字转大写算法(正则/ASCII)

作者:V君 发布于:2014-5-12 10:23 Monday 分类:挖坑经验

在一次需要用到人民币大写数字的时候查到的,太凶残不得不转啊 乂D

先直接上代码, 分析在后面

 

static string ConvertToChinese(double x)
{
    string s = x.ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A");
    string d = Regex.Replace(s,
        @"((?<=-|^)[^1-9]*)|((?'z'0)[0A-E]*((?=[1-9])|(?'-z'(?=[F-L\.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[\.]|$))))"
        , "${b}${z}"
    );
    return Regex.Replace(d"."delegate(Match m)
    {
        return "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟萬億兆京垓秭穰"[m.Value[0- '-'].ToString();
    });
}

 

点击查看原图

接下来我们来分析一下:

步骤1: 把你给的数字转成字符串, 这长的格式字符串

步骤2: 用正则匹配组来捕获每一位

步骤3: 这可以说是精髓, 使用从 `-' 到 `L' 的 ASCII 顺序替换


加上调试代码可以看出, 字母就是十百千, 数字直接转换, 

句点符号替换成 `元' 字


右图转自 www.asciitable.com 有删改

 

ToString:LEDCKEDCJEDCIEDCHEDCGEDCFEDC1.0B0A

reg:1.  ->壹元

ToString:LEDCKEDCJEDCIEDCHEDCGEDCFEDC2.0B0A

reg:2.  ->贰元

ToString:LEDCKEDCJEDCIEDCHEDCGEDCFEDC4.0B0A

reg:4.  ->肆元

ToString:LEDCKEDCJEDCIEDCHEDCGEDCFEDC8.0B0A

reg:8.  ->捌元

ToString:LEDCKEDCJEDCIEDCHEDCGEDCFED1C6.0B0A

reg:1C6.  ->壹拾陆元

ToString:LEDCKEDCJEDCIEDCHEDCGEDCFED3C2.0B0A

reg:3C2.  ->叁拾贰元

ToString:LEDCKEDCJEDCIEDCHEDCGEDCFED6C4.0B0A

reg:6C4.  ->陆拾肆元

ToString:LEDCKEDCJEDCIEDCHEDCGEDCFE1D2C8.0B0A

reg:1D2C8.  ->壹佰贰拾捌元

ToString:LEDCKEDCJEDCIEDCHEDCGEDCFE2D5C6.0B0A

reg:2D5C6.  ->贰佰伍拾陆元

ToString:LEDCKEDCJEDCIEDCHEDCGEDCFE5D1C2.0B0A

reg:5D1C2.  ->伍佰壹拾贰元

 

 

 

标签: 软件开发 C# 算法 字符串处理

引用地址:

发表评论:

Powered by emlog 去你妹的备案 sitemap