using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Shan.Common
{
    #region RMBException
    /// <summary>
    /// 人民币转换的错误
    /// </summary>
    public class RMBException : System.Exception
    {
        public RMBException(string msg)
            : base(msg)
        {
        }
    }
    #endregion
    /// <summary>
    /// 实现将人民币的数字形式转换为中文格式,最大支持9兆兆。
    /// </summary>
    public static class RMB
    {
        #region 内部常量
        private static string RMBUppercase = "零壹贰叁肆伍陆柒捌玖";
        private static string RMBUnitChar = "元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟万拾佰仟亿拾佰仟兆"; //人民币整数位对应的标志
        private const decimal MaxNumber = 9999999999999999999999999.99m;
        private const decimal MinNumber = -9999999999999999999999999.99m;
        private static char[] cDelim = { '.' }; //小数分隔标识
        #endregion

#region Convert
        #region Convert <decimal>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="digital"></param>
        /// <returns></returns>
        public static string Convert(decimal number)
        {
            bool NegativeFlag = false;
            decimal RMBNumber;

CheckNumberLimit(number);

RMBNumber = Math.Round(number, 2);    //将四舍五入取2位小数
            if (RMBNumber == 0)
            {
                return "零元整";
            }
            else if (RMBNumber < 0)  //如果是负数
            {
                NegativeFlag = true;
                RMBNumber = Math.Abs(RMBNumber);           //取绝对值
            }
            else
            {
                NegativeFlag = false;
            }

string buf = "";                           // 存放返回结果
            string strDecPart = "";                    // 存放小数部分的处理结果
            string strIntPart = "";                    // 存放整数部分的处理结果
            string[] tmp = null;
            string strDigital = RMBNumber.ToString();

tmp = strDigital.Split(cDelim, 2); // 将数据分为整数和小数部分

if (RMBNumber >= 1m) // 大于1时才需要进行整数部分的转换
            {
                strIntPart = ConvertInt(tmp[0]);
            }

if (tmp.Length > 1) //分解出了小数
            {
                strDecPart = ConvertDecimal(tmp[1]);
            }
            else  //没有小数肯定是为整
            {
                strDecPart = "整";
            }

if (NegativeFlag == false) //是否负数
            {
                buf = strIntPart + strDecPart;
            }
            else
            {
                buf = "负" + strIntPart + strDecPart;
            }
            return buf;
        }
        #endregion

#region Convert <double>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string Convert(double number)
        {
            decimal dec;
            try
            {
                dec = System.Convert.ToDecimal(number);
            }
            catch
            {
                throw new RMBException("不能转成标准的decimal类型:" + number.ToString());
            }
            return Convert(dec);
        }
        #endregion

#region Convert <float>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string Convert(float number)
        {
            decimal dec;
            try
            {
                dec = System.Convert.ToDecimal(number);
            }
            catch
            {
                throw new RMBException("不能转成标准的decimal类型:" + number.ToString());
            }
            return Convert(dec);
        }
        #endregion

#region Convert <int>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string Convert(int number)
        {
            decimal dec;
            dec = System.Convert.ToDecimal(number);
            return Convert(dec);
        }
        #endregion

#region Convert <long>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string Convert(long number)
        {
            decimal dec;
            dec = System.Convert.ToDecimal(number);
            return Convert(dec);
        }
        #endregion

#region Convert <string>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string Convert(string number)
        {
            decimal dec;
            try
            {
                dec = System.Convert.ToDecimal(number, null);
            }
            catch
            {
                throw new RMBException("不能转成标准的decimal类型:" + number);
            }
            return Convert(dec);
        }
        #endregion
        #endregion

#region MaxSupportNumber
        /// <summary>
        /// 支持的最大转换数
        /// </summary>
        public static decimal MaxSupportNumber
        {
            get
            {
                return MaxNumber;
            }
        }
        #endregion

#region MinSupportNumber
        /// <summary>
        /// 支持的最小数
        /// </summary>
        public static decimal MinSupportNumber
        {
            get
            {
                return MinNumber;
            }
        }
        #endregion

#region 内部函数
        #region ConvertInt
        private static string ConvertInt(string intPart)
        {
            string buf = "";
            int length = intPart.Length;
            int curUnit = length;

// 处理除个位以上的数据
            string tmpValue = "";                    // 记录当前数值的中文形式
            string tmpUnit = "";                    // 记录当前数值对应的中文单位
            int i;
            for (i = 0; i < length - 1; i++, curUnit--)
            {
                if (intPart[i] != '0')
                {
                    tmpValue = DigToCC(intPart[i]);
                    tmpUnit = GetUnit(curUnit - 1);
                }
                else
                {
                    // 如果当前的单位是"万、亿",则需要把它记录下来
                    if ((curUnit - 1) % 4 == 0)
                    {
                        tmpValue = "";
                        tmpUnit = GetUnit(curUnit - 1);//

}
                    else
                    {
                        tmpUnit = "";

// 如果当前位是零,则需要判断它的下一位是否为零,再确定是否记录'零'
                        if (intPart[i + 1] != '0')
                        {

tmpValue = "零";

}
                        else
                        {
                            tmpValue = "";
                        }
                    }
                }
                buf += tmpValue + tmpUnit;
            }

// 处理个位数据
            if (intPart[i] != '0')
                buf += DigToCC(intPart[i]);
            buf += "元";

return CombinUnit(buf);
        }
        #endregion

#region ConvertDecimal
        /// <summary>
        /// 小数部分的处理
        /// </summary>
        /// <param name="decPart">需要处理的小数部分</param>
        /// <returns></returns>
        private static string ConvertDecimal(string decPart)
        {
            string buf = "";
            int i = decPart.Length;

//如果小数点后均为零
            if ((decPart == "0") || (decPart == "00"))
            {
                return "整";
            }

if (decPart.Length > 1) //2位
            {
                if (decPart[0] == '0') //如果角位为零0.01
                {
                    buf = DigToCC(decPart[1]) + "分"; //此时不可能分位为零
                }
                else if (decPart[1] == '0')
                {
                    buf = DigToCC(decPart[0]) + "角整";
                }
                else
                {
                    buf = DigToCC(decPart[0]) + "角";
                    buf += DigToCC(decPart[1]) + "分";
                }
            }
            else //1位
            {
                buf += DigToCC(decPart[0]) + "角整";
            }
            return buf;
        }
        #endregion

#region GetUnit
        /// <summary>
        /// 获取人民币中文形式的对应位置的单位标志
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        private static string GetUnit(int n)
        {
            return RMBUnitChar[n].ToString();
        }
        #endregion

#region DigToCC
        /// <summary>
        /// 数字转换为相应的中文字符 ( Digital To Chinese Char )
        /// </summary>
        /// <param name="c">以字符形式存储的数字</param>
        /// <returns></returns>
        private static string DigToCC(char c)
        {
            return RMBUppercase[c - '0'].ToString();
        }
        #endregion

#region CheckNumberLimit
        private static void CheckNumberLimit(decimal number)
        {
            if ((number < MinNumber) || (number > MaxNumber))
            {
                throw new RMBException("超出可转换的范围");
            }
        }
        #endregion

#region CombinUnit
        /// <summary>
        /// 合并兆亿万词
        /// </summary>
        /// <param name="rmb"></param>
        /// <returns></returns>
        private static string CombinUnit(string rmb)
        {
            if (rmb.Contains("兆亿万"))
            {
                return rmb.Replace("兆亿万", "兆");
            }
            if (rmb.Contains("亿万"))
            {
                return rmb.Replace("亿万", "亿");
            }
            if (rmb.Contains("兆亿"))
            {
                return rmb.Replace("兆亿", "兆");
            }
            return rmb;
        }
        #endregion
        #endregion
    }

}

C#通用类库--数字转为人民币汉字大写表示可负大写相关推荐

  1. C#通用类库--数字转为人民币汉字大写表示

    //类名:EcanRMB //作用:数字转换为人民币大写 //作者:刘典武 //时间:2010-12-04 using System; using System.Collections.Generic ...

  2. Excel数字 转 人民币 繁体大写

    第一种方法:通过函数嵌套实现 数字转人民币大写形式的公式是: =IF(B1<0,"金额为负无效", (IF(OR(B1=0,B1=""),"(人 ...

  3. Python实现数字转人民币(大写汉字)源代码

    Python实现数字转人民币(大写汉字)源代码,运行截图: 完整程序代码 import warnings from decimal import Decimaldef cncurrency(value ...

  4. 数字金额转换为大写人民币汉字

    // 数字金额转换为大写人民币汉字convertCurrency (money) {// 汉字的数字var cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', ' ...

  5. JS将数字金额转换为大写人民币汉字

    转载自 qubernet 博客 JS将数字金额转换为大写人民币汉字 function convertCurrency(money) {//汉字的数字var cnNums = new Array('零' ...

  6. 零基础实操 | Python实现数字转人民币(大写汉字)源代码

    大家好,我是吒吒. 我们的工作中遇到一些问题,不依靠工具的话,改起来真的超级麻烦,还会遗漏.有个小伙伴提出怎么把数字转成人民币(大写汉字),Python还真的可以做到,并且挺简单的,新手都可以操作.下 ...

  7. 数字转人民币(大写汉字)读法(Python经典编程案例)

    数字转人民币读法 import warnings from decimal import Decimaldef cncurrency(value, capital=True, prefix=False ...

  8. c#的输入数字自动转为人民币大写的方法

    c#的输入数字自动转为人民币大写的方法 public static string ConvertRMB(double amount) {string[] units = { "", ...

  9. 将一串数字转为大写人民币形式

    数字转人民币大写形式 function toChinese(str){ //大写数字 var arrNum = ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'] // ...

最新文章

  1. iOS开发中乱用hook可能导致灾难
  2. 串口通信模块3:串口通信编程基础(读写、关闭)
  3. 怎么设置电脑屏幕一直亮着_电脑屏幕出现条纹是什么原因 花屏怎么解决?
  4. Xamarin.Forms 5.0 项目实战发布!
  5. CSS3移动应用程序企业网站模板
  6. Python实现图像空域随机水印加入与提取
  7. LESS是一个CSS预处理器,跨浏览器友好,提供诸如变量,函数, mixins 和操作等功能,可以构建动态CSS...
  8. 1024程序员节:心疼被段子手黑得最惨的他们
  9. unity3d让模型不受3dCamera FOV的影响
  10. 互联网经典商战TOP 10
  11. 库尔巴克·莱布勒------KL散度
  12. antd table自适应(横向滚动条)
  13. FFMPEG Qt录屏软件开发之视频采集
  14. 安乐高机器人图纸_乐高机器人搭法,乐高机器人 8547 搭建图纸 PDF文件
  15. selenium入门教程
  16. 抖音创作规范_抖音作品在内容规划是应该要注意的一些问题分析
  17. IT“民工”们的中年危机:三十不立的迷茫
  18. 交叉熵、熵和相对熵的通俗易懂解释
  19. FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.
  20. 智能百度贴吧自动顶贴引流脚本工具

热门文章

  1. 计算机输入法如何显示在桌面快捷方式,输入法图标不见了怎么办 图标恢复电脑设置教程...
  2. 看懂英文技术文档,每天只需要10分钟做这件事…
  3. 如何轻松把Word、pdf文档制作成翻页电子书,电子画册?
  4. python基础教程 excel_Python新手入门:Excel基本操作(二)
  5. Android App Bundle
  6. 基于ArcScene的裸眼立体图制作说明
  7. 【电信学】【2018.09】用于室外行人导航的头戴式增强现实技术
  8. linux timewait 时间,linux下释放TIME_WAIT方法
  9. 字典服务的设计与管理
  10. 猜测一下以前的pp助手里的越狱应用是怎么制作的