[原创] 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. ...
随机推荐
- Vue3.0初体验
最近看了Vue3.0的相关信息,相比Vue2.0有以下优点: Performance:性能更比Vue 2.0强. Tree shaking support:可以将无用模块"剪辑", ...
- waf 引擎 云原生平台tproxy 实现调研
了解了基本 云原生架构,不清楚的查看之前的文章:https://www.cnblogs.com/codestack/p/13914134.html 现在来看看云原生平台tproxy waf引擎串联实现 ...
- PID算法的C语言实现
1.根据我控制算法类文章中关于PID的理论的一些描述,同时也根据网络上一些其他的PID文章,以及自己最近一个项目的实践后,总结了几套基于C语言的PID算法,由于网络中很少有人进行分享完整的PID算法实 ...
- 内存使用过高点检checklist
正在运行的程序按照内存段来组织,内存段的类型有如下几种: 代码段:用户程序指令,长期存在内存中 数据段:全局变量等,长期存在内存中 堆:局部变量,参数参数等,短期存在内存中 栈:动态存储,可变 代码段 ...
- PHP代码审计入门(SQL注入漏洞挖掘基础)
SQL注入漏洞 SQL注入经常出现在登陆页面.和获取HTTP头(user-agent/client-ip等).订单处理等地方,因为这几个地方是业务相对复杂的,登陆页面的注入现在来说大多数是发生在HTT ...
- NO.A.0006——Git在IntelliJ IDEA中的使用/创建项目并推送到GitHub仓库/分支管理及分支合并
一.在IntelliJ IDEA中使用Git: 1.在IDEA下创建项目并编写一个main方法的工程: 在IDEA下新建一个Project IDEA-->新建一个Project-->Fil ...
- 万字长文!从底层开始带你了解并发编程,彻底帮你搞懂java锁!
线程是否要锁住同步资源 锁住 悲观锁 不锁住 乐观锁 锁住同步资源失败 线程是否要阻塞 阻塞 不阻塞自旋锁,适应性自旋锁 多个线程竞争同步资源的流程细节有没有区别 不锁住资源,多个线程只有一个能修改资 ...
- 全面解析RayFire的动态对象与静态对象
我们在日常使用RayFire的过程中,接触得比较多的应该就是RayFire的对象设置了.RayFire的对象包含了动态对象.静态对象与休眠对象,其中动态对象.静态对象可以结合动力学.运动学概念设置动作 ...
- jmeter压测mysql数据库
jmeter连接并压测mysql数据库,之前一直想用jmeter一下测试mysql数据库的性能,今天偶然看到一篇博客,于是乎开始自己动手实践. 一.准备工作 1.安装好mysql数据库,可以安装在本地 ...
- LeetCode周赛#209
1609. 奇偶树 #广搜 #二叉树的层次遍历 题目链接 题意 如果一棵二叉树满足下述几个条件,则可以称为奇偶树 : 二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标 ...