浤济类-〉金额转换(数字=中文)互换(全)

来源:互联网 发布:cdma类的网络 编辑:程序博客网 时间:2024/06/06 03:31

考虑后还是发布类文件内容比较灵活大家使用,可自行修改,因为有的编程不支持中文命名,以及如果有其他制式需要转换时作某些修改缘故,这次采用多字符单词支持写法以适用非单字符单位名称,全新算法;可自行生成DLL,允许任意使用和传播。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;namespace 人体节律/*使用时修改为对应工程名称*/{    class 浤济类    {        string 中文整数模板 = "仟|佰|拾|☆不可说☆|仟|佰|拾|☆无量|仟|佰|拾|不可思议|仟|佰|拾|那由他|仟|佰|拾|阿僧祇|仟|佰|拾|恒河沙|仟|佰|拾|极|仟|佰|拾|载|仟|佰|拾|正|仟|佰|拾|涧|仟|佰|拾|沟|仟|佰|拾|穰|仟|佰|拾|秭|仟|佰|拾|垓|仟|佰|拾|京|仟|佰|拾|兆|仟|佰|拾|亿|仟|佰|拾|万|仟|佰|拾|元",               中文小数模板 = "角|分|厘|毫|丝|忽|微|纤|沙|尘|埃|渺|莫|模糊|逡巡|须臾|瞬息|弹指|刹那|六德|空虚|☆清静",               数字模 = "0|1|2|3|4|5|6|7|8|9|.", 中文模 = "零|壹|贰|叁|肆|伍|陆|柒|捌|玖";                /// <summary>        ///摘要说明:(逐字式)获取指定内容的等效字符集合。        /// </summary>        public string 内容等效(string 转换内容, string 指定内容)        {            string 等效 = "";            try            {                for (int 字符 = 0, 长度 = 转换内容.Length; 字符 < 长度; 字符++)                {                    int 位置 = 指定内容.IndexOf(转换内容.Substring(字符, 1));                    if (位置 >= 0) 等效 += 指定内容.Substring(位置, 1);//等效                    if (转换内容.Contains("..")) 转换内容 = 转换内容.Replace("..", ".");                }            }            catch (Exception Ts)            { 等效 = "浤济类.内容等效:非法->" + Ts.ToString(); }            return 等效;        }        /// <summary>        ///摘要说明:(逐字式)获取或替换[对应内容]等效的字符集合;[等效对应]必须与[对应内容]顺序保持一致,且每词间必须以"|"标记。        ///[等效控制]真:把对应位置字符等效,假:获得对应字符等效(过滤)        /// </summary>        public string 对应等效(string 等效内容, string 对应内容, string 等效对应, bool 等效控制)        {            string[] 板 = 对应内容.Split('|'), 模 = 等效对应.Split('|'); string 替换内容 = "";            try            {                for (int 对应 = 0, 数 = 模.Length; 对应 < 数; 对应++)                {                    if (等效控制) if (等效内容.Contains(模[对应])) 等效内容 = 等效内容.Replace(模[对应], 板[对应]);//对应等效                    if (!等效控制) if (等效内容.Contains(模[对应])) 替换内容 += 板[对应];//替换等效                }                if (!等效控制) 等效内容 = 替换内容;            }            catch (Exception Ts)            { 等效内容 = "浤济类.对应等效:非法->" + Ts.ToString(); }            return 等效内容;        }        /// <summary>        ///摘要说明:获取[对应内容]等效的字符集合;[等效对应]必须与[对应内容]顺序保持一致。        /// </summary>        public ArrayList 单词等效(string[] 等效对应, string[] 对应内容)        {            ArrayList 单词 = new ArrayList();            try            {                foreach (string 元素 in 对应内容)                {                    foreach (string 词 in 等效对应)                    { if (元素.Contains(词)) 单词.Add(词); }                }            }            catch (Exception Ts)            { 单词.Add("浤济类.单词等效:非法->" + Ts.ToString()); }            return 单词;        }        /// <summary>        ///摘要说明:(数值长度=1)按[金额模板]的进制转换为初步金额模,[金额模板]中每金额单位间必须以"|"标记。        /// </summary>        public string 中文金额整数模(string 金额内容, string 金额模板)        {            string 转换 = ""; int 填 = 金额内容.Length; 金额模板 = "|" + 金额模板;            try            {                if (填 <= 76)                    for (int 倒读 = 金额模板.Length - 1; 倒读 >= 0; 倒读--)                    {                        string 字符 = 金额模板.Substring(倒读, 1);                        if (字符 != "|") 转换 = 转换.Insert(0, 字符);                        else { 填--; 转换 = 转换.Insert(0, 金额内容.Substring(填, 1)); }                        if (填 == 0) break;                    }                if (填 > 76) 转换 = "浤济类.中文金额整数模:非法数字超过长度";            }            catch (Exception Ts)            { 转换 = "浤济类.中文金额整数模:非法->" + Ts.ToString(); }            return 转换;        }        /// <summary>        ///摘要说明:消除“零”的金额单位,成为金额缩写,[金额标识]中每单位间必须以"|"标记,[金额标识]任何语言必须按零-玖顺序书写。        /// </summary>        public string 金额缩写整数模(string 金额内容, string 金额模板, string 金额标识)        {            string 零 = 金额标识.Split('|')[0];            string[] 模 = 金额模板.Split('|').GroupBy(分组 => 分组).Where(筛选 => 筛选.Count() == 1 && 筛选.Key != "").Select(投影 => 投影.Key).ToArray();            string[] 板 = 金额模板.Split('|').GroupBy(分组 => 分组).Where(筛选 => 筛选.Count() > 1).Select(投影 => 投影.Key).ToArray();            try            {                for (int 消除 = 0; 消除 < 金额内容.Length; 消除++)                {                    foreach (string 元素 in 板)                    { if (金额内容.Contains(零 + 元素)) 金额内容 = 金额内容.Replace(零 + 元素, 零); }                }                for (int 消除 = 0; 消除 < 金额内容.Length; 消除++)                { if (金额内容.Contains(零 + 零)) 金额内容 = 金额内容.Replace(零 + 零, 零); }                for (int 倒读 = 模.Length - 1; 倒读 > 0; 倒读--)                {                    if (金额内容.Contains(零 + 模[倒读])) 金额内容 = 金额内容.Replace(零 + 模[倒读], 模[倒读]);                    if (金额内容.Contains(模[倒读 - 1] + 模[倒读])) 金额内容 = 金额内容.Replace(模[倒读 - 1] + 模[倒读], 模[倒读 - 1]);                }            }            catch (Exception Ts)            { 金额内容 = "浤济类.金额缩写整数模:非法->" + Ts.ToString(); }            finally { if (金额内容.Length > 0 && 金额内容.IndexOf(模[模.Length - 1]) < 0)金额内容 = 金额内容 + 模[模.Length - 1]; }            return 金额内容;        }        /// <summary>        ///摘要说明:消除“零”的金额单位,成为金额缩写,[金额标识]中每单位间必须以"|"标记,[金额标识]任何语言必须按零-玖顺序书写。        /// </summary>        public string 金额缩写小数模(string 金额内容, string 金额模板, string 金额标识)        {            string 零 = 金额标识.Split('|')[0]; string[] 模 = 金额模板.Split('|');            try            {                for (int 顺读 = 0, 数 = 模.Length; 顺读 < 数 - 1; 顺读++)                {                    金额内容 = 金额内容.Replace(零 + 模[顺读] + 零 + 模[顺读 + 1], 零);                    金额内容 = 金额内容.Replace(零 + 模[顺读], 零);                }                for (int 重复 = 0, 量 = 金额内容.Length; 重复 < 量; 重复++)                { 金额内容 = 金额内容.Replace(零 + 零, 零); }                if (金额内容 !="" && 金额内容.Substring(金额内容.Length - 零.Length).Contains(零)) 金额内容 = 金额内容.Substring(0, 金额内容.Length - 零.Length);            }            catch (Exception Ts)            { 金额内容 = "浤济类.金额缩写小数模:非法->" + Ts.ToString(); }            finally { /*不管是否发生错误总要执行的语句*/ }            return 金额内容;        }        /// <summary>        ///摘要说明:按[金额模板]的进制转换为初步金额模,[金额模板]中每金额单位间必须以"|"标记,[转换金额模]最终转换金额语言,不包括阿拉伯语。        /// </summary>        public string 金额整数模(string 金额内容, string 金额模板, string 数字模, string 转换金额模)        {            string 转换 = "", 数字映像 = ""; int 填 = 金额内容.Length; string[] 模 = 金额模板.Split('|');            try            {                if (!数字模.Contains(金额内容.Substring(0, 1)))                { if (转换金额模.Contains(金额内容.Substring(0, 1))) 数字映像 = 对应等效(金额内容, 数字模, 转换金额模, true); }                else 数字映像 = 金额内容;                for (int 倒读 = 模.Length - 1; 倒读 >= 0; 倒读--)                {                    转换 = 转换.Insert(0, 模[倒读]);                    填--; 转换 = 转换.Insert(0, 数字映像.Substring(填, 1));                    if (填 == 0) break;                }                转换 = 对应等效(转换, 转换金额模, 数字模, true);            }            catch (Exception Ts)            { 转换 = "浤济类.金额整数模:非法->" + Ts.ToString(); }            return 转换;        }        /// <summary>        ///摘要说明:按[金额模板]的进制转换为初步金额模,[金额模板]中每金额单位间必须以"|"标记,[转换金额模]最终转换金额语言,不包括阿拉伯语。        /// </summary>        public string 金额小数模(string 金额内容, string 金额模板, string 数字模, string 转换金额模)        {            string 转换 = "", 数字映像 = ""; string[] 模 = 金额模板.Split('|');            try            {                if (!数字模.Contains(金额内容.Substring(0, 1)))                { if (转换金额模.Contains(金额内容.Substring(0, 1))) 数字映像 = 对应等效(金额内容, 数字模, 转换金额模, true); }                else 数字映像 = 金额内容;                for (int 顺读 = 0, 数 = 模.Length; 顺读 < 数; 顺读++)                {                    转换 = 转换.Insert(转换.Length, 数字映像.Substring(顺读, 1));                    转换 = 转换.Insert(转换.Length, 模[顺读]);                    if (顺读 == 金额内容.Length - 1) break;                }                转换 = 对应等效(转换, 转换金额模, 数字模, true);            }            catch (Exception Ts)            { 转换 = "浤济类.金额小数模:非法->" + Ts.ToString(); }            return 转换;        }        /// <summary>        ///摘要说明:按[金额模板]的进制转换为初步金额模,[金额模板]中每金额单位间必须以"|"标记,[转换金额模]最终转换金额语言,不包括阿拉伯语。        /// </summary>        public string 金额整数还原模(string 金额内容, string 金额模板, string 数字模, string 转换金额模)        {            string 转换 = "", 数字映像 = "", 零 = 转换金额模.Split('|')[0]; string[] 模 = 金额模板.Split('|'), 单位映像 = null;            int 位 = 模.Length - 1; ArrayList 单位 = new ArrayList(); string[] 不重复 = 金额模板.Split('|').Distinct().ToArray();            try            {                if (!金额内容.Contains(模[模.Length - 1])) 金额内容 = 金额内容 + 模[模.Length - 1];                if (金额内容.Contains(零)) 金额内容 = 金额内容.Replace(零, "");                数字映像 = 对应等效(金额内容, 数字模, 转换金额模, true);                单位映像 = 数字映像.Split(new char[9] { '1', '2', '3', '4', '5', '6', '7', '8', '9' });                单位 = 单词等效(不重复, 单位映像); int 元素数 = 单位.Count - 1;                for (int 倒读映 = 元素数; 倒读映 >= 0; 倒读映--)                {                    for (int 倒读 = 位; 倒读 >= 0; 倒读--)                    {                        if (模[倒读] == 单位[倒读映].ToString())                        {                            int 位置 = 数字映像.LastIndexOf(模[倒读]);                            if (数字模.Contains(数字映像.Substring(数字映像.IndexOf(模[倒读]) - 1, 1)))                            {                                转换 = 转换.Insert(0, 数字映像.Substring(位置 - 1, 1) + 模[倒读]);                                数字映像 = 数字映像.Substring(0, 位置);                            }                            else                            {                                转换 = 转换.Insert(0, 零 + 模[倒读]);                                数字映像 = 数字映像.Substring(0, 位置);                            }                            位 = 位 - 1;                            break;                        }                        if (模[倒读] != 单位[倒读映].ToString())                        {                            转换 = 转换.Insert(0, 零 + 模[倒读]);                            位 = 位 - 1;                        }                    }                }                for (int 倒读 = 模.Length - 1; 倒读 >= 0; 倒读--)                { 转换 = 转换.Replace(模[倒读], ""); }                转换 = 对应等效(转换, 数字模, 转换金额模, true);            }            catch (Exception Ts)            { 转换 = "浤济类.金额整数补位模:非法->" + Ts.ToString(); }            return 转换;        }        /// <summary>        ///摘要说明:按[金额模板]的进制转换为初步金额模,[金额模板]中每金额单位间必须以"|"标记,[转换金额模]最终转换金额语言,不包括阿拉伯语。        /// </summary>        public string 金额小数还原模(string 金额内容, string 金额模板, string 数字模, string 转换金额模)        {            string 转换 = "", 数字映像 = "", 零 = 转换金额模.Split('|')[0]; string[] 模 = 金额模板.Split('|'), 单位映像 = null;            try            {                if (金额内容.Contains(零)) 金额内容 = 金额内容.Replace(零, "");                数字映像 = 对应等效(金额内容, 数字模, 转换金额模, true);                单位映像 = 数字映像.Split(new char[9] { '1', '2', '3', '4', '5', '6', '7', '8', '9' });                for (int 顺读 = 0, 数 = 模.Length; 顺读 < 数; 顺读++)                {                    if (!数字映像.Contains(模[顺读]))                        转换 = 转换.Insert(转换.Length, 零 + 模[顺读]);                    else                        转换 = 转换.Insert(转换.Length, 数字映像.Substring(数字映像.IndexOf(模[顺读]) - 1, 1) + 模[顺读]);                    if (单位映像[单位映像.Length - 1] == 模[顺读]) break;                }                foreach (string 元素 in 模) { 转换 = 转换.Replace(元素, ""); }                转换 = 对应等效(转换, 数字模, 转换金额模, true);            }            catch (Exception Ts)            { 转换 = "浤济类.金额小数补位模:非法->" + Ts.ToString(); }            return 转换;        }        /// <summary>        ///摘要说明:只对数字执行。        /// </summary>        public string 舍入精度选择(string 数字金额, string 精度, string 舍入)        {            string 舍入数输出 = "", 不舍位 = ""; Double 浮点数 = 0.0; int 精度数 = 22;            try            {                if(!精度.Contains("无限精度")) 精度数 = int.Parse(内容等效(精度, "0123456789"));                if (精度数 > 10 && 数字金额.Length > 10)                {                    不舍位 = 数字金额.Substring(0, 8);                    舍入数输出 = 数字金额.Substring(8);                    精度数 = 精度数 - 8;                }                else 舍入数输出 = 数字金额;                浮点数 = Convert.ToDouble(舍入数输出.Insert(0, "0."));                if (舍入 == "五入")                    舍入数输出 = Math.Round((decimal)浮点数, 精度数, MidpointRounding.AwayFromZero).ToString();                if (舍入 == "六入")                    舍入数输出 = Math.Round((decimal)浮点数, 精度数, MidpointRounding.ToEven).ToString();                舍入数输出 = 舍入数输出.Replace("0.", "");                if (不舍位.Length > 0) 舍入数输出 = 不舍位 + 舍入数输出;            }            catch (Exception Ts)            { 舍入数输出 = "浤济类.舍入精度选择:非法->" + Ts.ToString(); }            return 舍入数输出;        }        /// <summary>        ///摘要说明:波若波罗密多为内部总体转换输出,一步到位,使用内置中文金额模板。        /// </summary>        public string 波若波罗密多(string 输入待转金额, string 精度, string 舍入, string 选择)        {            string 总输出 = "", 中文待转金额 = "";            if (选择.Contains("数→中"))            {                string[] 金额整理 = 内容等效(输入待转金额, 数字模.Replace("|", "")).Split('.');                if (金额整理[0] != "") 总输出 = 金额缩写整数模(金额整数模(金额整理[0], 中文整数模板, 数字模, 中文模), 中文整数模板, 中文模);                if (金额整理.Length > 1 && 金额整理[1] != "") 总输出 += 金额缩写小数模(金额小数模(舍入精度选择(金额整理[1], 精度, 舍入), 中文小数模板, 数字模, 中文模), 中文小数模板, 中文模);            }            if (选择.Contains("中→数"))            {                string[] 金额整理 = new string[2], 元素 = 中文整数模板.Split('|').Distinct().ToArray();                中文待转金额 = 内容等效(输入待转金额, 中文模.Replace("|", "") + 中文整数模板.Replace("|", "") + 中文小数模板.Replace("|", ""));                if (中文待转金额 != "")                {                    金额整理[0] = 中文待转金额.Substring(0, 中文待转金额.IndexOf(元素[元素.Length - 1])) + 元素[元素.Length - 1];                    金额整理[1] = 中文待转金额.Substring(中文待转金额.IndexOf(元素[元素.Length - 1])).Replace(元素[元素.Length - 1], "");                }                if (金额整理[0] != "") 总输出 = 金额整数还原模(金额整理[0], 中文整数模板, 数字模, 中文模);                if (金额整理[1] != "") 总输出 += "." + 金额小数还原模(金额整理[1], 中文小数模板, 数字模, 中文模);            }            return 总输出;        }    }}

调用:同步委托拉姆达表达式部分为分别组合输出,最底部为一步到位转换输出,只有2行代码,够简单了。

         private void 转换金额_Click(object sender, EventArgs e)        {            浤济类 转换 = new 浤济类();            this.Invoke(new Action(() =>            {            string 换行 = "\r\n☆☆☆\r\n",            中文整数模板 = "仟|佰|拾|☆不可说☆|仟|佰|拾|☆无量|仟|佰|拾|不可思议|仟|佰|拾|那由他|仟|佰|拾|阿僧祇|仟|佰|拾|恒河沙|仟|佰|拾|极|仟|佰|拾|载|仟|佰|拾|正|仟|佰|拾|涧|仟|佰|拾|沟|仟|佰|拾|穰|仟|佰|拾|秭|仟|佰|拾|垓|仟|佰|拾|京|仟|佰|拾|兆|仟|佰|拾|亿|仟|佰|拾|万|仟|佰|拾|元",            中文小数模板 = "角|分|厘|毫|丝|忽|微|纤|沙|尘|埃|渺|莫|模糊|逡巡|须臾|瞬息|弹指|刹那|六德|空虚|☆清静",            数字模 = "0|1|2|3|4|5|6|7|8|9|.", 中文模 = "零|壹|贰|叁|肆|伍|陆|柒|捌|玖", 待转金额 = "", 数字待转金额 = "", 整数 = "", 小数 = "", 缩写整数 = "", 缩写小数 = "";                        if (金额输入.Text != "")             {                数字待转金额 = 转换.内容等效(金额输入.Text, 数字模.Replace("|", ""));                待转金额 = 转换.内容等效(金额输入.Text, 中文模.Replace("|", "") + 中文整数模板.Replace("|", "") + 中文小数模板.Replace("|", ""));            }            if (数转.Checked)            {                string[] 金额整理 = 数字待转金额.Split('.');                if (金额整理[0] != "") 整数 = 转换.金额整数模(金额整理[0], 中文整数模板, 数字模, 中文模);                if (金额整理.Length > 1 && 金额整理[1] != "") 小数 = 转换.金额小数模(转换.舍入精度选择(金额整理[1], 精度.Text, 舍入.Text), 中文小数模板, 数字模, 中文模);                缩写整数 = 转换.金额缩写整数模(整数, 中文整数模板, 中文模); 缩写小数 = 转换.金额缩写小数模(小数, 中文小数模板, 中文模);            }            if (转数.Checked)            {                string[] 元素 = 中文整数模板.Split('|').Distinct().ToArray(), 金额整理 = new string[2];//采集单位(多字符方式)                if (待转金额.Length > 0)                {                    金额整理[0] = 待转金额.Substring(0, 待转金额.IndexOf(元素[元素.Length - 1])) + 元素[元素.Length - 1];                    金额整理[1] = 待转金额.Substring(待转金额.IndexOf(元素[元素.Length - 1])).Replace(元素[元素.Length - 1], "");                    if (金额整理[0] != "") 整数 = 转换.金额整数还原模(金额整理[0], 中文整数模板, 数字模, 中文模);                    if (金额整理.Length > 1 && 金额整理[1] != "") 小数 = 转换.金额小数还原模(金额整理[1], 中文小数模板, 数字模, 中文模);                }            }            if (数转.Checked) 金额输出.Text = 缩写整数 + 缩写小数 + 换行;            if (转数.Checked) 金额输出.Text = 整数 + "." + 小数 + 换行;            金额输出.Text += 整数 + 换行 + 缩写整数 + 换行 + 小数 + 换行 + 缩写小数 + 换行;            })); -------------------------------------            if (数转.Checked) 金额输出.Text = 转换.波若波罗密多(金额输入.Text, 精度.Text, 舍入.Text, 数转.Text);            if (转数.Checked) 金额输出.Text = 转换.波若波罗密多(金额输入.Text, 精度.Text, 舍入.Text, 转数.Text);        }        private void 舍入_SelectedIndexChanged(object sender, EventArgs e)        { 转换金额_Click(null, null); }        private void 精度_SelectedIndexChanged(object sender, EventArgs e)        { 转换金额_Click(null, null); }

特别需要注明:精度控件必须这样写(01位精度---21位精度)01-21纯数字。

若发现任何错误请指正或联系以便修改。

2014-3-31

            var 值 = Console.ReadLine();            string 中文整数模板 = "仟|佰|拾|☆不可说☆|仟|佰|拾|☆无量|仟|佰|拾|不可思议|仟|佰|拾|那由他|仟|佰|拾|阿僧祇|仟|佰|拾|恒河沙|仟|佰|拾|极|仟|佰|拾|载|仟|佰|拾|正|仟|佰|拾|涧|仟|佰|拾|沟|仟|佰|拾|穰|仟|佰|拾|秭|仟|佰|拾|垓|仟|佰|拾|京|仟|佰|拾|兆|仟|佰|拾|亿|仟|佰|拾|万|仟|佰|拾|元",               中文小数模板 = "角|分|厘|毫|丝|忽|微|纤|沙|尘|埃|渺|莫|模糊|逡巡|须臾|瞬息|弹指|刹那|六德|空虚|☆清静", 中文模 = "零|壹|贰|叁|肆|伍|陆|柒|捌|玖";            int 序 = 0; var 值组 = 值.Split('.'); var 中文整数 = "";            foreach (var 整数 in 值组[0].Reverse())            {                中文整数 = 中文整数.Insert(0, 中文模.Split('|')[int.Parse(整数.ToString())].ToString() +                    中文整数模板.Split('|').Reverse().ToArray()[序].ToString());                序++;            }            序 = 0;            foreach (var 小数 in 值组[1])            {                中文整数 = 中文整数.Insert(中文整数.Length, 中文模.Split('|')[int.Parse(小数.ToString())].ToString() +                    中文小数模板.Split('|')[序].ToString());                序++;            }            Console.WriteLine(中文整数);

原创粉丝点击