读书人

怎么数字转换为中文大写

发布时间: 2012-02-24 16:30:39 作者: rapoo

如何数字转换为中文大写
现有一串阿拉伯数字123456,请设计一个实现方案将其转换为中文大写。例如转换后最终结果为十二万三千四百五十六。


[解决办法]
在精华区里找找,有
[解决办法]
参见:http://www.cnblogs.com/jembai/articles/1266207.html
[解决办法]
http://www.cnblogs.com/datacool/archive/2011/11/07/ExternClassUsing.html
[解决办法]
相当罗嗦。做成一个DLL卖钱吧。哈哈。
[解决办法]
你找出来了。
[解决办法]
还不如建个字库,一一对应,根据阿拉伯数字得出对应中文
[解决办法]

探讨
还不如建个字库,一一对应,根据阿拉伯数字得出对应中文

[解决办法]
static void Main(string[] args)
{

Dictionary<char, string> cc = new Dictionary<char, string>();
cc.Add('0', "零");
cc.Add('1', "一");
cc.Add('2', "二");
cc.Add('3', "三");
cc.Add('4', "四");
cc.Add('5', "五");
cc.Add('6', "六");
cc.Add('7', "七");
cc.Add('8', "八");
cc.Add('9', "九");
string bb = Console.ReadLine();
char [] aa = bb.ToCharArray();
foreach(char aaa in aa){
Console.WriteLine(cc[aaa]);
}

Console.ReadKey();
}
[解决办法]
这是我在精华区里看到的,不是本人写的,但应该可以用
希望可以对楼主有用,实在不行,你到精华区里找找
为了方便,我就给贴出来了

// 数字转换成大写金额
// 例如:(new Money(200)).ToString() == "贰佰元"
namespace Skyiv.Util
{
using System.Text;
class Test
{
static void Main()
{
for (;;)
{
System.Console.Write("金额: ");
string s = System.Console.ReadLine();
decimal m;
try { m = decimal.Parse(s); }
catch { break; }
System.Console.WriteLine("大写: " + new Money(m));
}
}
}
// 该类重载的 ToString() 方法返回的是大写金额字符串
class Money
{
public string Yuan = "元"; // “元”,可以改为“圆”、“卢布”之类
public string Jiao = "角"; // “角”,可以改为“拾”
public string Fen = "分"; // “分”,可以改为“美分”之类
static string Digit = "零壹贰叁肆伍陆柒捌玖"; // 大写数字
bool isAllZero = true; // 片段内是否全零
bool isPreZero = true; // 低一位数字是否是零
bool Overflow = false; // 溢出标志
long money100; // 金额*100,即以“分”为单位的金额
long value; // money100的绝对值
StringBuilder sb = new StringBuilder(); // 大写金额字符串,逆序
// 只读属性: "零元"
public string ZeroString
{
get { return Digit[0] + Yuan; }
}
// 构造函数
public Money(decimal money)
{
try { money100 = (long)(money * 100m); }
catch { Overflow = true; }
if (money100 == long.MinValue) Overflow = true;
}
// 重载 ToString() 方法,返回大写金额字符串
public override string ToString()
{
if (Overflow) return "金额超出范围";
if (money100 == 0) return ZeroString;


string [] Unit = { Yuan, "万", "亿", "万", "亿亿" };
value = System.Math.Abs(money100);
ParseSection(true);
for (int i = 0; i < Unit.Length && value > 0; i++)
{
if (isPreZero && !isAllZero) sb.Append(Digit[0]);
if (i == 4 && sb.ToString().EndsWith(Unit[2]))
sb.Remove(sb.Length - Unit[2].Length, Unit[2].Length);
sb.Append(Unit[i]);
ParseSection(false);
if ((i % 2) == 1 && isAllZero)
sb.Remove(sb.Length - Unit[i].Length, Unit[i].Length);
}
if (money100 < 0) sb.Append("负");
return Reverse();
}
// 解析“片段”: “角分(2位)”或“万以内的一段(4位)”
void ParseSection(bool isJiaoFen)
{
string [] Unit = isJiaoFen ?
new string [] { Fen, Jiao } :
new string [] { "", "拾", "佰", "仟" };
isAllZero = true;
for (int i = 0; i < Unit.Length && value > 0; i++)
{
int d = (int)(value % 10);
if (d != 0)
{
if (isPreZero && !isAllZero) sb.Append(Digit[0]);
sb.AppendFormat("{0}{1}", Unit[i], Digit[d]);
isAllZero = false;
}
isPreZero = (d == 0);
value /= 10;
}
}
[解决办法]
这问题几年前就烂街了...精华区有个n种方法的,我记得有个正则的就两三行代码...
[解决办法]

C# code
//我封装的类如下:using System;using System.Collections.Generic;using System.Text;using System.Text.RegularExpressions;namespace DBUtility{    public class MoneyNumToCNS    {        public static string Get(string Num)        {            string x = double.Parse(Num).ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A");            string y = Regex.Replace(x, @"((?<=-|^)[^1-9]*)|((?'z'0)[0A-E]*((?=[1-9])|(?'-z'(?=[F-L\.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[\.]|$))))", "${b}${z}");            string CHS = Regex.Replace(y, ".", delegate(Match m) { return "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟兆京垓秭穰"[m.Value[0] - '-'].ToString(); });            return CHS;        }    }}
[解决办法]
探讨
static void Main(string[] args)
{

Dictionary<char, string> cc = new Dictionary<char, string>();
cc.Add('0', "零");
cc.Add('1', "一");
cc.Add('2', "二");
cc.Add('3', "三");
cc.Add('4……

[解决办法]
http://download.csdn.net/detail/yyz985/3784392
[解决办法]
http://www.cnblogs.com/jembai/articles/1266207.html
[解决办法]
我写的代码不堪入专业程序员之目,我只关注目标是否达到,其他方面不考虑的,很随意的写法,发表出来难免惹人非议,什么效率问题,非专业问题,资源浪费问题......等等都是问题,程序语句写法很多,都可以达到目标,看我的代码应抱着重思路和逻辑来对待.
像上面那个封装类就可以使用,代码不符合你的需求?只有注意数字位数不要超过兆位(包含小数在内的数字位数)以上就不会出错了.测试中发现问题应该是调用四舍五入函数对数字位数限制造成的,该函数对超过兆以上的数字位数都会执行四舍五入的转化,无论整数还是小数,好像是这样的,可以在软件中限制输入的数字位数就可以了.
[解决办法]
C# code
/// <summary>        /// 把字成的大        /// </summary>        /// <param name="strDigital">textbox内要的字</param>        /// <returns>转换结果</returns>        public string Zhuanhuan(string strDigital)        {            string ret;            decimal dshuzi;            dshuzi = decimal.Parse(strDigital);            if (dshuzi == 0)            {                ret = "零元整";                return ret;            }            string je = dshuzi.ToString("####.00");            if (je.Length > 15)                return "";            je = new String('0', 15 - je.Length) + je;//若小于15位长,前面补0            string stry = je.Substring(0, 4);//取得'亿'单元            string strw = je.Substring(4, 4);//取得'万'单元            string strg = je.Substring(8, 4);//取得'元'单元            string strf = je.Substring(13, 2);//取得小数部分            string str1 = "", str2 = "", str3 = "";            str1 = this.getupper(stry, "亿");//亿单元的大写            str2 = this.getupper(strw, "万");//万单元的大写            str3 = this.getupper(strg, "元");//元单元的大写            string str_y = "", str_w = "";            if (je[3] == '0' || je[4] == '0')//亿和万之间是否有0                str_y = "零";            if (je[7] == '0' || je[8] == '0')//万和元之间是否有0                str_w = "零";            ret = str1 + str_y + str2 + str_w + str3;//亿,万,元的三个大写合并            for (int i = 0; i < ret.Length; i++)//去掉前面的"零"            {                if (ret[i] != '零')                {                    ret = ret.Substring(i);                    break;                }            }            for (int i = ret.Length - 1; i > -1; i--)//去掉最后的"零"            {                if (ret[i] != '零')                {                    ret = ret.Substring(0, i + 1);                    break;                }            }            if (ret[ret.Length - 1] != '元')//若最后不位不是'元',则加一个'元'字                ret = ret + "元";            if (ret == "零零元")//若为零元,则去掉"元数",结果只要小数部分                ret = "";            if (strf == "00")//下面是小数部分的转换            {                ret = ret + "整";            }            else            {                string tmp = "";                tmp = this.getint(strf[0]);                if (tmp == "零")                    ret = ret + tmp;                else                    ret = ret + tmp + "角";                tmp = this.getint(strf[1]);                if (tmp == "零")                    ret = ret + "整";                else                    ret = ret + tmp + "分";            }            if (ret[0] == '零')            {                ret = ret.Substring(1);//防止0.03转为"零叁分",而直接转为"叁分"            }            return ret;//完成,返回        }        /// <summary>        /// 把一个单元转为大写,如亿单元,万单元,个单元        /// </summary>        /// <param name="str">这个单元的小写数字(4位长,若不足,则前面补零)</param>        /// <param name="strDW">亿,万,元</param>        /// <returns>转换结果</returns>        private string getupper(string str, string strDW)        {            if (str == "0000")                return "";            string ret = "";            string tmp1 = this.getint(str[0]);            string tmp2 = this.getint(str[1]);            string tmp3 = this.getint(str[2]);            string tmp4 = this.getint(str[3]);            if (tmp1 != "零")            {                ret = ret + tmp1 + "仟";            }            else            {                ret = ret + tmp1;            }            if (tmp2 != "零")            {                ret = ret + tmp2 + "佰";            }            else            {                if (tmp1 != "零")//保证若有两个零'00',结果只有一个零,下同                    ret = ret + tmp2;            }            if (tmp3 != "零")            {                ret = ret + tmp3 + "拾";            }            else            {                if (tmp2 != "零")                    ret = ret + tmp3;            }            if (tmp4 != "零")            {                ret = ret + tmp4;            }            if (ret[0] == '零')//若第一个字符是'零',则去掉                ret = ret.Substring(1);            if (ret[ret.Length - 1] == '零')//若最后一个字符是'零',则去掉                ret = ret.Substring(0, ret.Length - 1);            return ret + strDW;//加上本单元的单位        }        /// <summary>        /// 单个数字转为大写        /// </summary>        /// <param name="c">小写阿拉伯数字 0---9</param>        /// <returns>大写数字</returns>        private string getint(char c)        {            string str = "";            switch (c)            {                case '0':                    str = "零";                    break;                case '1':                    str = "壹";                    break;                case '2':                    str = "贰";                    break;                case '3':                    str = "叁";                    break;                case '4':                    str = "肆";                    break;                case '5':                    str = "伍";                    break;                case '6':                    str = "陆";                    break;                case '7':                    str = "柒";                    break;                case '8':                    str = "拐";                    break;                case '9':                    str = "玖";                    break;            }            return str;        } 


[解决办法]
已经全部开发完成了.有待时间和用户的考验,之后再考虑公开代码或DLL文件.
金额阿拉伯数字转换中文大写(全:大到无量,小到清净).msi
可下载数:20共享链接:http://163.fm/G9lLD0v提取码:nkM1WXEj

读书人网 >C#

热点推荐