[原创] C# 金额大写
突然要用到这个功能.也网上找了下. 最后还是自动动手写了一个.
估计这个还是有人要要的,所以顺便发出来吧.
引用保留 https://www.cnblogs.com/goldli/p/14105832.html
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions; namespace TruckScale.Common
{
/// <summary>
/// 将数字转为大写
/// <remarks>https://www.cnblogs.com/goldli/p/14105832.html</remarks>
/// </summary>
class ConvertToChineseMoney
{
private static Dictionary<char, string> _dic;
private static Dictionary<int, string> _units; private void Init()
{
_dic = new Dictionary<char, string>
{
{'0', "零"},
{'1', "壹"},
{'2', "贰"},
{'3', "叁"},
{'4', "肆"},
{'5', "伍"},
{'6', "陆"},
{'7', "柒"},
{'8', "捌"},
{'9', "玖"}
};
_units = new Dictionary<int, string>
{
{1,""},
{2,"拾"},
{3,"佰"},
{4,"仟"},
{5,"万"},
{6,"拾"},
{7,"佰"},
{8,"仟"},
{9,"亿"},
{10,"拾"},
{11,"佰"},
{12,"仟"},
{13,"万"},
{14,"亿"}
};
} private ConvertToChineseMoney()
{
Init();
} public static ConvertToChineseMoney Ins { get; } = new ConvertToChineseMoney(); /// <summary>
/// 对整数部分进行操作
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
private string ConvertIntegers(string source)
{
/*
示例:
120 5002
1002 5002
100 5002
*/
var totalLen = source.Length; //总长度
var g = totalLen / 4; //中国数字以4个数字为一组。 这里取模。结果为 多出 的部分.
var r = totalLen % 4; //取模后,得到的余数 var parts = new string[r > 0 ? g + 1 : g];
if (r > 0) //此时表示 不能整除
{
parts[0] = source.Substring(0, r); //取出 for (var i = 0; i < g; i++)
{
parts[i + 1] = source.Substring(i * 4 + r, 4); //取出
}
}
else
{
for (var i = 0; i < parts.Length ; i++)
{
parts[i] = source.Substring(i * 4, 4); //取出
}
} var result = new StringBuilder(); for (var i = 0; i < parts.Length; i++)
{
var part = parts[i];
var m0 = Regex.Match(part, "0{2,}"); //查找是否存在多个连续 0 的情况
if (m0.Success) //存在连续的多个 0, 如: 1002
{
var index = m0.Index; /*
-----------------简化代码见下面-----------------
if (index == 0) // 00 开头
{
result.Append("零");
totalLen -= 2;
// 00后面的部分
for (var n = index + 2; n < 4; n++)
{
result.Append($"{_dic[part[n]]}{_units[totalLen]}");
totalLen--;
}
}
else
{
// 00前面的部分
for (var n = 0; n < index; n++)
{
result.Append($"{_dic[part[n]]}{_units[totalLen]}");
totalLen--;
}
result.Append("零");
totalLen-=2;
// 00后面的部分
for (var n = index + 2; n < 4; n++)
{
result.Append($"{_dic[part[n]]}{_units[totalLen]}");
totalLen--;
}
}
*/ if (index > 0)
{
for (var n = 0; n < index; n++)
{
result.Append($"{_dic[part[n]]}{_units[totalLen]}");
totalLen--;
}
} result.Append("零");
totalLen -= m0.Length; for (var n = index + m0.Length; n < 4; n++)
{
result.Append($"{_dic[part[n]]}{_units[totalLen]}");
totalLen--;
}
}
else
{
var x = part.Length;
var y = part.TrimEnd('0').Length;//数字尾部的 0
if (y == 0)
{
result.Append("零"); //0.95 的 0
totalLen--;
}
else if (y != x)
{
for (var m = 0; m < y; m++)
{
result.Append($"{_dic[part[m]]}{(part[m] == '0' ? "" : _units[totalLen])}"); //part[m] == '0' 零后面不需要 进制单位
totalLen--;
} result.Append($"{_units[4 * (parts.Length - i - 1) + 1]}");
totalLen--;
}
else
{
for (var m = 0; m < y; m++)
{
result.Append($"{_dic[part[m]]}{(part[m] == '0' ? "" : _units[totalLen])}");
totalLen--;
}
}
}
} return result.ToString();
} public string Convert(double d)
{
var ret = new StringBuilder(); var source = d.ToString(CultureInfo.CurrentCulture);
var dotIndex = source.IndexOf('.'); if (dotIndex > 0)//有小数
{
var integerPart = source.Substring(0, dotIndex);
ret.Append(ConvertIntegers(integerPart))
.Append("点"); var decimalPart = source.Substring(dotIndex + 1, source.Length - dotIndex -1);
foreach (var c in decimalPart)
{
ret.Append($"{_dic[c]}");
}
}
else
{
ret.Append(ConvertIntegers(source));
} return ret.ToString();
} }
}
用法 就简了.
var s1 = ConvertToChineseMoney.Ins.Convert(278449980.95);
var s2 = ConvertToChineseMoney.Ins.Convert(0.95);
var s3 = ConvertToChineseMoney.Ins.Convert(1205020);
var s4 = ConvertToChineseMoney.Ins.Convert(1205002);
var s5 = ConvertToChineseMoney.Ins.Convert(1200052);
var s6 = ConvertToChineseMoney.Ins.Convert(10025002);
var s76 = ConvertToChineseMoney.Ins.Convert(100001734);
[原创] C# 金额大写的更多相关文章
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
- 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包
微信支付教程系列之现金红包 最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付
微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- [原创]java使用JDBC向MySQL数据库批次插入10W条数据测试效率
使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?在JDBC编程接口中Statement 有两个方法特别值得注意:通过使用addBatch( ...
- GJM : C#设计模式汇总整理——导航 【原创】
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- 信息安全-5:RSA算法详解(已编程实现)[原创]
转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...
- Atitit.你这些项目不都是模板吗?不是原创 集成和整合的方式大总结
Atitit.你这些项目不都是模板吗?不是原创 集成和整合的方式大总结 1.1. 乔布斯的名言:创新即整合(Creativity is just connecting things).1 1.2. ...
随机推荐
- 从头学起Verilog(三):Verilog逻辑设计
引言 经过了组合逻辑和时序逻辑的复习,终于到了Verilog部分.这里主要介绍Verilog一些基础内容,包括结构化模型.TestBench编写和仿真.真值表模型. 这部分内容不多,也都十分基础,大家 ...
- 《Spring Boot 实战纪实》之需求管理
目录 前言 (思维篇)人人都是产品经理 1.需求文档 1.1 需求管理 1.2 如何攥写需求文档 1.3 需求关键点文档 2 原型设计 2.1 缺失的逻辑 2.2 让想法跃然纸上 3 开发设计文档 3 ...
- 算法基础——KMP字符串匹配
原题链接 题目: 给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字. 模板串P在模式串S中多次作为子串出现. 求出模板串P在模式串S中所有出现的位置的起始下标. 输入 ...
- 这个厉害了,ssm框架整合全过程,建议收藏起来好好看看
1.0 环境要求 IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 1.1 数据库 创建书籍数据库表,包括书籍编号,书籍名称,书籍数量以及书籍描述. CREATE DATABA ...
- 下载器Folx教程:智能标签怎么用?
Mac专用下载器Folx的智能标签中内置了图片标签,可以自动分类图片文件,但要如何分类GIF图片呢?其实,我们可以在Folx的标签面板创建动图标签,然后再创建标签专属的下载文件夹,来独立存放GIF格式 ...
- 借助Mac自带的强大的搜索功能,如何快速搜索打开Tuxera Disk Manager
现在很多小伙伴们在遇到Mac读写NTFS格式硬盘问题的时候,都会选择使用Tuxera NTFS这个磁盘读写工具.因为这款读写工具不仅可以帮助我们进行读写工作,还具有一个磁盘管理工具Disk Manag ...
- 从执行上下文角度重新理解.NET(Core)的多线程编程[2]:同步上下文
一般情况下,我们可以将某项操作分发给任意线程来执行,但有的操作确实对于执行的线程是有要求的,最为典型的场景就是:GUI针对UI元素的操作必须在UI主线程中执行.将指定的操作分发给指定线程进行执行的需求 ...
- Windows下创建指定大小的文件
前言 因为需要测试存储容量,所以需要能生成指定大小的文件. 执行 #语法:fsutil file createnew 路径和文件名 文件大小 fsutil file createnew D:\test ...
- ?.可选链操作符( ?. ) 可选链运算符可防止抛出 TypeError: Cannot read property ’xxx' of undefined。
可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效.?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish ) (null ...
- Java数据结构(十)—— 树
树 树的概念和常用术语 常用术语 节点 根节点 父节点 子节点 叶子节点:没有子节点的节点 节点的权:节点的值 路径:节点A到节点B的路径 层 子树 树的高度:最大层数 森林:多颗子树构成森林 二叉树 ...