浤济类-〉金额转换(数字=中文)互换(全)
来源:互联网 发布: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(中文整数);
- 浤济类-〉金额转换(数字=中文)互换(全)
- 数字金额转换成中文金额(数据库实现)
- 数字金额转换成中文金额(C#实现)
- 将数字金额转换为中文大写金额(在网上找的)
- 数字金额转中文大写金额 - 数字大写转换
- 数字大小写转换(包括金额)
- JavaCodeUtil(数字金额大写转换)
- 输入数字转换成中文大写(钱,财务计算金额)
- 数字金额转换中文大写Java实现
- [原创]数字转换中文大写金额
- 金额数字转换成中文写法
- 讲金额(数字)转换成中文大写
- 将数字金额转换为中文输出
- 將数字金额转换为中文大写
- 阿拉伯数字金额转换为中文汉字金额(补全)
- 将数字金额转换为中文大写金额
- 使用 JAVA 将数字金额转换成大写中文金额
- C语言编程:数字金额转换为中文大写金额
- C 链表的倒置
- 【python学习】之四、面向对象之续
- 腾讯的一道面试题—不用除法求数字乘积
- SQL Server数据类型
- Telnet无法启动 的解决方法
- 浤济类-〉金额转换(数字=中文)互换(全)
- adb logcat 查看日志
- Android 4.0 framework源码修改编译,模拟器运行不起来——解决
- VS2010 继承目录编辑
- Oracle中批量删除数据
- 在Visual Studio 2010中配置VC++目录
- Oracle中大批量删除数据的方法(通过主键删除)
- C语言的const关键字与指针搭配使用
- 举例说明在android中用PhoneStateListener监听手机电话状态与用发送邮件来通知来电电话的号码