新人刚自己写的人民币转换大小写,比较简短,希望各位能理解,支持的顶啊! (顶的就有分)
新人刚自己写的人民币转换大小写,比较简短,希望各位能理解,支持的顶啊!
using System.Text;namespace MoneytoChinese{ class Test { static void Main() { for (; ; ) { System.Console.Write("金额: "); string s = System.Console.ReadLine(); decimal m = 450002030.05m; try { m = decimal.Parse(s); } catch { //break; } System.Console.WriteLine("大写: "+MoneytoChinese(m)); } } public static string MoneytoChinese(decimal money) { string ChineseMoney = ""; string[] snum = new string[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; string[] sdanwei = new string[] { "分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" }; long lastnum; int i = 0; for (long tmpmoney = (long)(money * 100); tmpmoney >= 1; tmpmoney /= 10) { lastnum = tmpmoney % 10; ChineseMoney = snum[lastnum] + sdanwei[i++] + ChineseMoney; } ChineseMoney = ChineseMoney.Replace("零角", "零"); ChineseMoney = ChineseMoney.Replace("零零分", ""); ChineseMoney = ChineseMoney.Replace("零分", ""); ChineseMoney = ChineseMoney.Replace("零拾", "零"); ChineseMoney = ChineseMoney.Replace("零佰", "零"); ChineseMoney = ChineseMoney.Replace("零仟", "零"); ChineseMoney = ChineseMoney.Replace("零零", "零"); ChineseMoney = ChineseMoney.Replace("零零", "零"); ChineseMoney = ChineseMoney.Replace("零元", "元"); ChineseMoney = ChineseMoney.Replace("零万", "万"); ChineseMoney = ChineseMoney.Replace("零亿", "亿"); ChineseMoney = ChineseMoney.Replace("亿万", "亿"); return ChineseMoney; } }}
// 例如:(new Money(200)).ToString() == "贰佰元"namespace Skyiv.Util{ using System.Text; class Test { static void Main() { for (;;) { System.Console.Write("金额: "); string s = System.Console.ReadLine(); decimal m; try { m = decimal.Parse(s); } catch { break; } System.Console.WriteLine("大写: " + new Money(m)); } } } // 该类重载的 ToString() 方法返回的是大写金额字符串 class Money { public string Yuan = "元"; // “元”,可以改为“圆”、“卢布”之类 public string Jiao = "角"; // “角”,可以改为“拾” public string Fen = "分"; // “分”,可以改为“美分”之类 static string Digit = "零壹贰叁肆伍陆柒捌玖"; // 大写数字 bool isAllZero = true; // 片段内是否全零 bool isPreZero = true; // 低一位数字是否是零 bool Overflow = false; // 溢出标志 long money100; // 金额*100,即以“分”为单位的金额 long value; // money100的绝对值 StringBuilder sb = new StringBuilder(); // 大写金额字符串,逆序 // 只读属性: "零元" public string ZeroString { get { return Digit[0] + Yuan; } } // 构造函数 public Money(decimal money) { try { money100 = (long)(money * 100m); } catch { Overflow = true; } if (money100 == long.MinValue) Overflow = true; } // 重载 ToString() 方法,返回大写金额字符串 public override string ToString() { if (Overflow) return "金额超出范围"; if (money100 == 0) return ZeroString; string [] Unit = { Yuan, "万", "亿", "万", "亿亿" }; value = System.Math.Abs(money100); ParseSection(true); for (int i = 0; i < Unit.Length && value > 0; i++) { if (isPreZero && !isAllZero) sb.Append(Digit[0]); if (i == 4 && sb.ToString().EndsWith(Unit[2])) sb.Remove(sb.Length - Unit[2].Length, Unit[2].Length); sb.Append(Unit[i]); ParseSection(false); if ((i % 2) == 1 && isAllZero) sb.Remove(sb.Length - Unit[i].Length, Unit[i].Length); } if (money100 < 0) sb.Append("负"); return Reverse(); } // 解析“片段”: “角分(2位)”或“万以内的一段(4位)” void ParseSection(bool isJiaoFen) { string [] Unit = isJiaoFen ? new string [] { Fen, Jiao } : new string [] { "", "拾", "佰", "仟" }; isAllZero = true; for (int i = 0; i < Unit.Length && value > 0; i++) { int d = (int)(value % 10); if (d != 0) { if (isPreZero && !isAllZero) sb.Append(Digit[0]); sb.AppendFormat("{0}{1}", Unit[i], Digit[d]); isAllZero = false; } isPreZero = (d == 0); value /= 10; } } // 反转字符串 string Reverse() { StringBuilder sbReversed = new StringBuilder(); for (int i = sb.Length - 1; i >= 0; i--) sbReversed.Append(sb[i]); return sbReversed.ToString(); } }}
[解决办法]
上次看见Q_282898034(我为编程狂)写的,是我见过最短的!!
using System.Text.RegularExpressions;string s = 10104.00.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}");Console.WriteLine(d + "\r\n" + Regex.Replace(d, ".", delegate(Match m) { return "负圆x零壹贰叁肆伍陆柒捌玖xxxxxxx分角拾佰仟万亿兆京垓秭穰" [m.Value[0] - '-'].ToString(); } ));
[解决办法]
谁能解释一下8楼代码的意思?
[解决办法]
正则表达式的,看着头大
顶,接分~~~~~
[解决办法]
LZ的程序在数字过大(比如“壹亿亿元”)时会出错:
System.Console.WriteLine("大写: "+MoneytoChinese(10000000000000000m));
[解决办法]
LZ的程序在小于“壹亿亿元”时我测试过的情形都是对的。
[解决办法]
if (i > 17) // 可以改成: if (i > 18)
[解决办法]
这样就行了:
public static string MoneytoChinese(decimal money) { if (money >= 10000000000000000m) return "不好意思,钱太多了,我眼花了头晕了算不过来了"; // .... }
[解决办法]
另外,楼主的程序也没有考虑负数的情形。
[解决办法]
在方法的开头加上:
if (money >= 10000000000000000m)
[解决办法]
狂顶。
[解决办法]
呵呵。不错,写得简单易懂啊。
[解决办法]
顶
[解决办法]
look
[解决办法]
不错,LZ坚持
[解决办法]
up
[解决办法]
ding
[解决办法]
收藏
[解决办法]
顶吧顶吧不是罪。
[解决办法]
顶我来拿分的
[解决办法]
支持
[解决办法]
顶
[解决办法]
顶!学习!
[解决办法]
8楼的 短小却精悍啊
[解决办法]
UP~
------解决方案--------------------
我也看过[我为编程狂]写的那个转换,
确实NB~
[解决办法]
顶了,学习好多的东西
[解决办法]
我为编程狂 的版本最强悍,不过,最近好像没看到他。。。
[解决办法]
up,
学习一哈!
[解决办法]
这个好
using System.Text.RegularExpressions;
string s = 10104.00.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}");
Console.WriteLine(d + "\r\n" +
Regex.Replace(d, ".", delegate(Match m)
{
return "负圆x零壹贰叁肆伍陆柒捌玖xxxxxxx分角拾佰仟万亿兆京垓秭穰"
[m.Value[0] - '-'].ToString();
}
)
);
[解决办法]
8楼的够强悍!
[解决办法]
这个是用友的面试题
[解决办法]
好帖,收藏
[解决办法]
顶一下!
[解决办法]
我顶。。。作为新人,我们一起好好加油
[解决办法]
我顶顶顶。。。这样的程序我在网上也见过
[解决办法]
肯定顶啊,就是要支持这样的东西,楼主没事的话完善哈子,以后就直接借用啦。
[解决办法]
呵呵 ,顶!有钱花就好!
[解决办法]
mark
[解决办法]
顶!
[解决办法]
既然来了,就顶一下吧、
[解决办法]
据说有分,就路过一下
很多年前也写过,思路和楼主差不多,都是用替换。。。
MoneytoChinese(12) = 壹拾贰元
理想的是:"拾贰圆整"
[解决办法]
-_-!!! 角和分也没处理。。。。
-------
嘻嘻嘻 伴水 清洁工 看帖要回帖 嘻嘻嘻嘻
[解决办法]
一个郁闷中的新人飘过
为什么可用分那么少
[解决办法]
什么东东哦
[解决办法]
支持8楼
mark 正则 的 钱钱
顶搂主
[解决办法]
哈
我去公司面试的时候也有这道题
忘了当时怎么写的了
跟楼主不太一样。。
[解决办法]
ChineseMoney = ChineseMoney.Replace("零角", "零");
ChineseMoney = ChineseMoney.Replace("零零分", "");
ChineseMoney = ChineseMoney.Replace("零分", "");
ChineseMoney = ChineseMoney.Replace("零拾", "零");
ChineseMoney = ChineseMoney.Replace("零佰", "零");
ChineseMoney = ChineseMoney.Replace("零仟", "零");
ChineseMoney = ChineseMoney.Replace("零零", "零");
ChineseMoney = ChineseMoney.Replace("零零", "零");
ChineseMoney = ChineseMoney.Replace("零元", "元");
ChineseMoney = ChineseMoney.Replace("零万", "万");
ChineseMoney = ChineseMoney.Replace("零亿", "亿");
ChineseMoney = ChineseMoney.Replace("亿万", "亿");
楼主如果还想程序段的话,把后面replace的两个参数保存到两个数组里,然后用循环处理就更短了。
[解决办法]
有没有人想用二叉树解决这个问题呢?
[解决办法]
接分,嘿嘿
[解决办法]
要支持.
[解决办法]
mark
[解决办法]
up
[解决办法]
路过接分!
[解决办法]
接分...
[解决办法]
嗯,不错。
[解决办法]
那正则那强啊。
[解决办法]
up~
[解决办法]
收藏~
[解决办法]
为人民币标记一下
[解决办法]
顶
[解决办法]
接分,正则表达式比较合理。
[解决办法]
顶一个
[解决办法]
看不懂```
[解决办法]
这么实用的东东,为什么不顶?
[解决办法]
点击查阅
js脚本_小写金额转换成大写(支持千分位格式及负数输入,整数部分可达44位-千正~元,小数部分可达5位-角~丝)
AmountInWords(dValue, maxDec)
[解决办法]
8楼的正则表达式很好很强大 学习
[解决办法]
顶。
[解决办法]
学习
[解决办法]
抢个100楼:)