[原创] 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. ...
随机推荐
- 深度探秘.NET 5.0
今年11月10号 .NET 5.0 如约而至.这是.NET All in one后的第一个版本,虽然不是LTS(Long term support)版本,但是是生产环境可用的. 有微软的背书,微软从. ...
- 源码分析:同步基础框架——AbstractQueuedSynchronizer(AQS)
简介 AQS 全称是 AbstractQueuedSynchronizer,位于java.util.concurrent.locks 包下面,AQS 提供了一个基于FIFO的队列和维护了一个状态sta ...
- 剑指offer刷题(算法类_2)
排序 035-数组中的逆序对(归并排序) 题目描述 题解 代码 复杂度 029-最小的K个数(堆排序) 题目描述 题解 代码 复杂度 029-最小的K个数(快速排序) 题目描述 题解 代码 复杂度 位 ...
- struts2中数据的传输
1.传统的写多个request接受参数方法. 2.struts2中的多个setter方法,getter方法 3.利用实体bean,让strut2 实例bean,少写setter方法,getter方法, ...
- spring中的数据库操作类
例子一: package cn.itcast.service.impl; import java.util.List; import javax.sql.DataSource; import org. ...
- http请求返回ObjectJson,Array之类转换类型
以下所说的类来自:package com.alibaba.fastjson 1,形如以下返回,其实是个json的map形式的返回 { "success": true, " ...
- Redis实现分布式缓存
Redis 分布式缓存实现(一) 1. 什么是缓存(Cache) 定义:就是计算机内存中的一段数据: 2. 内存中数据特点 a. 读写快 b. 断电立即丢失 3. 缓存解决了什么问题? a. 提 ...
- Javac编译器详解
学习<深入了解Java虚拟机>有一段时间了,大概理解了Java从源代码编译到执行出结果的过程,也能明确的知道Java是半解释性语言.在执行源代码时,先通过Javac编译器对源代码进行词法分 ...
- Mac系统使用Parallels Desktop安装Win10
1.Parallels Desktop破解版下载 2.原版Windows 10 2004 X64位 (原版安装)2020 11 Windows 系统镜像必须为原版,ghost版不行.亲测ghost版本 ...
- 【开源】.net微服务开发引擎Anno开源啦
1.Anno是什么? Anno是一个微服务框架引擎.入门简单.安全.稳定.高可用.全平台可监控.依赖第三方框架少.底层通讯RPC(Remote Procedure Call)采用稳定可靠经过无数成功项 ...