知识大全 C#纯数学方法递归实现货币数字转换中文

Posted 数字

篇首语:幼敏悟过人,读书辄成诵。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#纯数学方法递归实现货币数字转换中文相关的知识,希望对你有一定的参考价值。

C#纯数学方法递归实现货币数字转换中文  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  最近由于项目的原因 需要写一个货币数字转换中文的算法 先在网了找了一下 结果发现无一列外都是用(Replace)替换的方式来实现的 所以想写个另外的算法 因为本人是学数学出身的 所以用纯数学的方法实现

  注意 本文中的算法支持小于 (也就是 亿兆)货币数字转化

  货币中文说明 在说明代码之前 首先让我们回顾一下货币的读法

     读为 壹仟零贰万零贰元贰角三分            读为 壹仟零贰拾元整           读为 拾万元整            读为 壹角三分

  

  代码

  测试工程  static void Main(string[] args)

  Console WriteLine( 请输入金额 );string inputNum = Console ReadLine();while (inputNum != exit )

  //货币数字转化类NumCast nc = new NumCast();

  if (nc IsValidated<string>(inputNum))trystring chineseCharacter = nc ConvertToChinese(inputNum);Console WriteLine(chineseCharacter);catch (Exception er)Console WriteLine(er Message);elseConsole WriteLine( 不合法的数字或格式 );

  Console WriteLine( \\n请输入金额 );inputNum = Console ReadLine();

  Console ReadLine();

  测试结果如下

  货币转化类(NumCast类)功能介绍

   常量的规定 /// <summary>/// 数位/// </summary>public enum NumLevel Cent Chiao Yuan Ten Hundred Thousand TenThousand hundredMillon Trillion ;

  /// <summary>/// 数位的指数/// </summary>private int[] NumLevelExponent = new int[] ;

  /// <summary>/// 数位的中文字符/// </summary>private string[] NumLeverChineseSign = new string[] 分 角 元 拾 佰 仟 万 亿 兆 ;

  /// <summary>/// 大写字符/// </summary>private string[] NumChineseCharacter = new string[] 零 壹 贰 三 肆 伍 陆 柒 捌 玖 ;

  /// <summary>/// 整(当没有 角分 时)/// </summary>

  private const string EndOfInt = 整 ;

   数字合法性验证 采用正则表达式验证 /// <summary>/// 正则表达验证数字是否合法/// </summary>/// <param name= Num ></param>/// <returns></returns>public bool IsValidated<T>(T Num)Regex reg = new Regex(@ ^(([ ])|([ ]\\d ))(\\ \\d )?$ );if (reg IsMatch(Num ToString()))return true;

  return false;

   获取数位 例如 的数位为 NumLevel Thousand

  /// <summary>/// 获取数字的数位 使用log/// </summary>/// <param name= Num ></param>/// <returns></returns>private NumLevel GetNumLevel(double Num)double numLevelLength;NumLevel NLvl = new NumLevel();if (Num > )numLevelLength = Math Floor(Math Log (Num));for (int i = NumLevelExponent Length ; i >= ; i )if (numLevelLength >= NumLevelExponent[i])NLvl = (NumLevel)i;break;elseNLvl = NumLevel Yuan;return NLvl;

  

   判断数字之间是否有跳位 也就是中文中间是否要加零 例如 就应该加零  /// <summary>/// 是否跳位/// </summary>/// <returns></returns>private bool IsDumpLevel(double Num) if (Num > )NumLevel? currentLevel = GetNumLevel(Num);NumLevel? nextLevel = null;int numExponent = this NumLevelExponent[(int)currentLevel];

  double postfixNun = Math Round(Num % (Math Pow( numExponent)) );if(postfixNun> )nextLevel = GetNumLevel(postfixNun);if (currentLevel != null && nextLevel != null)if (currentLevel > nextLevel + )return true;return false;

  

   把长数字分割为两个较小的数字数组 例如把 亿兆 分割为 亿和 兆

  因为计算机不支持过长的数字  /// <summary>/// 是否大于兆 如果大于就把字符串分为两部分 /// 一部分是兆以前的数字/// 另一部分是兆以后的数字/// </summary>/// <param name= Num ></param>/// <returns></returns>private bool IsBigThanTillion(string Num)bool isBig = false;if (Num IndexOf( ) != )//如果大于兆if (Num IndexOf( ) > NumLevelExponent[(int)NumLevel Trillion])isBig = true;else//如果大于兆if (Num Length > NumLevelExponent[(int)NumLevel Trillion])isBig = true;return isBig;

  /// <summary>/// 把数字字符串由 兆 分开两个/// </summary>/// <returns></returns>private double[] SplitNum(string Num)//兆的开始位double[] TillionLevelNums = new double[ ];int trillionLevelLength;if (Num IndexOf( ) == )trillionLevelLength = Num Length NumLevelExponent[(int)NumLevel Trillion];elsetrillionLevelLength = Num IndexOf( ) NumLevelExponent[(int)NumLevel Trillion];//兆以上的数字TillionLevelNums[ ] = Convert ToDouble(Num Substring( trillionLevelLength));//兆以下的数字TillionLevelNums[ ] = Convert ToDouble(Num Substring(trillionLevelLength ));return TillionLevelNums;

   是否以 壹拾 开头 如果是就可以把它变为 拾   bool isStartOfTen = false;while (Num >= )if (Num == )isStartOfTen = true;break;//Num的数位NumLevel currentLevel = GetNumLevel(Num);

  int numExponent = this NumLevelExponent[(int)currentLevel];Num = Convert ToInt (Math Floor(Num / Math Pow( numExponent)));if (currentLevel == NumLevel Ten && Num == )isStartOfTen = true;break;return isStartOfTen;

   合并大于兆连个数组转化成的货币字符串

  /// <summary>/// 合并分开的数组中文货币字符/// </summary>/// <param name= tillionNums ></param>/// <returns></returns>private string ContactNumChinese(double[] tillionNums)string uptillionStr = CalculateChineseSign(tillionNums[ ] NumLevel Trillion true IsStartOfTen(tillionNums[ ]));string downtrillionStr = CalculateChineseSign(tillionNums[ ] null true false);string chineseCharactor = string Empty;//分开后的字符是否有跳位if (GetNumLevel(tillionNums[ ] * ) == NumLevel Trillion)chineseCharactor = uptillionStr + NumLeverChineseSign[(int)NumLevel Trillion] + downtrillionStr;elsechineseCharactor = uptillionStr + NumLeverChineseSign[(int)NumLevel Trillion];if (downtrillionStr != 零元整 )chineseCharactor += NumChineseCharacter[ ] + downtrillionStr;elsechineseCharactor += 元整 ;return chineseCharactor;

  

   递归计算货币数字的中文 /// <summary>/// 计算中文字符串/// </summary>/// <param name= Num >数字</param>/// <param name= NL >数位级别 比如 万的 数位级别为万</param>/// <param name= IsExceptTen >是否以 壹拾 开头</param>/// <returns>中文大写</returns>public string CalculateChineseSign(double Num NumLevel? NL bool IsDump bool IsExceptTen)Num = Math Round(Num );bool isDump = false;//Num的数位NumLevel? currentLevel = GetNumLevel(Num);int numExponent = this NumLevelExponent[(int)currentLevel];

  string Result = string Empty;

  //整除后的结果int prefixNum;//余数 当为小数的时候 分子分母各乘 double postfixNun ;if (Num >= )prefixNum = Convert ToInt (Math Floor(Num / Math Pow( numExponent)));postfixNun = Math Round(Num % (Math Pow( numExponent)) );elseprefixNum = Convert ToInt (Math Floor(Num* / Math Pow( numExponent+ )));postfixNun = Math Round(Num * % (Math Pow( numExponent + )) );postfixNun *= ;

  if (prefixNum < )//避免以 壹拾 开头if (!(NumChineseCharacter[(int)prefixNum] == NumChineseCharacter[ ]&& currentLevel == NumLevel Ten && IsExceptTen))Result += NumChineseCharacter[(int)prefixNum];elseIsExceptTen = false;//加上单位if (currentLevel == NumLevel Yuan )////当为 元 位不为零时 加 元 if (NL == null)Result += NumLeverChineseSign[(int)currentLevel];//当小数点后为零时 加 整 if (postfixNun == )Result += EndOfInt;elseResult += NumLeverChineseSign[(int)currentLevel]; //当真正的个位为零时 加上 元 if (NL == null && postfixNun < && currentLevel > NumLevel Yuan && postfixNun > )Result += NumLeverChineseSign[(int)NumLevel Yuan];

  

  else//当 前缀数字未被除尽时 递归下去NumLevel? NextNL = null;if ((int)currentLevel >= (int)(NumLevel TenThousand))NextNL = currentLevel;

  Result += CalculateChineseSign((double)prefixNum NextNL isDump IsExceptTen);if ((int)currentLevel >= (int)(NumLevel TenThousand))Result += NumLeverChineseSign[(int)currentLevel];

  //是否跳位// 判断是否加零 比如 就要给三百 后面加零 变为 三百零二 if (IsDumpLevel(Num))Result += NumChineseCharacter[ ];isDump = true;

  

  //余数是否需要递归if (postfixNun > )Result += CalculateChineseSign(postfixNun NL isDump false);else if (postfixNun == && currentLevel > NumLevel Yuan )//当数字是以零元结尾的加上 元整 比如 一百万元整if (NL == null)Result += NumLeverChineseSign[(int)NumLevel Yuan];Result += EndOfInt;

  return Result;

   外部调用的转换方法

  /// <summary>/// 外部调用的转换方法/// </summary>/// <param name= Num ></param>/// <returns></returns>public string ConvertToChinese(string Num)

  if (!IsValidated<string>(Num))throw new OverflowException( 数值格式不正确 请输入小于 亿兆的数字且最多精确的分的金额! );string chineseCharactor = string Empty;if (IsBigThanTillion(Num))double[] tillionNums = SplitNum(Num);chineseCharactor = ContactNumChinese(tillionNums);elsedouble dNum = Convert ToDouble(Num);chineseCharactor = CalculateChineseSign(dNum null true IsStartOfTen(dNum));return chineseCharactor;

  小结

  个人认为程序的灵魂是算法 大到一个系统中的业务逻辑 小到一个货币数字转中文的算法 处处都体现一种逻辑思想

cha138/Article/program/net/201311/13101

相关参考

知识大全 C#中数字金额转换大写金额方法

C#中数字金额转换大写金额方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 如何将C#时间格式转换为中文格式

如何将C#时间格式转换为中文格式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首先使用Java

知识大全 互联网数字货币是什么允是不是骗人的

互联网数字货币是什么允是不是骗人的,互联网数字货币是什么?互联网货币,又称为虚拟货币、数字货币或者电子货币,这与我们现实中使用的货币全然不同。在“互联网社会形态”里,人们根据自己的需求成立或者参与社区

知识大全 进行数字货币交易需要注意什么

进行数字货币交易需要注意什么?火星数字资产为朋友提供精准的数字资产怎么在云联网进行数字货币交易呢?登陆云联网之后,先注册一下,注册之后在进到官网,有个交易中心,到上面就可以交易了,很是简单的哦都是在哪

知识大全 数字货币投资究竟靠不靠谱?

数字货币投资究竟靠不靠谱?主流货币还是靠谱的,所有投资都有风险,用不影响生活的部分来投资是完全可以的。想投资不知道投什么可以交流交流期货配资究竟靠不靠谱这要看你的操盘实力了。靠谱的期货公司不少。盈利是

知识大全 利用C#转换图片格式,还可转换为ico

利用C#转换图片格式,还可转换为ico  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  注意:转换

知识大全 C#转换图片文件格式

C#转换图片文件格式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  将图片转换为另一种格式的图像

知识大全 Visual C#接口转换

VisualC#接口转换  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#中不仅支持Net平台

知识大全 C# 让TextBox只允许输入数字

C#让TextBox只允许输入数字  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  publicc

知识大全 C#中只接受数字输入的控件

C#中只接受数字输入的控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在MFC里需要获取文本