Last active
December 23, 2015 12:09
-
-
Save oldrev/6633565 to your computer and use it in GitHub Desktop.
中文互联网上迄今为止实现最正确、代码最漂亮且效率最高的大写人民币金额转换代码
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** 中文互联网上写的最漂亮效率最高的大写人民币金额转换代码 | |
* 作者:李维 <[email protected]> | |
* 版权所有 (c) 2013 李维。保留所有权利。 | |
* 本代码基于 BSD License 授权。 | |
* */ | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
namespace RMBUpper { | |
public static class RmbUpperConverter { | |
private static readonly Char[] RmbDigits = { | |
'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; | |
private static readonly string[] DecDigits = { | |
string.Empty, "拾", "佰", "仟", string.Empty, "万" }; | |
public static string ToRmbUpper(this decimal price) { | |
price = Math.Round(price, 2); | |
var sb = new StringBuilder(); | |
var yiPart = (long)price / 100000000; | |
var wanPart = ((long)price - yiPart * 100000000) / 10000; | |
var qianPart = (long)(price % 10000); | |
var integerPart = (long)price; | |
var decPart = (long)(price * 100) % 100; | |
//处理亿的部分 | |
if (price >= 100000000M) { | |
ParseInteger(sb, yiPart); | |
sb.Append("亿"); | |
} | |
//处理万的部分 | |
if (price >= 10000M) { | |
if (price >= 100000000M && wanPart > 0 && wanPart <= 999) { | |
sb.Append("零"); | |
} | |
ParseInteger(sb, wanPart); | |
sb.Append("万"); | |
} | |
//处理千及以后的部分 | |
if (price >= 10000M && qianPart > 0 && qianPart <= 999) { | |
sb.Append("零"); | |
} | |
ParseInteger(sb, qianPart); | |
sb.Append("元"); | |
ParseDecimal(sb, decPart); | |
return sb.ToString(); | |
} | |
private static void ParseDecimal(StringBuilder sb, long decPart) { | |
if (decPart > 0) { | |
var jiao = decPart / 10; | |
var fen = decPart % 10; | |
if (jiao > 0) { | |
sb.Append(RmbDigits[jiao]); | |
sb.Append("角"); | |
} | |
if (jiao == 0 && fen > 0) { | |
sb.Append("零"); | |
} | |
if (fen > 0) { | |
sb.Append(RmbDigits[fen]); | |
sb.Append("分"); | |
} | |
else { | |
sb.Append("整"); | |
} | |
} | |
else { | |
sb.Append("整"); | |
} | |
} | |
private static void ParseInteger(StringBuilder sb, long value) { | |
var u = Math.Abs(value); | |
int nDigits = (int)Math.Floor(Math.Log10(u)) + 1; | |
long lastDigit = -1; | |
for (var i = 0; i < nDigits; i++) { | |
var factor = (long)Math.Pow(10, nDigits - 1 - i); | |
var digit = u / factor; | |
//几种情况 | |
//遇到零先跳过,下次循环再处理 | |
var skipSpec = false; | |
if (digit == 0 && i < nDigits - 1) { | |
skipSpec = true; | |
} //最后一位是0,则不能转换为“零” | |
else if (digit == 0 && i >= nDigits - 1) { | |
skipSpec = false; | |
}//连续两位都是 0,则只出一个零 | |
else if (lastDigit == 0 && digit == 0 && i < nDigits - 1) { | |
sb.Append(RmbDigits[digit]); | |
skipSpec = true; | |
} | |
else { | |
sb.Append(RmbDigits[digit]); | |
skipSpec = false; | |
} | |
if (!skipSpec) { | |
var f1 = nDigits - i - 1; | |
sb.Append(DecDigits[f1]); | |
} | |
u -= u / factor * factor; | |
lastDigit = digit; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Python 版:https://gist.github.com/oldrev/6638736