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

namespace FrameworkApp
{
    // 该类重载的 ToString() 方法返回的是大写金额字符串
    public 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();
        }
    }
}

转载于:https://www.cnblogs.com/w84717/archive/2008/06/22/1227753.html

c# 小写金额转大写相关推荐

  1. SQL人民币小写金额转大写

    --1.人民币小写金额转大写(第一版) ==================================================================== -- Title: 人 ...

  2. 人民币小写金额转大写

    -- ==================================================================== -- Title: 人民币小写金额转大写 -- Auth ...

  3. JQ实现小写金额转大写

    JQ代码如下: <script>//小写金额转大写function num_change(money) {//汉字的数字var cnNums = new Array('零', '壹', ' ...

  4. JS人民币小写金额转换为大写(没毛病)

    /** * 人民币小写金额转换为大写 */ export const digitUppercase = (n) => {let fraction = ['角', '分'] let digit = ...

  5. (转)人民币小写金额转大写(SQL)

    以下转自 http://www.qeqoo.com/dev/database/dbms/3216.html -- =========================================== ...

  6. oracle人民币转大写,Oracle 小写金额转换为大写

    在开发EBS的合同报表打印的时候需要将小写金额转换为大写. 如下是本人自己写的转换函数. 主要思路:先获取小数点位置,在区分整数与小数点处理,根据位数和数字组合读取金额. 最后再处理特殊显示部分. / ...

  7. 【叶子函数分享十八】人民币小写金额转大写

    --1.人民币小写金额转大写(第一版) ==================================================================== -- Title: 人 ...

  8. Java小写金额转换大写与金额比对(支持繁体大写金额)

    package com.gerrard.pmc.util;import java.util.HashMap; import java.util.Map;import org.apache.common ...

  9. js实现小写金额转大写

    公共方法: /** 小写金额转大写金额 */dealBigMoney(n) {if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) { return '数据非法' }let u ...

  10. 会计金额格式化(千分位,小写金额转大写)

    千分位 export function numberToCurrencyNo(value) {if (!value) return 0// 获取整数部分const intPart = Math.tru ...

最新文章

  1. v-model无法对返回的数据进行填写_学会数据分析思维,学会透过事物看本质
  2. winscp连接虚拟机Linux被拒绝的问题解决方案
  3. Here Document和Expect概述(免交互,变量设定,控制,注释,)(shell里使用EOF报错)
  4. jupyter notebook怎么写python代码_如何在Jupyter Notebook中使用Python虚拟环境?
  5. 14英寸电脑长宽多少_连接4K显示器流行,带雷电3雷电4接口的笔记本要多少钱?...
  6. r语言 c语言调用函数返回值,r语言中怎样查看函数源代码
  7. 65279 php,php头部#65279;去除bom执行文件
  8. define特殊用法
  9. Tricks(三十八)—— 在不计算欧式距离的前提下判断点到两点的距离哪个更近
  10. 设计模式(二)--单例模式
  11. 计算机的分类按cpu芯片可以分为,按CPU芯片可分为单片机、单板机、多芯片机和多板机...
  12. unity内置浏览器插件UniWebView的使用(支持Android,ios,Mac)
  13. 2021年6月1日大学化学无机原理(12)——第六章四个量子数、多电子的核外排布。
  14. 《Java解惑》系列——01表达式之谜——谜题09:半斤
  15. Mac 下 unrar 命令
  16. C++实现STL文件向glTF文件的转换
  17. 网页中标签对搜索引擎的影响
  18. 灰度直方图与特征直方图的使用方法
  19. 面向对象的特性——继承
  20. 基于labview的tcp通信设计简要教程

热门文章

  1. 设计模式C++(Strategy策略模式)
  2. 五种代理IP proxy的设置方法
  3. mysql数据库文件结构同步,[数据库的表同步mysql]MySQL表结构同步
  4. 算法:Sliding Window Maximum(滑动窗口最大值)
  5. html与css怎么混合运用,Web设计中的CSS混合模式
  6. 要连plsql是不是要装oracle,PLSQL直接连接数据库,不装ORACLE
  7. 452.用最少数量的箭引爆气球
  8. 合法的括号序列匹配数
  9. Regularized logistic regression(正则化逻辑回归)----吴恩达机器学习
  10. 360云盘会不会停止服务器,360云盘能否继续使用啊?