[原创] 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. ...
随机推荐
- 深坑啊!同一个Spring AOP的坑,我一天踩了两次!
GitHub 18k Star 的Java工程师成神之路,不来了解一下吗! GitHub 18k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 18k Star 的Java工 ...
- TypeScript注意
中文文档中,元组目前已经不能越界访问
- Kafka架构深入:Kafka 工作流程及文件存储机制
kafka工作流程: 每个分区都有一个offset消费偏移量,kafka并不能保证全局有序性. Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic 的 ...
- linux 命令之file
Linux file命令用于辨识文件类型. 通过file指令,我们得以辨识该文件的类型. 语法 file [-bcLvz][-f <名称文件>][-m <魔法数字文件>...] ...
- 【linux】gpio子系统
目录 前言 linux子系统 gpio子系统 gpio子系统实战-系统调用 前言 目前不涉及驱动源码 参考链接 linux子系统 在 Linux 系统中 绝大多数硬件设备都有非常成熟的驱动框架 驱动工 ...
- RBD快速删除的方法分析与改进
前言 这个问题在很久以前就有一篇文章进行过讨论 remove-big-rbd,这个文章写的比较清楚了,并且对不同的方法做了分析,这里先把结论说下 rbd类型 rbd rm 方法 rados -p rm ...
- Python_微信开发
<!-- 发消息功能 --> 0.微信开发的2个库 pip install werobot pip install 1.新建项目 2.项目下新建 robot 的app 3.写robot.p ...
- C#委托的详细总结
1.什么是委托 委托是C#中一种类型,它的作用相当于C语言中的函数指针,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用if- ...
- FTP的PORT(主动模式)和PASV(被动模式)
最近做一个项目用到FTP和其它系统进行文件传输,结果在FTP网络连接的问题上花了很多时间,由于太久没搞多FTP,忘记了FTP不单单开放21端口,客户端采用不同连接模式对网络有不同.在此重温一下FTP的 ...
- 面试阿里,腾讯,字节跳动90%都会被问到的Spring中的循环依赖
前言 Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃 ...