111,132
社区成员
发帖
与我相关
我的任务
分享using System;
using System.Text.RegularExpressions;
class 转换器 : IFormatProvider, ICustomFormatter
{
public static readonly 转换器 大写金额 = new 转换器();
private 转换器()
{ }
object IFormatProvider.GetFormat(Type formatType)
{
return (this as ICustomFormatter);
}
string ICustomFormatter.Format(string format, object arg, IFormatProvider formatProvider)
{
bool isSelected = (format.Trim() == "大写");
decimal number = 0M;
try
{ number = Convert.ToDecimal(arg); }
catch (Exception)
{ isSelected = false; }
if (!isSelected)
if (arg is IFormattable)
return ((IFormattable)arg).
ToString(format, formatProvider);
else
return arg.ToString();
// 格式化数字为两位小数的,带有位标志的数字,正数、负数和零分别对应分号隔开的格式
string result = number.ToString("#穰'.'#仟#佰#拾#秭'.'#仟#佰#拾#垓'.'#仟#佰#拾#京'.'#仟#佰#拾#兆'.'#仟#佰#拾#億'.'#仟#佰#拾#萬'.'#仟#佰#拾#元.0角0分;负#穰'.'#仟#佰#拾#秭'.'#仟#佰#拾#垓'.'#仟#佰#拾#京'.'#仟#佰#拾#兆'.'#仟#佰#拾#億'.'#仟#佰#拾#萬'.'#仟#佰#拾#元.0角0分;零元");
// 从字符串左侧开始替换子字符串,遇到汉字“零”或者阿拉伯数字 0 - 9,替换就结束。
// 替换内容是捕获组 $1,该捕获组表示 0 个或 1 个在字符串最左侧的汉字“负”
result = Regex.Replace(result, @"^(负?)[^零\d]*", "$1");
// 替换字符串中以一个 0 开头,后跟一个字符,这种组合的连续。
// 因为肯定不会出现两个阿拉伯数字连续的情况,所以后跟字符确定为汉字。
// 规定该汉字不可以匹配汉字“元”。也不可以匹配右侧带“.”的汉字(特殊单位)。
// 将所有找到的匹配替换为“0”,注意:结果可能会产生“0”的连续的情况。
result = Regex.Replace(result, @"(0[^元](?!\.))+", "0");
// 删除字符串最右侧的,或右侧带“.”的汉字左侧的,一个或多个“0”的连续。
// 所有特殊单位的右侧带“.”,例如“億”“萬”“元”,这保证了上句不会替换它们。
result = Regex.Replace(result, @"0+(\D\.|$)", "$1");
// 替换所有以“.”开头的,一个汉字和一个“.”的组合,这是特殊单位左侧的个十百千位都是 0 造成的。
// 所以删除该特殊单位的字符,左侧会有一个“0”和一个汉字的组合,该组合会包含被删掉的特殊单位的含义。
result = Regex.Replace(result, @"(?<=\.)[^元]\.", "");
// 删除掉所有“.”。
result = Regex.Replace(result, @"\.", "");
// 如果字符串最后以“元”结束,就换成“元整”。
result = Regex.Replace(result, @"(元)$", "$1整");
// 用匿名方法作代理,将每个数字替换成汉字形式。
result = Regex.Replace(result, @"\d", delegate(Match m) { return "零壹贰叁肆伍陆柒捌玖"[m.Value[0] - '0'].ToString(); });
return result;
}
}
class Program
{
static void Main(string[] args)
{
object[] data = { 0, 20050138000000M, "women", 0.425, 20.1, -9.63f };
foreach (object o in data)
Console.WriteLine("{0,30} {1,-6}", o, string.Format(转换器.大写金额, "{0:大写}", o));
Console.ReadKey();
}
}using System;
using System.Text.RegularExpressions;
class Program
{
// 把阿拉伯数字的金额转换为中文大写数字
static string ConvertToChinese(double x)
{
string s = x.ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A");
string d = Regex.Replace(s, @"((?<=-|^)[^1-9]*)|((?'z'0)[0A-E]*((?=[1-9])|(?'-z'(?=[F-L\.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[\.]|$))))", "${b}${z}");
return Regex.Replace(d, ".", delegate(Match m) { return "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟萬億兆京垓秭穰"[m.Value[0] - '-'].ToString(); });
}
static void Main()
{
Random r = new Random();
for (int i = 0; i < 10; i++)
{
double x = r.Next() / 100.0;
Console.WriteLine("{0,14:N2}: {1}", x, ConvertToChinese(x));
}
}
}
/* 可能的输出:
5,607,400.68: 伍佰陆拾萬柒仟肆佰元陆角捌分
2,017,723.33: 贰佰零壹萬柒仟柒佰贰拾叁元叁角叁分
751,181.17: 柒拾伍萬壹仟壹佰捌拾壹元壹角柒分
7,849,851.53: 柒佰捌拾肆萬玖仟捌佰伍拾壹元伍角叁分
2,629,143.90: 贰佰陆拾贰萬玖仟壹佰肆拾叁元玖角
13,461,629.68: 壹仟叁佰肆拾陆萬壹仟陆佰贰拾玖元陆角捌分
4,594,391.16: 肆佰伍拾玖萬肆仟叁佰玖拾壹元壹角陆分
13,046,560.60: 壹仟叁佰零肆萬陆仟伍佰陆拾元陆角
13,041,371.21: 壹仟叁佰零肆萬壹仟叁佰柒拾壹元贰角壹分
20,639,609.44: 贰仟零陆拾叁萬玖仟陆佰零玖元肆角肆分
*/
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Math.Round(1.2, MidpointRounding.AwayFromZero));
Console.WriteLine(Math.Round(1.5, MidpointRounding.AwayFromZero));
Console.WriteLine(Math.Round(2.4, MidpointRounding.AwayFromZero));
Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero));
}
}
http://topic.csdn.net/u/20080125/16/e525de9d-e92f-44b9-8a8c-ea86a08f084b.html?seed=529739525
发表于:2008-01-28 06:10:3035楼 得分:0
这个代码的字符串操作借鉴了 空间IV 的,但是整体算法完全不同.又把效率提高了一大截. protected virtual void GetIntegralStack(decimal num, ulong position, StackWithIndex stack)
{
if (num < 10000M)
{
if ((num != 0M) || (position == 0xe8d4a51000L))
{
stack.Push(this.GetPositionText(position));
}
for (int i = 0; i < 4; i++)
{
int digit = (int) decimal.op_Modulus(num, 10M);
ulong num4 = (ulong) Math.Pow(10.0, (double) i);
num /= 10M;
stack.Push(this.GetDigitText(digit, num4));
}
}
else
{
this.GetIntegralStack(Math.Truncate(decimal.op_Modulus(num, 10000M)), position, stack);
this.GetIntegralStack(Math.Truncate((decimal) (num / 10000M)), position * ((ulong) 0x2710L), stack);
}
}using System;
using System.Collections.Generic;
static class RMB
{
private static readonly string DigitText = "零壹贰叁肆伍陆柒捌玖";
private static readonly string PositionText = "圆拾佰仟萬億兆京垓秭穰";
private static readonly string OtherText = "分角整负";
private static void GetFractionStack(int num, Stack<char> stack)
{
int fen, jiao = Math.DivRem(num, 10, out fen);
if (fen != 0)
{
stack.Push(OtherText[0]);
stack.Push(DigitText[fen]);
}
if (jiao != 0)
{
stack.Push(OtherText[1]);
stack.Push(DigitText[jiao]);
}
}
private static void GetIntegerStack(decimal num, int position, Stack<char> stack)
{
if (num < 10000M)
{
int _num = Decimal.ToInt32(num);
for (int i = 0, mod_10 = 0; i < 4; i++)
{
bool behindZero = mod_10 == 0;
_num = Math.DivRem(_num, 10, out mod_10);
if (mod_10 == 0)
{
if (behindZero)
if (_num == 0)
break;
else
continue;
}
else if (i > 0)
stack.Push(PositionText[i]);
stack.Push(DigitText[mod_10]);
}
}
else
{
GetIntegerStack(Decimal.Remainder(num, 10000M), position, stack);
int mask = -1, offset = 4;
while ((position & (0x1 << ++mask)) == 0) ;
mask += offset;
while (stack.Peek() == PositionText[offset++])
stack.Pop();
stack.Push(PositionText[mask]);
GetIntegerStack(Decimal.Divide(num, 10000M), position + 1, stack);
}
}
public static string DecimalFormatter(Decimal input)
{
Stack<char> stack = new Stack<char>(60);
bool isNegate = input < Decimal.Zero;
input = Decimal.Add(isNegate ? Decimal.Negate(input) : input, 0.005M);
decimal integer = Decimal.Truncate(input);
int fraction = Decimal.ToInt32(Decimal.Multiply(Decimal.Subtract(input, integer), 100M));
if (fraction == 0)
stack.Push(OtherText[2]);
else
GetFractionStack(fraction, stack);
if (integer != Decimal.Zero)
{
stack.Push(PositionText[0]);
GetIntegerStack(integer, 1, stack);
if (stack.Peek() == DigitText[0])
stack.Pop();
}
else if (fraction == 0)
{
stack.Push(PositionText[0]);
stack.Push(DigitText[0]);
}
if (isNegate)
stack.Push(OtherText[3]);
return new string(stack.ToArray());
}
}
class Program
{
static void Main()
{
decimal input = decimal.MaxValue;
Console.WriteLine(input /= 1000M);
// 国内银行通用上法转换:万万为亿,亿亿为兆
Console.WriteLine(RMB.DecimalFormatter(input));
Console.ReadKey();
}
}