数字转汉字函数(转自http://www.cnblogs.com/haoxiaobo/archive/2005/01/11/89922.html)
2006-11-18 14:01
736 查看
using System;
using System.Collections;
using System.IO;
using System.Text;
namespace HXBTools.Util
{
/**//// <summary>
/// 用于将一个数值型转化为汉语的读法.
/// </summary>
public class NumberToChn
{
public NumberToChn()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static string GetChn(decimal dc, bool bUpper)
{
return GetChn(dc.ToString(), bUpper);
}
public static string GetChn(int i, bool bUpper)
{
return GetChn(i.ToString(), bUpper);
}
public static string GetChn(long l, bool bUpper)
{
return GetChn(l.ToString(), bUpper);
}
public static string GetRMBChn(string sDigital, bool bUpper)
{
// 找出第一个点所在的位置,之前的部分用getchn来处理,之后的部分自已处理.
if (sDigital == null | sDigital.Length == 0)
return "";
int iIndex = sDigital.IndexOf(".");
string sIntPart;
string sDecPart;
if (iIndex == -1)
{
sIntPart = sDigital;
sDecPart = "";
}
else
{
sIntPart = sDigital.Substring(0, iIndex);
sDecPart = sDigital.Substring(iIndex+1);
}
StringBuilder sb = new StringBuilder(sDigital.Length * 2 + 10);
foreach(char c in sDecPart)
{
if ( char.IsDigit(c))
{
sb.Append(c);
}
}
sDecPart = sb.ToString();
sb.Length = 0;
string sTmp = GetChn(sIntPart, bUpper);
if (sTmp != "零" && sTmp.Length != 0)
{
sb.Append(sTmp);
sb.Append(bUpper?'园':'元');
}
bool bPrevIsZero = false;
if (sIntPart.Length > 0 && sIntPart.EndsWith("0") && sb.Length > 1)
{
bPrevIsZero = true;
}
for (int i = 0; i < sDecPart.Length && i < arRMBRight.Length; i ++)
{
if (sDecPart[i] == '0')
{
bPrevIsZero = true;
}
else
{
if (bPrevIsZero == true)
{
sb.Append('零');
bPrevIsZero = false;
}
sb.Append(bUpper?arDigitals2[sDecPart[i] - '0']:arDigitals[sDecPart[i] - '0']);
sb.Append(arRMBRight[i]);
}
}
if (sb.Length > 0)
{
sb.Append('整');
}
else
{
sb.Append(bUpper?"零园整":"零元整");
}
return sb.ToString();
}
public static string GetChn(string s, bool bUpper)
{
// 先将s过滤,删除所有的非数字字符。
if (s == null || s.Trim().Length == 0)
return "";
StringBuilder sb = new StringBuilder(s.Length);
int iPointCount = 0;
for(int i = 0; i < s.Length; i ++)
{
char c = s[i];
if (Char.IsDigit(c))
{
sb.Append(c);
}
else if (c == '.')
{
// 如果是第二个之后的点,那么不管了。
if (iPointCount == 0)
{
sb.Append(c);
iPointCount ++;
}
}
else if( c == '-' && i == 0)
{
sb.Append(c);
}
else
{
// 省下的全部忽略
}
}
string sDigital = sb.ToString();
if (sDigital.EndsWith("."))
{
sDigital = sDigital.Substring(0,sDigital.Length - 1);
}
if (sDigital.Length == 0)
{
sDigital = "0";
}
sb.Length = 0; // 留为后用。
// 从小数点前后分为两部分
int iTmp = sDigital.IndexOf('.');
string sIntPart;
string sDecimalPart;
if (iTmp == -1)
{
sIntPart = sDigital;
sDecimalPart = "";
}
else
{
sIntPart = sDigital.Substring(0, iTmp);
sDecimalPart = sDigital.Substring(iTmp+1);
}
// 处理小数点之前的部分
// 先决定最高位是什么位,再依次地向后拼出。
// 大循环是亿的个数, 小循环是万的个数。
sb = new StringBuilder(sDigital.Length * 2 + 6);
if (sDigital.StartsWith("-"))
{
sb.Append("负");
sIntPart = sIntPart.Substring(1);
}
// 如果小数点之后没有内容,之前部分又是空,那么不输出.
if (sIntPart.Length == 0 && sDecimalPart.Length == 0)
{
return "";
}
int iBitCntInWan = 0;
bool bPrevIs0 = false;
int iWanNotZeroCnt = 0;
int iNotZeroCnt = 0;
for (int i = 0; i < sIntPart.Length; i ++)
{
int iBitCnt = sIntPart.Length - i -1;
char cNum = sIntPart[i];
if (cNum == '0')
{
// 如果是零,那么不处理
bPrevIs0 = true;
}
else
{
if (bPrevIs0)
{
// 如果上一个是0
if(iNotZeroCnt > 0)
{
//如果不是第一个字 那么加一个零字
sb.Append(bUpper?arDigitals2[0]:arDigitals[0]);
}
}
iWanNotZeroCnt ++;
iNotZeroCnt ++;
bPrevIs0 = false;
sb.Append(bUpper?arDigitals2[cNum - '0']:arDigitals[cNum - '0']); // 加数名
iBitCntInWan = iBitCnt % 4;
if (iBitCntInWan != 0)
{
sb.Append(bUpper?arRights2[iBitCntInWan]:arRights[iBitCntInWan]); // 加权名
}
}
if (iBitCnt % 8 == 0)
{
// 遇亿的处理
if (iBitCnt / 8 >= 1 && iNotZeroCnt > 0 )
sb.Append('亿');
bPrevIs0 = false;
iWanNotZeroCnt = 0;
}
else if (iBitCnt % 4 == 0)
{
// 遇万位的处理
if ((iBitCnt % 8)/4 >= 1 && iWanNotZeroCnt > 0 )
{
sb.Append('万');
}
bPrevIs0 = false;
iWanNotZeroCnt = 0;
}
}
// 如果全部都是0,那么输出一个"零".
if (iNotZeroCnt == 0)
{
sb.Append("零");
}
// 处理小数点之后的部分
if(sDecimalPart.Length != 0)
{
sb.Append("点");
for(int i = 0; i < sDecimalPart.Length; i ++)
{
sb.Append(bUpper?arDigitals2[sDecimalPart[i]-'0']:arDigitals[sDecimalPart[i]-'0']);
}
}
iTmp = 0;
if (sb[0] == '负')
{
iTmp =1;
}
// 把起头的"一十"改为"拾".
if (sb.Length >= 2)
{
if (sb[iTmp] == (bUpper?arDigitals2[1]:arDigitals[1]) &&
sb[iTmp + 1] == (bUpper?arRights2[1]:arRights[1]))
{
sb.Remove(iTmp,1);
}
}
return sb.ToString();
}
private static char [] arRights = {' ', '十', '百', '千'}; // 权名
private static char [] arRights2 = {' ', '拾', '佰', '仟'}; // 权名
private static char [] arDigitals = {
'零','一','二','三','四','五','六','七','八','九'
};
private static char [] arDigitals2= {
'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
};
private static char [] arRMBRight = {'角', '分', '厘', '毫', '丝'};
}
}
using System.Collections;
using System.IO;
using System.Text;
namespace HXBTools.Util
{
/**//// <summary>
/// 用于将一个数值型转化为汉语的读法.
/// </summary>
public class NumberToChn
{
public NumberToChn()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static string GetChn(decimal dc, bool bUpper)
{
return GetChn(dc.ToString(), bUpper);
}
public static string GetChn(int i, bool bUpper)
{
return GetChn(i.ToString(), bUpper);
}
public static string GetChn(long l, bool bUpper)
{
return GetChn(l.ToString(), bUpper);
}
public static string GetRMBChn(string sDigital, bool bUpper)
{
// 找出第一个点所在的位置,之前的部分用getchn来处理,之后的部分自已处理.
if (sDigital == null | sDigital.Length == 0)
return "";
int iIndex = sDigital.IndexOf(".");
string sIntPart;
string sDecPart;
if (iIndex == -1)
{
sIntPart = sDigital;
sDecPart = "";
}
else
{
sIntPart = sDigital.Substring(0, iIndex);
sDecPart = sDigital.Substring(iIndex+1);
}
StringBuilder sb = new StringBuilder(sDigital.Length * 2 + 10);
foreach(char c in sDecPart)
{
if ( char.IsDigit(c))
{
sb.Append(c);
}
}
sDecPart = sb.ToString();
sb.Length = 0;
string sTmp = GetChn(sIntPart, bUpper);
if (sTmp != "零" && sTmp.Length != 0)
{
sb.Append(sTmp);
sb.Append(bUpper?'园':'元');
}
bool bPrevIsZero = false;
if (sIntPart.Length > 0 && sIntPart.EndsWith("0") && sb.Length > 1)
{
bPrevIsZero = true;
}
for (int i = 0; i < sDecPart.Length && i < arRMBRight.Length; i ++)
{
if (sDecPart[i] == '0')
{
bPrevIsZero = true;
}
else
{
if (bPrevIsZero == true)
{
sb.Append('零');
bPrevIsZero = false;
}
sb.Append(bUpper?arDigitals2[sDecPart[i] - '0']:arDigitals[sDecPart[i] - '0']);
sb.Append(arRMBRight[i]);
}
}
if (sb.Length > 0)
{
sb.Append('整');
}
else
{
sb.Append(bUpper?"零园整":"零元整");
}
return sb.ToString();
}
public static string GetChn(string s, bool bUpper)
{
// 先将s过滤,删除所有的非数字字符。
if (s == null || s.Trim().Length == 0)
return "";
StringBuilder sb = new StringBuilder(s.Length);
int iPointCount = 0;
for(int i = 0; i < s.Length; i ++)
{
char c = s[i];
if (Char.IsDigit(c))
{
sb.Append(c);
}
else if (c == '.')
{
// 如果是第二个之后的点,那么不管了。
if (iPointCount == 0)
{
sb.Append(c);
iPointCount ++;
}
}
else if( c == '-' && i == 0)
{
sb.Append(c);
}
else
{
// 省下的全部忽略
}
}
string sDigital = sb.ToString();
if (sDigital.EndsWith("."))
{
sDigital = sDigital.Substring(0,sDigital.Length - 1);
}
if (sDigital.Length == 0)
{
sDigital = "0";
}
sb.Length = 0; // 留为后用。
// 从小数点前后分为两部分
int iTmp = sDigital.IndexOf('.');
string sIntPart;
string sDecimalPart;
if (iTmp == -1)
{
sIntPart = sDigital;
sDecimalPart = "";
}
else
{
sIntPart = sDigital.Substring(0, iTmp);
sDecimalPart = sDigital.Substring(iTmp+1);
}
// 处理小数点之前的部分
// 先决定最高位是什么位,再依次地向后拼出。
// 大循环是亿的个数, 小循环是万的个数。
sb = new StringBuilder(sDigital.Length * 2 + 6);
if (sDigital.StartsWith("-"))
{
sb.Append("负");
sIntPart = sIntPart.Substring(1);
}
// 如果小数点之后没有内容,之前部分又是空,那么不输出.
if (sIntPart.Length == 0 && sDecimalPart.Length == 0)
{
return "";
}
int iBitCntInWan = 0;
bool bPrevIs0 = false;
int iWanNotZeroCnt = 0;
int iNotZeroCnt = 0;
for (int i = 0; i < sIntPart.Length; i ++)
{
int iBitCnt = sIntPart.Length - i -1;
char cNum = sIntPart[i];
if (cNum == '0')
{
// 如果是零,那么不处理
bPrevIs0 = true;
}
else
{
if (bPrevIs0)
{
// 如果上一个是0
if(iNotZeroCnt > 0)
{
//如果不是第一个字 那么加一个零字
sb.Append(bUpper?arDigitals2[0]:arDigitals[0]);
}
}
iWanNotZeroCnt ++;
iNotZeroCnt ++;
bPrevIs0 = false;
sb.Append(bUpper?arDigitals2[cNum - '0']:arDigitals[cNum - '0']); // 加数名
iBitCntInWan = iBitCnt % 4;
if (iBitCntInWan != 0)
{
sb.Append(bUpper?arRights2[iBitCntInWan]:arRights[iBitCntInWan]); // 加权名
}
}
if (iBitCnt % 8 == 0)
{
// 遇亿的处理
if (iBitCnt / 8 >= 1 && iNotZeroCnt > 0 )
sb.Append('亿');
bPrevIs0 = false;
iWanNotZeroCnt = 0;
}
else if (iBitCnt % 4 == 0)
{
// 遇万位的处理
if ((iBitCnt % 8)/4 >= 1 && iWanNotZeroCnt > 0 )
{
sb.Append('万');
}
bPrevIs0 = false;
iWanNotZeroCnt = 0;
}
}
// 如果全部都是0,那么输出一个"零".
if (iNotZeroCnt == 0)
{
sb.Append("零");
}
// 处理小数点之后的部分
if(sDecimalPart.Length != 0)
{
sb.Append("点");
for(int i = 0; i < sDecimalPart.Length; i ++)
{
sb.Append(bUpper?arDigitals2[sDecimalPart[i]-'0']:arDigitals[sDecimalPart[i]-'0']);
}
}
iTmp = 0;
if (sb[0] == '负')
{
iTmp =1;
}
// 把起头的"一十"改为"拾".
if (sb.Length >= 2)
{
if (sb[iTmp] == (bUpper?arDigitals2[1]:arDigitals[1]) &&
sb[iTmp + 1] == (bUpper?arRights2[1]:arRights[1]))
{
sb.Remove(iTmp,1);
}
}
return sb.ToString();
}
private static char [] arRights = {' ', '十', '百', '千'}; // 权名
private static char [] arRights2 = {' ', '拾', '佰', '仟'}; // 权名
private static char [] arDigitals = {
'零','一','二','三','四','五','六','七','八','九'
};
private static char [] arDigitals2= {
'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
};
private static char [] arRMBRight = {'角', '分', '厘', '毫', '丝'};
}
}
相关文章推荐
- static作用(修饰函数、局部变量、全局变量)转自http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html
- 转载TortoiseSVN的使用详解1(http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html)
- http详解(http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html)
- http://www.cnblogs.com/haojianwei/archive/2010/03/02/1676707.html
- 转载TortoiseSVN的使用详解1(http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html)
- 函数调用分析 http://www.cnblogs.com/bangerlee/archive/2012/05/22/2508772.html
- 常用Oracle分析函数详解 [http://www.cnblogs.com/benio/archive/2011/06/01/2066106.html]
- 转载:小白鼠与毒药 http://www.cnblogs.com/pangxiaodong/archive/2011/10/23/2221690.html
- ASP常用的函数模块 http://www.cnblogs.com/cnnix/archive/2006/07/16/452286.html
- 转载TortoiseSVN的使用详解2(http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html)
- PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数【链接:http://www.cnblogs.com/baochuan/archive/2012/03/31/2425441.html】
- C++析构函数为什么要为虚函数 http://www.cnblogs.com/lixiaohui-ambition/archive/2012/07/13/2589716.html
- mysql的字符串函数 http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/12/13/1904330.html 对于针对字符串位置的操作,
- 转载TortoiseSVN的使用详解2(http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html)
- exit()和_exit()函数 http://www.cnblogs.com/hnrainll/archive/2011/08/17/2142001.html
- Php魔术方法(http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/22/2185034.html)
- c++ 函数入栈 顺序 转http://www.cnblogs.com/Atela/archive/2011/04/13/2015010.html
- 二叉搜索树-BST-查找算法-插入算法-删除算法 http://www.cnblogs.com/pangxiaodong/archive/2011/08/24/2151060.html
- 转载TortoiseSVN的使用详解3(http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html)
- http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html