using System;using System.Text;using System.Text.RegularExpressions;
namespace HKH.Common{ /// <summary> /// 人民币大小写格式转换 /// </summary> /// <remarks> Create By Lwt on 2006/09/23 /// </remarks> public class clsRMB { private clsRMB() { }
#region 格式化
/// <summary> /// 格式化(大写转小写) /// </summary> /// <param name="strRMB"></param> /// <returns></returns> public static double Format(string strRMB) { try { //正则表达式,验证第一位是否阿拉伯数字,确定转换格式 //1.5亿----混写格式 if(Regex.IsMatch(strRMB,"^//d")) { //去掉元单位 strRMB = Regex.Replace(strRMB,"元|圆",""); char temp = strRMB[strRMB.Length - 1]; if ( '万' == temp || '亿' == temp || '萬' == temp ) { return Convert.ToDouble(strRMB.Substring(0,strRMB.Length - 1)) * Math.Pow(10,GetExp(temp)); } else { return Convert.ToDouble(strRMB); } } //壹亿伍千万-----大写格式 else { return Eval(strRMB); }
} catch { return -1; } }
/// <summary> /// 格式化(小写转大写) /// </summary> /// <param name="numRMB"></param> /// <returns></returns> public static string Format(double numRMB) { try { if( 0 == numRMB) return "零元整";
StringBuilder szRMB = new StringBuilder();
//乘100以格式成整型,便于处理 ulong iRMB = Convert.ToUInt64(numRMB * 100);
szRMB.Insert(0,ToUpper(Convert.ToInt32(iRMB % 100),-2)); //去掉原来的小数位 iRMB = iRMB / 100;
int iUnit = 0;
//以每4位为一个单位段进行处理,所以下边除以10000 while( 0 != iRMB ) { szRMB.Insert(0,ToUpper(Convert.ToInt32(iRMB % 10000),iUnit )); iRMB = iRMB / 10000; iUnit += 4; } szRMB.Replace("元零整","元整"); szRMB.Replace("零元","元");
//格式修正 string strRMB = Regex.Replace(szRMB.ToString(),"零+","零");
return strRMB.Trim('零'); } catch { return ""; } }
#endregion
#region 私有方法
/// <summary> /// 计算表达式(大写表达式求值) /// </summary> /// <param name="strRMB"></param> /// <returns></returns> private static double Eval(string strRMB) { try { if ( null == strRMB ) return 0;
strRMB = Replace(strRMB,false);
if ( "" == strRMB ) return 0;
#region 利用位权进行计算
//基础指数 int basicExp = 0; //当前指数 int currExp = 0;
double numRMB = 0;
for(int i = strRMB.Length - 1; i > -1 ; i --) { char temp = strRMB[i];
if ( '元' == temp || '万' == temp || '亿' == temp || '萬' == temp || '圆' == temp ) { basicExp = GetExp(temp); currExp = 0;
continue; } else { if(Regex.IsMatch(temp.ToString(),"^//d")) { numRMB = numRMB + Convert.ToInt32(temp.ToString()) * Math.Pow(10,(basicExp + currExp)); } else { currExp = GetExp(temp); }
} }
#endregion
return numRMB; } catch { return -1; } }
/// <summary> /// 计算表达式(小写数值求大写字符串) /// </summary> /// <param name="numRMB"></param> /// <param name="iUnit"></param> /// <returns></returns> private static string ToUpper(int numRMB,int iUnit) { try { if( 0 == numRMB ) { if ( -2 == iUnit ) { return "整"; } if ( 0 == iUnit ) { return "元"; }
return "零"; }
StringBuilder szRMB = new StringBuilder();
string strRMB = ""; #region 对角/分做特殊处理
if ( -2 == iUnit ) { int jiao = numRMB / 10; int fen = numRMB % 10;
if (jiao > 0) { szRMB.Append(jiao); szRMB.Append(GetUnit(-1));
if ( fen > 0) { szRMB.Append(fen); szRMB.Append(GetUnit(-2)); } } else { szRMB.Append(fen); szRMB.Append(GetUnit(-2)); }
return Replace(szRMB.ToString(),true); }
#endregion
#region 以下为整数部分正常处理
strRMB = numRMB.ToString("0000");
//前一位是否是0 bool hasZero = false; for ( int i = 0; i < strRMB.Length; i++ ) { //只有四位,最高位为‘千’,所以下边的3-i为单位修正 if ( ( 3-i ) > 0) { if( '0' != strRMB[i] ) { szRMB.Append(strRMB[i]); szRMB.Append(GetUnit( 3-i )); hasZero = false; } else { if( !hasZero ) szRMB.Append(strRMB[i]);
hasZero = true; } } //最后一位,特别格式处理 //如最后一位是零,则单位应在零之前 else { if( '0' != strRMB[i] ) { szRMB.Append(strRMB[i]); szRMB.Append(GetUnit( iUnit )); hasZero = false; } else { if( hasZero ) { szRMB.Insert(szRMB.Length - 1,GetUnit( iUnit )); } else { szRMB.Append(GetUnit( iUnit )); szRMB.Append(strRMB[i]); } } } }
//转换大写后返回 return Replace(szRMB.ToString(),true);
#endregion } catch { return ""; } }
///以下代码可以独立封装成类,上面只封装算法,成策略模式使用,可扩展性更加完美
/// <summary> /// 将中文大写换成阿拉伯数字 /// </summary> /// <param name="strRMB"></param> /// <param name="toUpper">true--转换为大写/false--转换为小写</param> /// <returns></returns> private static string Replace(string strRMB,bool toUpper) { if(toUpper) { strRMB = strRMB.Replace("0","零"); strRMB = strRMB.Replace("1","壹"); strRMB = strRMB.Replace("2","贰"); strRMB = strRMB.Replace("3","叁"); strRMB = strRMB.Replace("4","肆"); strRMB = strRMB.Replace("5","伍"); strRMB = strRMB.Replace("6","陆"); strRMB = strRMB.Replace("7","柒"); strRMB = strRMB.Replace("8","捌"); strRMB = strRMB.Replace("9","玖"); } else { strRMB = strRMB.Replace("零","0"); strRMB = strRMB.Replace("壹","1"); strRMB = strRMB.Replace("贰","2"); strRMB = strRMB.Replace("叁","3"); strRMB = strRMB.Replace("肆","4"); strRMB = strRMB.Replace("伍","5"); strRMB = strRMB.Replace("陆","6"); strRMB = strRMB.Replace("柒","7"); strRMB = strRMB.Replace("捌","8"); strRMB = strRMB.Replace("玖","9"); } return strRMB; }
/// <summary> /// 获取单位名称 /// </summary> /// <param name="iCode"></param> /// <returns></returns> private static string GetUnit(int iCode) { switch(iCode) { case -2: return "分"; case -1: return "角"; case 0: return "元"; case 1: return "拾"; case 2: return "佰"; case 3: return "仟"; case 4: return "萬"; case 8: return "亿"; default: return ""; } }
/// <summary> /// 获取位权指数 /// </summary> /// <param name="cUnit"></param> /// <returns></returns> private static int GetExp(char cUnit ) { switch(cUnit) { case '分': return -2; case '角': return -1; case '元': case '圆': return 0; case '十': case '拾': return 1; case '百': case '佰': return 2; case '千': case '仟': return 3; case '万': case '萬': return 4; case '亿': return 8; default: return 0; } }
#endregion
}}