数字转换汉字串
来源:互联网 发布:21天学会javascript 编辑:程序博客网 时间:2024/05/22 03:21
/// <summary> /// 数字转大写汉字字符类 /// </summary>
/// [DebuggerStepThrough]
public class NumericConvert
{
#region Private Fields
/// <summary>
/// /// 段的分隔字符,从低到高依次增加:空、万、亿、万亿,最高不超过万亿的数字都可以 /// </summary>
public static readonly string[] DefaultRangeNumeric = new string[] { string.Empty, "万", "亿", "兆" };
/// <summary> /// 位的分隔字符,从低到高依次是:仟、佰、拾、空 /// </summary>
public static readonly char[] DefaultUnitNumeric = new char[] { '仟', '佰', '拾', char.MinValue };
/// <summary> /// 数字替换的字符,从低到高依次是:零、壹、贰、叁、肆、伍、陆、柒、捌、玖 /// </summary>
public static readonly char[] DefaultCharNumeric = new char[] { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
private char[] charNumeric = DefaultCharNumeric;
private string[] rangeNumeric = DefaultRangeNumeric;
private char zeroNumeric = DefaultCharNumeric[0];
private char[] unitNumeric = DefaultUnitNumeric;
#endregion
#region Business Methods /// <summary> /// 重置数字替换的字符,必须从小到大是 10 个汉字字符。 /// </summary>
/// <param name="data">目标字符数组</param> /// <returns>成功替换则返回 <c>true</c> 。</returns>
public bool ResetCharNumeric(char[] data)
{
if (data == null || data.Length != 10)
return false;
charNumeric = data;
zeroNumeric = data[0];
return true;
}
/// <summary> /// 重置位的分隔字符,必须从小到大是 4 个汉字字符。 /// </summary>
/// /// <param name="data">目标字符数组</param>
/// /// <returns>成功替换则返回 <c>true</c> 。</returns>
public bool ResetUnitNumeric(char[] data)
{
if (data == null || data.Length != 4)
return false;
unitNumeric = data;
return true;
}
/// <summary> /// 重置段的分隔字符。 /// </summary> /// <param name="data">目标字符数组</param>
public void ResetRangeNumeric(string[] data)
{
rangeNumeric = data ?? DefaultRangeNumeric;
}
/// <summary> /// 执行数字转大写汉字字符的操作。 /// </summary>
/// /// <param name="obj">待转换的数字</param> /// <returns>转换完成的大写汉字字符串。</returns>
public string Convert(decimal obj)
{
if (obj > 9999999999999999.99M)
throw new ApplicationException("The numeric too big!");
var data = obj.ToString("#.##");
var list = data.Split('.');
var result = MultiConvert(list[0]);
if (list.Length > 1)
result += DecimalConvert(list[1]);
return result;
}
#endregion
private string MultiConvert(string data)
{
var list = Split(data).ToArray();
var results = new List<string>();
foreach (var item in list)
results.Add(SingleConvert(item));
var sbResult = new StringBuilder();
var len = results.Count; var index = len - 1;
for (int i = 0; i < len; i++)
{
var item = results[i];
if ((i + 2 < len) && item == zeroNumeric.ToString() && results[i + 1].StartsWith(zeroNumeric.ToString()))
continue;
if (!(i == (len - 1) && item == zeroNumeric.ToString()))
sbResult.Append(item);
var unit = rangeNumeric[index - i];
if (unit != string.Empty && item != zeroNumeric.ToString())
sbResult.Append(unit);
}
if (sbResult[sbResult.Length - 1] == zeroNumeric)
sbResult.Remove(sbResult.Length - 1, 1);
sbResult.Append("元");
return sbResult.ToString();
}
private string SingleConvert(string data)
{
var len = data.Length;
var result = new List<char>();
var previousChar = char.MinValue;
var unitIndex = len == 4 ? 0 : (4 - len);
for (int i = 0; i < len; i++)
{
var item = CharToInt(data[i]);
var currentChineseChar = charNumeric[item];
if (currentChineseChar == previousChar && previousChar == zeroNumeric && currentChineseChar == zeroNumeric)
continue;
else
{
result.Add(previousChar = currentChineseChar);
var currentUnit = unitNumeric[unitIndex + i];
if (currentChineseChar != zeroNumeric && currentUnit != char.MinValue)
result.Add(currentUnit);
}
}
if (result.Count != 1 && result.Last() == zeroNumeric)
result.RemoveAt(result.Count - 1);
return new string(result.ToArray());
}
private string DecimalConvert(string data)
{
StringBuilder sbResult = new StringBuilder();
if (data[0] != '0')
{
sbResult.Append(charNumeric[CharToInt(data[0])]);
sbResult.Append("角");
}
if (data[1] != '0')
{
sbResult.Append(charNumeric[CharToInt(data[1])]);
sbResult.Append("分");
}
return sbResult.ToString();
}
private IEnumerable<string> Split(string data)
{
var len = data.Length / 4;
var mod = data.Length % 4;
if (mod != 0)
len += 1;
var startIndex = 0;
var blockLength = mod != 0 ? mod : 4;
for (int i = 0; i < len; i++)
{
yield return data.Substring(startIndex, blockLength);
startIndex += blockLength;
blockLength = 4;
}
}
private int CharToInt(char obj)
{ return ((int)obj) - 48; }
}
例:
NumericConvert mc = new NumericConvert();
var x= mc.Convert(5);
- 数字转换汉字串
- 数字转换汉字大写
- 汉字数字大小写转换
- 汉字数字 转换int
- 数字转换成汉字
- 数字金额转换汉字金额
- 数字转换为大写汉字
- 数字金额转换汉字金额
- Java 数字转换成汉字
- 人民币数字转换为汉字
- 数字转换成大写汉字
- java 数字 转换为 汉字
- 数字转换成汉字大写
- 数字转换成汉字大写
- 数字转换成汉字大写
- 将数字转换为汉字
- 数字金额转换成汉字
- 将数字转换为汉字
- 为什么JAVA要提供 wait/notify 机制?是为了避免轮询带来的性能损失
- 【代码】php 捕捉各大搜索引擎的蜘蛛、爬虫的iP和访问途径
- C++编程思想学习-随笔记录(面向对象概念)
- Linux 技巧:让进程在后台可靠运行的几种方法
- Silverlight商业应用程序开发---从服务器中获取数据之一
- 数字转换汉字串
- Android 高手进阶教程(十三)之----Android 数据库SQLiteDatabase的使用!
- 图片数据Base64编解码(java实现)
- mysql作为hive元数据库读取时提示communication failure
- python爬虫实例—获取北邮教务GPA
- H2 数据库
- editplus格式化xml文档
- 程序员技术练级攻略
- ASP.NET C# 后台输出的带页码的分页函数(不用控件)