请你把一组数转化成人民币大写,例如1234.56转化成壹千贰百三拾四元五角六分
求教解决办法,方法越简练愈好

解决方案 »

  1.   

    // 例如:(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;
          }
        }
        // 反转字符串
        string Reverse()
        {
          StringBuilder sbReversed = new StringBuilder();
          for (int i = sb.Length - 1; i >= 0; i--)
            sbReversed.Append(sb[i]);
          return sbReversed.ToString();
        }
      }
    }
      

  2.   

    这是Q_282898034(我为编程狂)用正则表达式实现的:
    见:http://topic.csdn.net/u/20080125/09/04c65875-4f50-42cd-bd63-d7b1429e42e1.html(31楼)using System;
    using System.Text.RegularExpressions;class Program
    {
      static void Main()
      {
        string s = 1234.56.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 d = Regex.Replace(s, @"((?<=-|^)[^1-9]*)|((?'z'0)[0A-E]*((?=[1-9])|(?'-z'(?=[F-L\.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[\.]|$))))", "${b}${z}");
        Console.WriteLine(d + "\n" + Regex.Replace(d, ".", delegate(Match m) { return "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟萬億兆京垓秭穰"[m.Value[0] - '-'].ToString(); }));
      }
    }
      

  3.   

    public   static   string   GetChineseNum(string   strType,   string   strIn) 
                    {                         string   m_1,   m_2,   m_3,   m_4,   m_5,   m_6,   m_7,   m_8,   m_9; 
                            //m_1 
                            m_1   =   strIn; 
                            string   numNum   =   "0123456789."; 
                            string   numChina   =   "零壹贰叁肆伍陆柒捌玖点"; 
                            string   numChinaWeigh   =   "个拾佰仟万拾佰仟亿拾佰仟万拾佰仟亿"; 
                            //m_1.Format("%.2f",   atof(m_1)); 
                            m_1   =   (float.Parse(strIn)).ToString("f2"); 
                            m_2   =   m_1; 
                            m_3   =   m_4   =   ""; 
                            //m_2:1234-> 壹贰叁肆 
                            for   (int   i   =   0;   i   <   11;   i++) 
                            { 
                                    //m_2=m_2.Replace(numNum.Mid(i,   1),   numChina.Mid(i   *   2,   2)); 
                                    m_2   =   m_2.Replace(numNum.Substring(i,   1),   numChina.Substring(i,   1)); 
                            }                         //m_3:佰拾万仟佰拾个 
                            int   iLen   =   m_1.Length; 
                            if   (iLen   >   16) 
                            { 
                                    m_8   =   m_9   =   "越界错!"; 
                                    return   ""; 
                            } 
                            if   (m_1.IndexOf('.')   >   0) 
                                    iLen   =   m_1.IndexOf('.');                         for   (int  j  =  iLen;   j  >=  1;   j--) 
                            { 
                                    m_3   +=   numChinaWeigh.Substring(j   -   1,   1); 
                            } 
                            //m_4:2行+3行                         for   (int   i   =   0;   i   <   m_3.Length;   i++) 
                            { 
                                    m_4   +=   m_2.Substring(i,   1)   +   m_3.Substring(i,   1); 
                            } 
                            //m_5:4行去"0"后拾佰仟                         m_5   =   m_4; 
                            m_5   =   m_5.Replace("零拾",   "零"); 
                            m_5   =   m_5.Replace("零佰",   "零"); 
                            m_5   =   m_5.Replace("零仟",   "零"); 
                            //m_6:00-> 0,000-> 0                         m_6   =   m_5; 
                            for   (int   i   =   0;   i   <   iLen;   i++) 
                                    m_6   =   m_6.Replace("零零",   "零");                         //m_7:6行去亿,万,个位"0" 
                            m_7   =   m_6; 
                            m_7   =   m_7.Replace("亿零万零",   "亿零"); 
                            m_7   =   m_7.Replace("亿零万",   "亿零"); 
                            m_7   =   m_7.Replace("零亿",   "亿"); 
                            m_7   =   m_7.Replace("零万",   "万"); 
                            if   (m_7.Length   >   2) 
                                    m_7   =   m_7.Replace("零个",   "个");                         //m_8:7行+2行小数-> 数目 
                            m_8   =   m_7; 
                            m_8   =   m_8.Replace("个",   ""); 
                            if   (m_2.Substring(m_2.Length   -   3,   3)   !=   "点零零") 
                                    m_8   +=   m_2.Substring(m_2.Length   -   3,   3);                         //m_9:7行+2行小数-> 价格 
                            m_9   =   m_7; 
                            m_9   =   m_9.Replace("个",   "圆"); 
                            if   (m_2.Substring(m_2.Length   -   3,   3)   !=   "点零零") 
                            { 
                                    m_9   +=   m_2.Substring(m_2.Length   -   2,   2); 
                                    m_9   =   m_9.Insert(m_9.Length   -   1,   "角"); 
                                    m_9   +=   "分"; 
                            } 
                            else   m_9   +=   "整"; 
                            if   (m_9   !=   "零圆整") 
                                    m_9   =   m_9.Replace("零圆",   ""); 
                            m_9   =   m_9.Replace("零分",   "整"); 
                            if   (strType   ==   "数量") 
                                    return   m_8; 
                            else 
                                    return   m_9;                 }
      

  4.   

    http://topic.csdn.net/u/20080125/16/e525de9d-e92f-44b9-8a8c-ea86a08f084b.html?seed=498778585
      

  5.   

    货币金额大写转换库http://www.vckbase.com/bbs/prime/viewprime.asp?id=576// 货币金额大写转换库   Money2String.dll// 静态中文转换方法     String GetCnString(String MoneyString)
    // 最大转化金额         9999999999999999.99  (16位整数位,2位小数位)
    // 方法返回值           转换成功则返回非零长字串,否则返回零长字串// 静态英文转换方法     String GetEnString(String MoneyString)
    // 最大转化金额         999999999999999.99   (15位整数位,2位小数位)
    // 方法返回值           转换成功则返回非零长字串,否则返回零长字串
      

  6.   


    <script language="javascript" type="text/javascript">
    function convertCurrency(currencyDigits) {
    // Constants:
    var MAXIMUM_NUMBER = 99999999999.99;
    // Predefine the radix characters and currency symbols for output:
    var CN_ZERO = "零";
    var CN_ONE = "壹";
    var CN_TWO = "贰";
    var CN_THREE = "叁";
    var CN_FOUR = "肆";
    var CN_FIVE = "伍";
    var CN_SIX = "陆";
    var CN_SEVEN = "柒";
    var CN_EIGHT = "捌";
    var CN_NINE = "玖";
    var CN_TEN = "拾";
    var CN_HUNDRED = "佰";
    var CN_THOUSAND = "仟";
    var CN_TEN_THOUSAND = "万";
    var CN_HUNDRED_MILLION = "亿";
    var CN_SYMBOL = "人民币";
    var CN_DOLLAR = "元";
    var CN_TEN_CENT = "角";
    var CN_CENT = "分";
    var CN_INTEGER = "整";// Variables:
    var integral; // Represent integral part of digit number.
    var decimal; // Represent decimal part of digit number.
    var outputCharacters; // The output result.
    var parts;
    var digits, radices, bigRadices, decimals;
    var zeroCount;
    var i, p, d;
    var quotient, modulus;// Validate input string:
    currencyDigits = currencyDigits.toString();
    if (currencyDigits == "") {
    alert("Empty input!");
    return "";
    }
    if (currencyDigits.match(/[^,.\d]/) != null) {
    alert("Invalid characters in the input string!");
    return "";
    }
    if ((currencyDigits).match(/^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$/) == null) {
    alert("Illegal format of digit number!");
    return "";
    }// Normalize the format of input digits:
    currencyDigits = currencyDigits.replace(/,/g, ""); // Remove comma delimiters.
    currencyDigits = currencyDigits.replace(/^0+/, ""); // Trim zeros at the beginning.
    // Assert the number is not greater than the maximum number.
    if (Number(currencyDigits) > MAXIMUM_NUMBER) {
    alert("Too large a number to convert!");
    return "";
    }// Process the coversion from currency digits to characters:
    // Separate integral and decimal parts before processing coversion:
    parts = currencyDigits.split(".");
    if (parts.length > 1) {
    integral = parts[0];
    decimal = parts[1];
    // Cut down redundant decimal digits that are after the second.
    decimal = decimal.substr(0, 2);
    }
    else {
    integral = parts[0];
    decimal = "";
    }
    // Prepare the characters corresponding to the digits:
    digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE);
    radices = new Array("", CN_TEN, CN_HUNDRED, CN_THOUSAND);
    bigRadices = new Array("", CN_TEN_THOUSAND, CN_HUNDRED_MILLION);
    decimals = new Array(CN_TEN_CENT, CN_CENT);
    // Start processing:
    outputCharacters = "";
    // Process integral part if it is larger than 0:
    if (Number(integral) > 0) {
    zeroCount = 0;
    for (i = 0; i < integral.length; i++) {
    p = integral.length - i - 1;
    d = integral.substr(i, 1);
    quotient = p / 4;
    modulus = p % 4;
    if (d == "0") {
    zeroCount++;
    }
    else {
    if (zeroCount > 0){
    outputCharacters += digits[0];
    }
    zeroCount = 0;
    outputCharacters += digits[Number(d)] + radices[modulus];
    }
    if (modulus == 0 && zeroCount < 4) {
    outputCharacters += bigRadices[quotient];
    }
    }
    outputCharacters += CN_DOLLAR;
    }
    // Process decimal part if there is:
    if (decimal != "") {
    for (i = 0; i < decimal.length; i++) {
    d = decimal.substr(i, 1);
    if (d != "0") {
    outputCharacters += digits[Number(d)] + decimals[i];
    }
    }
    }
    // Confirm and return the final output string:
    if (outputCharacters == "") {
    outputCharacters = CN_ZERO + CN_DOLLAR;
    }
    if (decimal == "") {
    outputCharacters += CN_INTEGER;
    }
    outputCharacters = CN_SYMBOL + outputCharacters;
    return outputCharacters;
    }
    </script>
    <p>数字金额: <input id="Digits" name="Digits" /> <input id="Convert" onclick="Result.value = convertCurrency(Digits.value);" type="button" name="Convert" value="转 换" /> </p>
    <p>大写金额: <input id="Result" size="60" name="Result" /> </p>
      

  7.   

    呵呵,
    他们那个贴子的"牛"也好牛的.(37L)
    http://topic.csdn.net/u/20080125/09/04c65875-4f50-42cd-bd63-d7b1429e42e1.html确实不错,这贴子.
      

  8.   

    大家好厉害哦,我奉献一个SQL Server函数版的:
    --小写转中文大写
    CREATE FUNCTION [dbo].[f_num_chn] (@num numeric(14,2))
    RETURNS varchar(100)
    AS
    BEGIN
      DECLARE @n_data VARCHAR(20),@c_data VARCHAR(100),@n_str VARCHAR(10),@i int  SET @n_data=RIGHT(SPACE(14)+CAST(CAST(ABS(@num*100) AS bigint) AS varchar(20)),14)
      SET @c_data=''
      SET @i=1
      WHILE @i<=14
      BEGIN
        SET @n_str=SUBSTRING(@n_data,@i,1)
        IF @n_str<>' '
        BEGIN
          IF not ((SUBSTRING(@n_data,@i,2)='00') or
            ((@n_str='0') and ((@i=4) or (@i=8) or (@i=12) or (@i=14))))
            SET @c_data=@c_data+SUBSTRING('零壹贰叁肆伍陆柒捌玖',CAST(@n_str AS int)+1,1)
          IF not ((@n_str='0') and (@i<>4) and (@i<>8) and (@i<>12))
            SET @c_data=@c_data+SUBSTRING('仟佰拾亿仟佰拾万仟佰拾圆角分',@i,1)
          IF SUBSTRING(@c_data,LEN(@c_data)-1,2)='亿万'
            SET @c_data=SUBSTRING(@c_data,1,LEN(@c_data)-1)
        END
        SET @i=@i+1
      END
      IF @num<0
        SET @c_data='(负数)'+@c_data
      IF @num=0
        SET @c_data='零圆'
      IF @n_str='0'
        SET @c_data=@c_data+'整'
      RETURN(@c_data)
    END
      

  9.   

    <html>
    <head>
    <title></title>
    <script language="javascript">
    function ChangeToUpper()
    {
    var upperArray=new Array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
    var unitArray=new Array("分","角","圆","拾","佰","仟","万");
    var num = document.all.txt1.value;
    num+=".00";
    num=num.substr(0,num.indexOf(".")+3);
    num=num.replace(".","");
    var numAfter="";
    for(var i=0;i<num.length;i++)
    {
    if(num.substr(i,1) !=".")
    numAfter+=upperArray[num.substr(i,1)]+unitArray[num.length-i-1];
    }
    alert(numAfter);
    }
    </script>
    <head>
    <body>
    <input id="txt1" type="textbox" />
    <input type="button" width="50px" width="50px" value="转换" onclick="ChangeToUpper()"/>
    </body>
    </html>
      

  10.   

    <html>
    <head>
    <title></title>
    <script language="javascript">
    function ChangeToUpper()
    {
    var upperArray=new Array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
    var unitArray=new Array("分","角","圆","拾","佰","仟","万");
    var num = document.all.txt1.value;
    num+=".00";
    num=num.substr(0,num.indexOf(".")+3);
    num=num.replace(".","");
    var numAfter="";
    for(var i=0;i<num.length;i++)
    {
    numAfter+=upperArray[num.substr(i,1)]+unitArray[num.length-i-1];
    }
    alert(numAfter);
    }
    </script>
    <head>
    <body>
    <input id="txt1" type="textbox" />
    <input type="button" width="50px" width="50px" value="转换" onclick="ChangeToUpper()"/>
    </body>
    </html>
      

  11.   

    EXCEL就可以实现,不过微软给的显示结果一般人可能接受不了
      

  12.   

    #include <stdio.h>
    #include <string.h>
    ////////////////////////////
    ///并为加上数据格式验证 假设输入的数字都是正确的 
    ///
    ///需要添加或修改单位 修改数组即可wchar_t *number[] = {L"零",L"壹",L"贰",L"叁",L"肆",L"伍",L"陆",L"柒",L"捌",L"玖"};
    wchar_t *funit[] = {L"元",L"拾",L"佰",L"仟",L"万",L"拾万",L"佰万",L"仟万",L"亿",L"拾亿",L"佰亿",L"仟亿",L"万亿",L"拾万亿",L"佰万亿",L"仟万亿"};
    wchar_t *bunit[] = {L"整",L"角",L"分"};#define RETBUFFER 1024 ///缓存区大小int wmain(int argc, wchar_t* argv[])
    {
    wchar_t* po = wcsstr(argv[1],L"."); ///是否包含小数点
    if(po!=NULL){ //包含
    po[0]=NULL;
    po++; //断掉字符串 逻辑上等同于小数点以后的数字字符串
    } wchar_t tmp[RETBUFFER] = {0}; //临时字符串
    int len = wcslen(argv[1]); //整数位长度
    for(int i=0;i<len;i++){///循环测试每一个值 把数字转换成中文 复制到临时字符串
    wcscat_s(tmp,1024,number[argv[1][i]-L'0']); 
    if(argv[1][i]-L'0'==0 || len-(i+1)==0)continue; //如果等于0 则没有后续单位
    wcscat_s(tmp,RETBUFFER,funit[len-(i+1)]);
    }
    wcscat_s(tmp,RETBUFFER,funit[0]); //添加元
    if(po==NULL)
    wcscat_s(tmp,RETBUFFER,bunit[0]); //添加 整
    else{
    len = wcslen(po);
    for(int i=0;i<len;i++){///小数点后的
    int value = po[i]-L'0';
    wcscat_s(tmp,RETBUFFER,number[value]);
    if(value==0)continue;
    wcscat_s(tmp,RETBUFFER,bunit[i+1]);
    }
    }
    wchar_t ret[RETBUFFER] = {0};
    int j=0;
    for(int i=0;i<(int)wcslen(tmp);i++){ ///00 0元略过
    if(tmp[i]==number[0][0] && (tmp[i+1]==number[0][0] || tmp[i+1]==funit[0][0]))continue; ret[j++]=tmp[i];
    } return 0;
    }
      

  13.   

    #include <stdio.h>
    #include <string.h>wchar_t *number[] = {L"零",L"壹",L"贰",L"叁",L"肆",L"伍",L"陆",L"柒",L"捌",L"玖"};wchar_t *unit[] = {L"仟",L"佰",L"拾"};
    wchar_t *dunit[] = {L"元",L"万",L"亿",L"兆"};
    wchar_t *funit[] = {L"角",L"分"};
    #define RETBUFFER 1024 ///缓存区大小int wmain(int argc, wchar_t* argvs[])
    {
    wchar_t input[100];
    wcscpy_s(input,100,L"11110001000.12");
    wchar_t* decp  = wcsstr(input,L".");
    if(decp!=NULL){ //包含
    decp[0]=NULL;
    decp++;
    } wchar_t tmp[RETBUFFER] = {0}; int len = wcslen(input);
    int value = len%4;
    int count = (len+3)/4 -1; for(wchar_t* p=input;p[0]!=NULL;p+=value,value=4)
    {
    if(value==0)continue;
    int sum =0;
    for(int i=0;i<value;i++)
    {
    int num = p[i]-L'0';
    sum+=num;
    wcscat_s(tmp,RETBUFFER,number[num]);
    if(num==0 || 4-value+i==3)continue;
    wcscat_s(tmp,RETBUFFER,unit[4-value+i]);
    }
    if(sum!=0 || count==0)wcscat_s(tmp,RETBUFFER,dunit[count--]);

    } if(decp==NULL)
    wcscat_s(tmp,RETBUFFER,L"整");
    else
    {
    for(int i=0;i<(int)wcslen(decp);i++)
    {
    wcscat_s(tmp,RETBUFFER,number[decp[i]-L'0']);
    if(decp[i]-L'0'==0)continue;
    wcscat_s(tmp,RETBUFFER,funit[i]);
    }
    }
    wchar_t ret[RETBUFFER] = {0};

    int j = 0;
    for(int i=0;i<(int)wcslen(tmp);i++)
    {
    if(tmp[i]==number[0][0])
    {
    if(tmp[i+1]==number[0][0])
    continue;

    for(int k=0;k<sizeof(dunit)/sizeof(dunit[0]);k++)
    {
    if(tmp[i+1]==dunit[k][0])
    {
    i++;
    break;
    }
    } }
    ret[j++] = tmp[i];
    } return 0;
    }