Skip to content

C# 金额转中文大写

Updated: at 08:22,Created: at 01:50

今天看到一个库是把金额转中文大写,看起来很容易,所以我就自己写了。

创建的项目是创建一个 dot net core 的项目,实际上这个项目可以创建为 Stand 的。

首先创建类,这个类的构造传入一个 double 作为人民币

public class Money
{
public Money(double money)
{
_money = money;
}
private double _money;
}

然后创建方法转换

public string ToCapital()
{
if (Math.Abs(_money) < 0.0001)
{
return "零元";
}
var str = GetIntPart();
GetDecimalPart(str);
return str.ToString();
}

其中 GetIntPart 是转换小数点前的部分,小数点之后的使用 GetDecimalPart 计算。

然后创建一些使用的数组

private static readonly List<char> Uppers = new List<char>()
{
'零',
'壹',
'贰',
'叁',
'肆',
'伍',
'陆',
'柒',
'捌',
'玖'
};
private static readonly List<char> Units = new List<char>()
{
'分',
'角'
};
private static readonly List<char> Grees = new List<char>()
{
'元',
'拾',
'佰',
'仟',
'万',
'拾',
'佰',
'仟',
'亿',
'拾',
'佰',
'仟',
'万',
'拾',
'佰'
};

转换小数点前的代码

StringBuilder str = new StringBuilder();
var money = _money;
for (int i = 0; money > 0.99999; i++)
{
var n = (int) (money % 10);
str.Insert(0,Grees[i]);
str.Insert(0,Uppers[n]);
money = money / 10;
money = money - n / 10.0;
}

但是这样转换得到的存在一些零,如输入 100 会输出 壹佰零拾零元 ,所以需要对输出转换

private StringBuilder GetIntPart()
{
StringBuilder str = new StringBuilder();
var money = _money;
for (int i = 0; money > 0.99999; i++)
{
var n = (int) (money % 10);
str.Insert(0, Grees[i]);
str.Insert(0, Uppers[n]);
money = money / 10;
money = money - n / 10.0;
}
str = str.Replace("零亿", "亿零");
str = str.Replace("零万", "万零");
str = str.Replace("零拾", "");
str = str.Replace("零佰", "");
str = str.Replace("零仟", "");
str = str.Replace("零零", "");
str = str.Replace("零零", "");
str = str.Replace("零亿", "亿");
str = str.Replace("零万", "");
str = str.Replace("零元", "");
return str;
}

转换小数的代码

private void GetDecimalPart(StringBuilder str)
{
var money = _money * 100;
for (int i = 0; i < 2; i++)
{
var n = (int) (money % 10);
if (n != 0)
{
str.Insert(0, Units[i]);
str.Insert(0, Uppers[n]);
}
money = money / 10;
}
}

所有代码

代码请看 https://gitee.com/lindexi/codes/w6bxlue9o14rv5nscjyhf20

另外有一个更全的库,请看 zmjack/Chinese: 中文解析通用工具。包括拼音,简繁转换,数字读法,货币读法。

// "mian3 fei4,kua4 ping2 tai1,kai1 yuan2!"
Pinyin.GetString("免费,跨平台,开源!", PinyinFormat.Default);
// "mian fei,kua ping tai,kai yuan!"
Pinyin.GetString("免费,跨平台,开源!", PinyinFormat.WithoutTone);
// "miǎn fèi,kuà píng tāi,kāi yuán!"
Pinyin.GetString("免费,跨平台,开源!", PinyinFormat.PhoneticSymbol);
var options = new ChineseNumberOptions { Simplified = false, Upper = false };
ChineseNumber.GetString(10_0001, options); // "一十万零一"
ChineseNumber.GetString(10_0101, options); // "一十万零一百零一"
ChineseNumber.GetString(10_1001, options); // "一十万一千零一"
ChineseNumber.GetString(10_1010, options); // "一十万一千零一十"
ChineseCurrency.GetString(10_0001, options); // "一十万零一元整"
ChineseCurrency.GetString(10_0101, options); // "一十万零一百零一元整"
ChineseCurrency.GetString(10_1001, options); // "一十万一千零一元整"
ChineseCurrency.GetString(10_1010, options); // "一十万一千零一十元整"
ChineseCurrency.GetString(10_0001.2m, options); // "一十万零一元二角整"
ChineseCurrency.GetString(10_0001.23m, options); // "一十万零一元二角三分"
ChineseCurrency.GetString(10_0001.03m, options); // "一十万零一元零三分"

参见:src/Money.php · 趋势软件/capital - 码云 Gitee.com


知识共享许可协议

原文链接: http://blog.lindexi.com/post/C-%E9%87%91%E9%A2%9D%E8%BD%AC%E4%B8%AD%E6%96%87%E5%A4%A7%E5%86%99

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系