本帖最后由 hilenx 于 2010-01-18 20:29:18 编辑

解决方案 »

  1.   

    多谢!!
    修改了这部分。 101000.10 壹拾万零壹仟元零壹角正 壹拾万壹仟元壹角正 两种写法都对应该。
    我注释掉的是前面的写法,万那里的零没写,只写了个元后加零的。欢迎继续找茬……
    //金额大于1元
                            if (numLength > 2 && yuanTag)
                            {
                                if ((numLength - 3) == (i - 1))
                                {
                                    cnNum = "元" + cnNum;
                                    yuanTag = false;
                                    preNumChar = '元';                                //if (!preNumChar.Equals('整') && cnNumCharArray[i - 1].Equals('零'))
                                    //{
                                    //    cnNum = "元零" + cnNum;
                                    //    yuanTag = false;
                                    //    preNumChar = '元';
                                    //}
                                    //else
                                    //{
                                    //    cnNum = "元" + cnNum;
                                    //    yuanTag = false;
                                    //    preNumChar = '元';
                                    //}
                                }
                            }
                            //金额大于万元
                            if (numLength > 6 && wanTag)
                            {
                                if ((numLength - 7) == (i - 1))
                                {
                                    //如果万位到千万位都为0,则不输出“万”
                                    if (numLength > 10 && numCharArray[1].Equals('0')
                                        && numCharArray[1].Equals('0')
                                        && numCharArray[2].Equals('0')
                                        && numCharArray[3].Equals('0')
                                        && numCharArray[4].Equals('0'))
                                    {
                                        wanTag = false;
                                    }
                                    else if (cnNumCharArray[i - 1].Equals('零'))
                                    {
                                        cnNum = "万" + cnNum;
                                        wanTag = false;
                                        preNumChar = cnNumCharArray[i - 1];
                                        continue;
                                    }
                                    else
                                    {
                                        cnNum = "万" + cnNum;
                                    }
                                    wanTag = false;
                                }                        }
      

  2.   


    private string ConvertNumberToUpper(string p)
            {            
                string strPriceText = string.Empty;
                bool bPrevBitIsZero = false;
                double dblPrice = 0;
                string strNumChar=string.Empty;
                string strNumWord=string.Empty;
                string[] strNumChars = new string[] { "", "拾", "百", "千", "万", "拾", "百", "千", "亿", "拾", "百", "千", "万" };
                string[] strNumWords=new string[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾"};
                if (double.TryParse(p, out dblPrice))
                {
                    p=dblPrice.ToString();
                    for(int i=p.Length-1;i>=0;i--)
                    {
                        strNumWord = "";                    int iNum = 0;
                        if (int.TryParse(p[i].ToString(), out iNum))
                        {
                            if (i < p.Length - 1)
                            {
                                bPrevBitIsZero = p[i + 1].ToString().Equals("0");
                            }                        if (iNum != 0)
                            {
                                if (i == 0)             //数字最高位为1时,若其与拾组合,通常也不读出来
                                {
                                    if (!strNumChars[p.Length - i - 1].Equals("拾"))
                                        strNumWord = strNumWords[iNum];
                                }
                                else
                                    strNumWord = strNumWords[iNum];
                            }
                            else
                            {
                                if (!bPrevBitIsZero)
                                    strNumWord = strNumWords[iNum];                            if (i == p.Length - 1 && iNum == 0)     //数字最低位为0时不读出来
                                    strNumWord = "";                            if ((p.Length - i - 1) % 4 == 0 && iNum == 0)
                                {
                                    strNumWord = "";
                                }
                            }                        if (iNum != 0 || ((p.Length - i - 1) % 4 == 0))
                            {
                                strNumWord = strNumWord + strNumChars[p.Length - i - 1];
                            }                        
                        }                                        strPriceText = strNumWord + strPriceText;
                    }
                }            return strPriceText;
            }
    给你写一个,基本没什么问题,小数我没写,我相信你能搞定。
      

  3.   

    /// <summary>
            /// 金额转换,将阿拉伯数字转化为中文大写数字
            /// </summary>
            /// <param name="strNum">小写金额</param>
            /// <returns>大写金额</returns>
            public static string ToChineseNum(string strNum)
            {
                try
                {
                    strNum = strNum.Replace(".", "");
                    Int64 num = Convert.ToInt64(strNum); // 先转换,如果不成功,说明数字有问题抛出错误。为了测试方便,实际应用的话应该写相关的输入约束。                char[] cnText = new char[] { '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
                    char[] unitText = new char[] { '仟', '佰', '拾' };
                    char[] systemText = new char[] { '元', '万', '亿' };                strNum = strNum.TrimStart('0');
                    int level = (int)Math.Ceiling((double)((strNum.Length - 2) / 4.0));
                    int count = 4 * level + 2;
                    strNum = strNum.PadLeft(count, '0');
                    char[] charArray = strNum.ToCharArray();
                    string result = string.Empty;
                    for (int i = 0; i * 4 <= charArray.Length - 3; i++)
                    {
                        char[] group = new char[] { charArray[i * 4], charArray[i * 4 + 1], charArray[i * 4 + 2], charArray[i * 4 + 3] };
                        result += GetThreeCharCn(group, cnText, unitText) + systemText[--level].ToString();
                    }
                    string strForFloat = string.Empty;
                    char charJiao = charArray[charArray.Length - 2];
                    if (charJiao != '0')
                    {
                        strForFloat += cnText[int.Parse(charJiao.ToString()) - 1] + "角";
                    }
                    char charFen = charArray[charArray.Length - 1];
                    if (charFen != '0')
                    {
                        strForFloat += cnText[int.Parse(charFen.ToString()) - 1] + "分";
                    }
                    return result + (strForFloat == string.Empty ? (result == string.Empty ? "零元整":"整") : strForFloat);
                }
                catch (Exception e)
                {
                    return "error!";
                }
            }        private static string GetThreeCharCn(char[] chars, char[] cnText, char[] unitText)
            {
                int four = chars[0] - '0';
                int three = chars[1] - '0';
                int two = chars[2] - '0';
                int one = chars[3] - '0';            string str = string.Empty;            str += four == 0 ? "" : cnText[four - 1].ToString() + unitText[0].ToString();
                str += three == 0 ? (four == 0 ? "" : "零") : cnText[three - 1].ToString() + unitText[1].ToString();
                str += two == 0 ? ((four != 0 || three != 0) ? "零" : "") : cnText[two - 1].ToString() + unitText[2].ToString();
                str += one == 0 ? "" :  cnText[one - 1].ToString();            return str;
            }
    我也来凑个热闹
      

  4.   

    to:yulinlover
    多谢阿,明天再继续看看,争取把自己的精炼精炼去。
    很久没写代码了,就是为了自己用才写的,应该很丑吧,嘿嘿。
      

  5.   


    private string ConvertNumberToUpper(string p)
            {            
                string strPriceText = string.Empty;
                string strLowerPriceText = string.Empty;
                bool bPrevBitIsZero = false;
                double dblPrice = 0;
                string strNumChar=string.Empty;
                string strNumWord=string.Empty;
                string[] strNumLower = new string[] { "角", "分" };
                string[] strNumChars = new string[] { "圆", "拾", "百", "千", "万", "拾", "百", "千", "亿", "拾", "百", "千", "万" };
                string[] strNumWords=new string[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾"};
                if (double.TryParse(p, out dblPrice))
                {
                    //因为金额一般只需要记录到角分,所以小数取2位
                    dblPrice = Math.Round(dblPrice, 2);                //先转换非小数位
                    p = Math.Floor(dblPrice).ToString();
                    for (int i = p.Length - 1; i >= 0; i--)
                    {
                        strNumWord = "";                    int iNum = 0;
                        if (int.TryParse(p[i].ToString(), out iNum))
                        {
                            if (i < p.Length - 1)
                            {
                                bPrevBitIsZero = p[i + 1].ToString().Equals("0");
                            }                        //始终读出此位数字,下面排除不需要读出来的情况
                            strNumWord = strNumWords[iNum];                        if (iNum != 0)            //数据位不为0时
                            {
                                if (i == 0 && strNumChars[p.Length - i - 1].Equals("拾") && iNum == 1)             //此位为最高位且值为1时,若其与拾组合,通常不读出来,若要读出来,注释此逻辑
                                {
                                    strNumWord = string.Empty;
                                }
                            }
                            else            //如果此位为0,则判断前一位是不是0.
                            {
                                if (bPrevBitIsZero)            //若前一位为0,则此位不需要读出来
                                {
                                    strNumWord = string.Empty;
                                }                            if (i == p.Length - 1 && iNum == 0)     //数字最低位为0时不读出来
                                {
                                    strNumWord = "";
                                }                            if ((p.Length - i - 1) % 4 == 0 && iNum == 0)    //若是万位或亿位,为0时不读出来
                                {
                                    strNumWord = "";
                                }
                            }                        if (iNum != 0 || ((p.Length - i - 1) % 4 == 0))      //此位不为0或者此位是万位或亿位,则需要读出位名称
                            {
                                strNumWord = strNumWord + strNumChars[p.Length - i - 1];
                            }
                        }                    strPriceText = strNumWord + strPriceText;
                    }                //再转换小数位
                    p =Math.Round( (dblPrice - Math.Floor(dblPrice)),2).ToString();
                    int iStartPos = p.IndexOf(".") < 0 ? p.Length : p.IndexOf(".")+1;
                    for (int i = iStartPos; i < p.Length; i++)
                    {                    
                        strNumWord = "";                    int iNum = 0;
                        if (int.TryParse(p[i].ToString(), out iNum))
                        {                        
                            //始终读出此位数字,下面排除不需要读出来的情况
                            strNumWord = strNumWords[iNum];                        if (iNum != 0)            //数据位不为0时
                            {
                                
                            }
                            else            //如果此位为0,则判断前一位是不是0.
                            {
                                if (bPrevBitIsZero)            //若前一位为0,则此位不需要读出来
                                {
                                    strNumWord = string.Empty;
                                }                            if (i == p.Length - 1 && iNum == 0)     //数字最低位为0时不读出来
                                {
                                    strNumWord = "";
                                }                            
                            }                        if (iNum != 0 )      //此位不为0,则需要读出位名称
                            {
                                strNumWord = strNumWord + strNumLower[i-iStartPos];
                            }                        strLowerPriceText = strLowerPriceText + strNumWord;
                        }                }
                }            return strPriceText + strLowerPriceText;
            }
      

  6.   

    //哈哈,升级版本,支持无限大数字。  嘿嘿        /// <summary>
            /// 金额转换,将阿拉伯数字转化为中文大写数字
            /// </summary>
            /// <param name="strNum">小写金额</param>
            /// <returns>大写金额</returns>
            public static string ToChineseNum(string strNum)
            {
                try
                {
                    strNum = strNum.Replace(".", "").Replace(" ","");    //去掉小数点和空格
                    if(!System.Text.RegularExpressions.Regex.IsMatch(strNum,"^[0-9.]+$"))
                        throw new Exception("参数格式不正确!");                char[] cnText = new char[] { '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
                    char[] unitText = new char[] { '仟', '佰', '拾' };
                    char[] systemText = new char[] { '元', '万', '亿', '兆', '京', '垓', '杼', '穰' };
                
                    int level = (int)Math.Ceiling((double)((strNum.Length - 2) / 4.0));
                    int count = 4 * level + 2;
                    strNum = strNum.PadLeft(count, '0');
                    char[] charArray = strNum.ToCharArray();
                    string result = string.Empty;
                    for (int i = 0; i * 4 <= count - 3; i++)     //每4个为一组进行匹配 
                    {
                        result += strNum[i * 4] == '0' ? "" : cnText[strNum[i * 4] - '0' - 1].ToString() + unitText[0].ToString();
                        result += strNum[i * 4 + 1] == '0' ? (strNum[i * 4] == '0' ? "" : "零") : cnText[strNum[i * 4 + 1] - '0' - 1].ToString() + unitText[1].ToString();
                        result += strNum[i * 4 + 2] == '0' ? ((strNum[i * 4] != '0' && strNum[i * 4 + 1] != '0')  ? "零" : "") : cnText[strNum[i * 4 + 2] - '0' - 1].ToString() + unitText[2].ToString();
                        result += strNum[i * 4 + 3] == '0' ? "" : cnText[strNum[i * 4 + 3] - '0' - 1].ToString() + systemText[--level].ToString();
                    }
                    string strForFloat = string.Empty;                         //计算小数部分
                    strForFloat += ( charArray[count - 2] == '0' ? "" : cnText[charArray[count - 2] - '0' - 1] + "角" );
                    strForFloat += (charArray[count - 1] == '0' ? "" : cnText[charArray[count - 1] - '0' - 1] + "分");
                    return result + (strForFloat == string.Empty ? (result == string.Empty ? "零元整":"整") : strForFloat);
                }
                catch (Exception e)
                {
                    return "error!";
                }
            }
      

  7.   

    to :ouc_ajax 
     3Q,我手头的票的格就到十亿 - -0 不过,过亿的票据基本很难过去,内控制度……不过很谢谢你。
      

  8.   


    谢谢,少加了个括号...
          public static string ToChineseNum(string strNum)
            {
                try
                {
                    strNum = strNum.Replace(".", "").Replace(" ","");    //去掉小数点和空格
                    if(!System.Text.RegularExpressions.Regex.IsMatch(strNum,"^[0-9.]+$"))
                        throw new Exception("参数格式不正确!");                char[] cnText = new char[] { '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
                    char[] unitText = new char[] { '仟', '佰', '拾' };
                    char[] systemText = new char[] { '元', '万', '亿', '兆', '京', '垓', '杼', '穰' };
                
                    int level = (int)Math.Ceiling((double)((strNum.Length - 2) / 4.0));
                    int count = 4 * level + 2;
                    strNum = strNum.PadLeft(count, '0');
                    char[] charArray = strNum.ToCharArray();
                    string result = string.Empty;
                    for (int i = 0; i * 4 <= count - 3; i++)     //每4个为一组进行匹配 
                    {
                        result += strNum[i * 4] == '0' ? "" : cnText[strNum[i * 4] - '0' - 1].ToString() + unitText[0].ToString();
                        result += strNum[i * 4 + 1] == '0' ? (strNum[i * 4] == '0' ? "" : "零") : cnText[strNum[i * 4 + 1] - '0' - 1].ToString() + unitText[1].ToString();
                        result += strNum[i * 4 + 2] == '0' ? ((strNum[i * 4] != '0' && strNum[i * 4 + 1] != '0')  ? "零" : "") : cnText[strNum[i * 4 + 2] - '0' - 1].ToString() + unitText[2].ToString();
                        result += (strNum[i * 4 + 3] == '0' ? "" : cnText[strNum[i * 4 + 3] - '0' - 1].ToString()) + systemText[--level].ToString();
                    }
                    string strForFloat = string.Empty;                         //计算小数部分
                    strForFloat += ( charArray[count - 2] == '0' ? "" : cnText[charArray[count - 2] - '0' - 1] + "角" );
                    strForFloat += (charArray[count - 1] == '0' ? "" : cnText[charArray[count - 1] - '0' - 1] + "分");
                    return result + (strForFloat == string.Empty ? (result == string.Empty ? "零元整":"整") : strForFloat);
                }
                catch (Exception e)
                {
                    return "error!";
                }
            }
      

  9.   

    还有为什么.要我自己处理ToChineseNum("10000001")
    "壹拾万元壹分"
    应该是壹拾万元零壹分ToChineseNum("10000101")
    "壹拾万壹元壹分"
    应该是壹拾万零壹元壹分ToChineseNum("100101.01")
    "壹拾万壹佰壹元壹分"
    应该是壹拾万零壹佰零壹元壹分
      

  10.   


        Private Sub btnZhuanHuan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnZhuanHuan.Click        Try
                '**************************************************************************************************
                Dim strNum As String = txtInPut.Text.Trim   '接受输入区字串
                Dim leftStr As String = ""    '分解左边部分
                Dim rightStr As String = ""   '分解右边部分            Dim strHanZiLeft As String = ""     '转换后左侧字串
                Dim strHanZiRight As String = ""    '转换后右侧字串
                '**************************************************************************************************            '先判断是否有小数点
                '有进入if
                If InStr(strNum, ".") > 0 Then
                    Dim i As Integer = InStr(strNum, ".")
                    '如果存在小数点 截取小数部分rightStr
                    leftStr = strNum.Substring(0, i - 1)
                    rightStr = strNum.Substring(i, Len(strNum) - i)                '此for循环循环出leftStr的数值
                    For i = 0 To leftStr.Length - 1
                        'ShuToHan()方法先转换汉字
                        strHanZiLeft = strHanZiLeft + (ShuToHan(leftStr.Substring(i, 1)))
                        'GetDigit()方法在数字后面加单位
                        If leftStr.Length - i - 2 >= 0 Then
                            strHanZiLeft = strHanZiLeft + GetDigit(leftStr.Length - i - 2)
                        End If
                    Next
                    '此for循环循环出rightStr的数值
                    For i = 0 To rightStr.Length - 1
                        strHanZiRight = strHanZiRight + (ShuToHan(rightStr.Substring(i, 1)))
                    Next
                    '显示结果
                    txtShow.Text = strHanZiLeft & "点" & strHanZiRight                '**************************************************************************************************
                    '先判断是否有小数点
                    '没有进入Else
                Else
                    ' 没有小数点 rightStr为空 循环的长度为strNum的长度
                    Dim i As Integer = Len(strNum)
                    leftStr = strNum.Substring(0, i) : rightStr = ""                For i = 0 To leftStr.Length - 1
                        'ShuToHan()方法先转换汉字
                        strHanZiLeft = strHanZiLeft + (ShuToHan(leftStr.Substring(i, 1)))
                        'GetDigit()方法在数字后面加单位
                        If leftStr.Length - i - 2 >= 0 Then
                            strHanZiLeft = strHanZiLeft + GetDigit(leftStr.Length - i - 2)
                        End If
                    Next
                    txtShow.Text = strHanZiLeft
                End If
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Sub
        '获取位数
        Public Function GetDigit(ByVal e As Integer) As String
            Dim Digit As String = "拾佰仟万拾佰仟亿拾佰仟"
            Return Digit.Substring(CInt(e), 1)
        End Function
        '数字到汉字
        Function ShuToHan(ByVal e As Integer) As String
            Dim strShuToHan As String = "零壹贰叁肆伍陆柒捌玖拾"
            Return strShuToHan.Substring(CInt(e), 1)
        End Function