Skip to content

Instantly share code, notes, and snippets.

@oldrev
Last active December 23, 2015 12:09

Revisions

  1. oldrev revised this gist Sep 21, 2013. No changes.
  2. oldrev revised this gist Sep 20, 2013. 1 changed file with 4 additions and 6 deletions.
    10 changes: 4 additions & 6 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -36,20 +36,20 @@ public static string ToRmbUpper(this decimal price) {

    int zeroCount = 0;
    //处理万亿以上的部分
    if (integerPart >= 1000000000000L) {
    if (integerPart >= 1000000000000L && wanyiPart > 0) {
    zeroCount = ParseInteger(sb, wanyiPart, true, zeroCount);
    sb.Append("万");
    }

    //处理亿到千亿的部分
    if (integerPart >= 100000000L) {
    if (integerPart >= 100000000L && yiPart > 0) {
    var isFirstSection = integerPart >= 100000000L && integerPart < 1000000000000L;
    zeroCount = ParseInteger(sb, yiPart, isFirstSection, zeroCount);
    sb.Append("亿");
    }

    //处理万的部分
    if (integerPart >= 10000L) {
    if (integerPart >= 10000L && wanPart > 0) {
    var isFirstSection = integerPart >= 1000L && integerPart < 10000000L;
    zeroCount = ParseInteger(sb, wanPart, isFirstSection, zeroCount);
    sb.Append("万");
    @@ -126,9 +126,7 @@ private static int ParseInteger(StringBuilder sb, long integer, bool isFirstSect
    zeroCount = 0;
    }
    else {
    if (i < nDigits) {
    zeroCount++;
    }
    zeroCount++;
    }
    integer -= integer / factor * factor;
    }
  3. oldrev revised this gist Sep 20, 2013. 1 changed file with 17 additions and 11 deletions.
    28 changes: 17 additions & 11 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -37,28 +37,31 @@ public static string ToRmbUpper(this decimal price) {
    int zeroCount = 0;
    //处理万亿以上的部分
    if (integerPart >= 1000000000000L) {
    zeroCount = ParseInteger(sb, wanyiPart, zeroCount);
    zeroCount = ParseInteger(sb, wanyiPart, true, zeroCount);
    sb.Append("万");
    }

    //处理亿到千亿的部分
    if (integerPart >= 100000000L) {
    zeroCount = ParseInteger(sb, yiPart, zeroCount);
    var isFirstSection = integerPart >= 100000000L && integerPart < 1000000000000L;
    zeroCount = ParseInteger(sb, yiPart, isFirstSection, zeroCount);
    sb.Append("亿");
    }

    //处理万的部分
    if (integerPart >= 10000L) {
    zeroCount = ParseInteger(sb, wanPart, zeroCount);
    var isFirstSection = integerPart >= 1000L && integerPart < 10000000L;
    zeroCount = ParseInteger(sb, wanPart, isFirstSection, zeroCount);
    sb.Append("万");
    }

    //处理千及以后的部分
    if (integerPart >= 10000L && qianPart > 0 && qianPart <= 999) {
    sb.Append("零");
    }
    if (qianPart > 0) {
    zeroCount = ParseInteger(sb, qianPart, zeroCount);
    var isFirstSection = integerPart < 1000L;
    zeroCount = ParseInteger(sb, qianPart, isFirstSection, zeroCount);
    }
    else {
    zeroCount += 1;
    }

    if (integerPart > 0) {
    @@ -79,20 +82,20 @@ public static string ToRmbUpper(this decimal price) {
    return sb.ToString();
    }

    private static void ParseDecimal(StringBuilder sb, long integerPart, long decPart, int zeroCount = 0) {
    private static void ParseDecimal(StringBuilder sb, long integerPart, long decPart, int zeroCount) {
    Debug.Assert(decPart > 0 && decPart <= 99);
    var jiao = decPart / 10;
    var fen = decPart % 10;

    if (zeroCount > 0 && (jiao > 0 || fen > 0)) {
    if (zeroCount > 0 && (jiao > 0 || fen > 0) && integerPart > 0) {
    sb.Append("零");
    }

    if (jiao > 0) {
    sb.Append(RmbDigits[jiao]);
    sb.Append("角");
    }
    if ((jiao == 0 && fen > 0 && integerPart > 0)) {
    if (zeroCount == 0 && jiao == 0 && fen > 0 && integerPart > 0) {
    sb.Append("零");
    }
    if (fen > 0) {
    @@ -104,9 +107,12 @@ private static void ParseDecimal(StringBuilder sb, long integerPart, long decPar
    }
    }

    private static int ParseInteger(StringBuilder sb, long integer, int zeroCount = 0) {
    private static int ParseInteger(StringBuilder sb, long integer, bool isFirstSection, int zeroCount) {
    Debug.Assert(integer > 0 && integer <= 9999);
    int nDigits = (int)Math.Floor(Math.Log10(integer)) + 1;
    if (!isFirstSection && integer < 1000) {
    zeroCount++;
    }
    for (var i = 0; i < nDigits; i++) {
    var factor = (long)Math.Pow(10, nDigits - 1 - i);
    var digit = integer / factor;
  4. oldrev revised this gist Sep 20, 2013. 1 changed file with 17 additions and 17 deletions.
    34 changes: 17 additions & 17 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    /** 大写人民币金额转换代码
    /** 中文互联网上迄今为止实现最正确、代码最漂亮且效率最高的大写人民币金额转换代码
    * 作者:李维 <[email protected]>
    * 版权所有 (c) 2013 昆明维智众源企业管理咨询有限公司。保留所有权利。
    * 本代码基于 BSD License 授权。
    @@ -34,27 +34,22 @@ public static string ToRmbUpper(this decimal price) {
    var qianPart = integerPart % 10000L;
    var decPart = (long)(price * 100) % 100;

    int zeroCount = 0;
    //处理万亿以上的部分
    if (integerPart >= 1000000000000L) {
    ParseInteger(sb, wanyiPart);
    zeroCount = ParseInteger(sb, wanyiPart, zeroCount);
    sb.Append("万");
    }

    //处理亿到千亿的部分
    if (integerPart >= 100000000L) {
    if (integerPart >= 1000000000000L && yiPart > 0 && yiPart <= 999) {
    sb.Append("零");
    }
    ParseInteger(sb, yiPart);
    zeroCount = ParseInteger(sb, yiPart, zeroCount);
    sb.Append("亿");
    }

    //处理万的部分
    if (integerPart >= 10000L) {
    if (integerPart >= 100000000L && wanPart > 0 && wanPart <= 999) {
    sb.Append("零");
    }
    ParseInteger(sb, wanPart);
    zeroCount = ParseInteger(sb, wanPart, zeroCount);
    sb.Append("万");
    }

    @@ -63,7 +58,7 @@ public static string ToRmbUpper(this decimal price) {
    sb.Append("零");
    }
    if (qianPart > 0) {
    ParseInteger(sb, qianPart);
    zeroCount = ParseInteger(sb, qianPart, zeroCount);
    }

    if (integerPart > 0) {
    @@ -72,7 +67,7 @@ public static string ToRmbUpper(this decimal price) {

    //处理小数
    if (decPart > 0) {
    ParseDecimal(sb, integerPart, decPart);
    ParseDecimal(sb, integerPart, decPart, zeroCount);
    }
    else if (decPart <= 0 && integerPart > 0) {
    sb.Append("整");
    @@ -84,15 +79,20 @@ public static string ToRmbUpper(this decimal price) {
    return sb.ToString();
    }

    private static void ParseDecimal(StringBuilder sb, long integerPart, long decPart) {
    private static void ParseDecimal(StringBuilder sb, long integerPart, long decPart, int zeroCount = 0) {
    Debug.Assert(decPart > 0 && decPart <= 99);
    var jiao = decPart / 10;
    var fen = decPart % 10;

    if (zeroCount > 0 && (jiao > 0 || fen > 0)) {
    sb.Append("零");
    }

    if (jiao > 0) {
    sb.Append(RmbDigits[jiao]);
    sb.Append("角");
    }
    if (jiao == 0 && fen > 0 && integerPart > 0) {
    if ((jiao == 0 && fen > 0 && integerPart > 0)) {
    sb.Append("零");
    }
    if (fen > 0) {
    @@ -104,10 +104,9 @@ private static void ParseDecimal(StringBuilder sb, long integerPart, long decPar
    }
    }

    private static void ParseInteger(StringBuilder sb, long integer) {
    private static int ParseInteger(StringBuilder sb, long integer, int zeroCount = 0) {
    Debug.Assert(integer > 0 && integer <= 9999);
    int nDigits = (int)Math.Floor(Math.Log10(integer)) + 1;
    var zeroCount = 0;
    for (var i = 0; i < nDigits; i++) {
    var factor = (long)Math.Pow(10, nDigits - 1 - i);
    var digit = integer / factor;
    @@ -127,8 +126,9 @@ private static void ParseInteger(StringBuilder sb, long integer) {
    }
    integer -= integer / factor * factor;
    }
    return zeroCount;
    }

    }

    }
    }
  5. oldrev revised this gist Sep 20, 2013. 1 changed file with 5 additions and 3 deletions.
    8 changes: 5 additions & 3 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -4,13 +4,13 @@
    * 本代码基于 BSD License 授权。
    * */


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;

    namespace Sandwych.RmbConverter {

    public static class RmbUpperConverter {

    private static readonly Char[] RmbDigits = {
    @@ -74,9 +74,12 @@ public static string ToRmbUpper(this decimal price) {
    if (decPart > 0) {
    ParseDecimal(sb, integerPart, decPart);
    }
    else {
    else if (decPart <= 0 && integerPart > 0) {
    sb.Append("整");
    }
    else {
    sb.Append("零元整");
    }

    return sb.ToString();
    }
    @@ -128,5 +131,4 @@ private static void ParseInteger(StringBuilder sb, long integer) {

    }


    }
  6. oldrev revised this gist Sep 20, 2013. 1 changed file with 23 additions and 23 deletions.
    46 changes: 23 additions & 23 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -1,17 +1,16 @@
    /** 中文互联网上写的最漂亮效率最高的大写人民币金额转换代码
    /** 大写人民币金额转换代码
    * 作者:李维 <[email protected]>
    * 版权所有 (c) 2013 李维。保留所有权利。
    * 版权所有 (c) 2013 昆明维智众源企业管理咨询有限公司。保留所有权利。
    * 本代码基于 BSD License 授权。
    * */


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;

    namespace RMBUpper {

    namespace Sandwych.RmbConverter {
    public static class RmbUpperConverter {

    private static readonly Char[] RmbDigits = {
    @@ -28,39 +27,39 @@ public static string ToRmbUpper(this decimal price) {
    price = Math.Round(price, 2);
    var sb = new StringBuilder();

    var wanyiPart = (long)price / 1000000000000L;
    var yiPart = ((long)price % 1000000000000L) / 100000000L;
    var wanPart = ((long)price % 100000000L) / 10000L;
    var qianPart = (long)(price % 10000L);
    var integerPart = (long)price;
    var wanyiPart = integerPart / 1000000000000L;
    var yiPart = integerPart % 1000000000000L / 100000000L;
    var wanPart = integerPart % 100000000L / 10000L;
    var qianPart = integerPart % 10000L;
    var decPart = (long)(price * 100) % 100;

    //处理万亿以上的部分
    if (price >= 1000000000000M) {
    if (integerPart >= 1000000000000L) {
    ParseInteger(sb, wanyiPart);
    sb.Append("万");
    }

    //处理亿到千亿的部分
    if (price >= 100000000M) {
    if (price >= 1000000000000M && yiPart > 0 && yiPart <= 999) {
    if (integerPart >= 100000000L) {
    if (integerPart >= 1000000000000L && yiPart > 0 && yiPart <= 999) {
    sb.Append("零");
    }
    ParseInteger(sb, yiPart);
    sb.Append("亿");
    }

    //处理万的部分
    if (price >= 10000M) {
    if (price >= 100000000M && wanPart > 0 && wanPart <= 999) {
    if (integerPart >= 10000L) {
    if (integerPart >= 100000000L && wanPart > 0 && wanPart <= 999) {
    sb.Append("零");
    }
    ParseInteger(sb, wanPart);
    sb.Append("万");
    }

    //处理千及以后的部分
    if (price >= 10000M && qianPart > 0 && qianPart <= 999) {
    if (integerPart >= 10000L && qianPart > 0 && qianPart <= 999) {
    sb.Append("零");
    }
    if (qianPart > 0) {
    @@ -73,7 +72,7 @@ public static string ToRmbUpper(this decimal price) {

    //处理小数
    if (decPart > 0) {
    ParseDecimal(sb, decPart);
    ParseDecimal(sb, integerPart, decPart);
    }
    else {
    sb.Append("整");
    @@ -82,15 +81,15 @@ public static string ToRmbUpper(this decimal price) {
    return sb.ToString();
    }

    private static void ParseDecimal(StringBuilder sb, long decPart) {
    private static void ParseDecimal(StringBuilder sb, long integerPart, long decPart) {
    Debug.Assert(decPart > 0 && decPart <= 99);
    var jiao = decPart / 10;
    var fen = decPart % 10;
    if (jiao > 0) {
    sb.Append(RmbDigits[jiao]);
    sb.Append("角");
    }
    if (jiao == 0 && fen > 0) {
    if (jiao == 0 && fen > 0 && integerPart > 0) {
    sb.Append("零");
    }
    if (fen > 0) {
    @@ -102,13 +101,13 @@ private static void ParseDecimal(StringBuilder sb, long decPart) {
    }
    }

    private static void ParseInteger(StringBuilder sb, long value) {
    Debug.Assert(value > 0 && value <= 9999);
    int nDigits = (int)Math.Floor(Math.Log10(value)) + 1;
    private static void ParseInteger(StringBuilder sb, long integer) {
    Debug.Assert(integer > 0 && integer <= 9999);
    int nDigits = (int)Math.Floor(Math.Log10(integer)) + 1;
    var zeroCount = 0;
    for (var i = 0; i < nDigits; i++) {
    var factor = (long)Math.Pow(10, nDigits - 1 - i);
    var digit = value / factor;
    var digit = integer / factor;

    if (digit != 0) {
    if (zeroCount > 0) {
    @@ -123,10 +122,11 @@ private static void ParseInteger(StringBuilder sb, long value) {
    zeroCount++;
    }
    }
    value -= value / factor * factor;
    integer -= integer / factor * factor;
    }
    }

    }


    }
  7. oldrev revised this gist Sep 20, 2013. 1 changed file with 7 additions and 11 deletions.
    18 changes: 7 additions & 11 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -17,7 +17,7 @@ public static class RmbUpperConverter {
    private static readonly Char[] RmbDigits = {
    '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };

    private static readonly string[] DecDigits = {
    private static readonly string[] SectionChars = {
    string.Empty, "拾", "佰", "仟", "万" };

    public static string ToRmbUpper(this decimal price) {
    @@ -83,7 +83,7 @@ public static string ToRmbUpper(this decimal price) {
    }

    private static void ParseDecimal(StringBuilder sb, long decPart) {
    Debug.Assert(decPart > 0);
    Debug.Assert(decPart > 0 && decPart <= 99);
    var jiao = decPart / 10;
    var fen = decPart % 10;
    if (jiao > 0) {
    @@ -103,31 +103,27 @@ private static void ParseDecimal(StringBuilder sb, long decPart) {
    }

    private static void ParseInteger(StringBuilder sb, long value) {
    Debug.Assert(value <= 9999);
    var u = Math.Abs(value);
    int nDigits = (int)Math.Floor(Math.Log10(u)) + 1;
    Debug.Assert(value > 0 && value <= 9999);
    int nDigits = (int)Math.Floor(Math.Log10(value)) + 1;
    var zeroCount = 0;
    for (var i = 0; i < nDigits; i++) {
    var factor = (long)Math.Pow(10, nDigits - 1 - i);
    var digit = u / factor;
    var digit = value / factor;

    //几种情况
    if (digit != 0) {
    if (zeroCount > 0) {
    //连续多位都是 0,则只出一个零
    sb.Append("零");
    }
    sb.Append(RmbDigits[digit]);
    var f1 = nDigits - i - 1;
    sb.Append(DecDigits[f1]);
    sb.Append(SectionChars[nDigits - i - 1]);
    zeroCount = 0;
    }
    else {
    if (i < nDigits) {
    zeroCount++;
    }
    }
    u -= u / factor * factor;
    value -= value / factor * factor;
    }
    }

  8. oldrev revised this gist Sep 20, 2013. 1 changed file with 29 additions and 26 deletions.
    55 changes: 29 additions & 26 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -18,24 +18,34 @@ public static class RmbUpperConverter {
    '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };

    private static readonly string[] DecDigits = {
    string.Empty, "拾", "佰", "仟", string.Empty, "万" };
    string.Empty, "拾", "佰", "仟", "万" };

    public static string ToRmbUpper(this decimal price) {
    if (price < 0M) {
    if (price < 0M || price >= 9999999999999999.99M) {
    throw new ArgumentOutOfRangeException("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 wanyiPart = (long)price / 1000000000000L;
    var yiPart = ((long)price % 1000000000000L) / 100000000L;
    var wanPart = ((long)price % 100000000L) / 10000L;
    var qianPart = (long)(price % 10000L);
    var integerPart = (long)price;
    var decPart = (long)(price * 100) % 100;

    //处理亿的部分
    //处理万亿以上的部分
    if (price >= 1000000000000M) {
    ParseInteger(sb, wanyiPart);
    sb.Append("万");
    }

    //处理亿到千亿的部分
    if (price >= 100000000M) {
    if (price >= 1000000000000M && yiPart > 0 && yiPart <= 999) {
    sb.Append("零");
    }
    ParseInteger(sb, yiPart);
    sb.Append("亿");
    }
    @@ -93,38 +103,31 @@ private static void ParseDecimal(StringBuilder sb, long decPart) {
    }

    private static void ParseInteger(StringBuilder sb, long value) {
    Debug.Assert(value <= 9999);
    var u = Math.Abs(value);
    int nDigits = (int)Math.Floor(Math.Log10(u)) + 1;
    long lastDigit = -1;
    var zeroCount = 0;
    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) {
    if (digit != 0) {
    if (zeroCount > 0) {
    //连续多位都是 0,则只出一个零
    sb.Append("零");
    }
    sb.Append(RmbDigits[digit]);
    skipSpec = true;
    }
    else {
    sb.Append(RmbDigits[digit]);
    skipSpec = false;
    }

    if (!skipSpec) {
    var f1 = nDigits - i - 1;
    sb.Append(DecDigits[f1]);
    zeroCount = 0;
    }
    else {
    if (i < nDigits) {
    zeroCount++;
    }
    }

    u -= u / factor * factor;
    lastDigit = digit;
    }
    }

  9. oldrev revised this gist Sep 20, 2013. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -55,6 +55,9 @@ public static string ToRmbUpper(this decimal price) {
    }
    if (qianPart > 0) {
    ParseInteger(sb, qianPart);
    }

    if (integerPart > 0) {
    sb.Append("元");
    }

  10. oldrev revised this gist Sep 20, 2013. 1 changed file with 29 additions and 20 deletions.
    49 changes: 29 additions & 20 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -8,6 +8,7 @@
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;

    namespace RMBUpper {

    @@ -20,6 +21,10 @@ public static class RmbUpperConverter {
    string.Empty, "拾", "佰", "仟", string.Empty, "万" };

    public static string ToRmbUpper(this decimal price) {
    if (price < 0M) {
    throw new ArgumentOutOfRangeException("price");
    }

    price = Math.Round(price, 2);
    var sb = new StringBuilder();

    @@ -48,32 +53,36 @@ public static string ToRmbUpper(this decimal price) {
    if (price >= 10000M && qianPart > 0 && qianPart <= 999) {
    sb.Append("零");
    }
    ParseInteger(sb, qianPart);
    sb.Append("元");
    if (qianPart > 0) {
    ParseInteger(sb, qianPart);
    sb.Append("元");
    }

    ParseDecimal(sb, decPart);
    //处理小数
    if (decPart > 0) {
    ParseDecimal(sb, decPart);
    }
    else {
    sb.Append("整");
    }

    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("整");
    }
    Debug.Assert(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("整");
  11. oldrev revised this gist Sep 20, 2013. 1 changed file with 3 additions and 2 deletions.
    5 changes: 3 additions & 2 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -11,15 +11,16 @@

    namespace RMBUpper {

    public class RmbUpperConverter {
    public static class RmbUpperConverter {

    private static readonly Char[] RmbDigits = {
    '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };

    private static readonly string[] DecDigits = {
    string.Empty, "拾", "佰", "仟", string.Empty, "万" };

    public static string ToUpper(decimal price) {
    public static string ToRmbUpper(this decimal price) {
    price = Math.Round(price, 2);
    var sb = new StringBuilder();

    var yiPart = (long)price / 100000000;
  12. oldrev revised this gist Sep 20, 2013. 1 changed file with 8 additions and 8 deletions.
    16 changes: 8 additions & 8 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -19,32 +19,32 @@ public class RmbUpperConverter {
    private static readonly string[] DecDigits = {
    string.Empty, "拾", "佰", "仟", string.Empty, "万" };

    public static string ToUpper(double price) {
    public static string ToUpper(decimal price) {
    var sb = new StringBuilder();

    var yiPart = (long)price / 100000000;
    var wanPart = ((long)price - yiPart * 100000000) / 10000;
    var qianPart = (long)(price % 10000);
    var wanPart = ((long)(price % 100000000) - qianPart) / 10000;
    var yiPart = ((long)(price % 100000000000) - qianPart - wanPart) / 100000000;
    var integerPart = yiPart * 100000000 + wanPart * 10000 + qianPart;
    var integerPart = (long)price;
    var decPart = (long)(price * 100) % 100;

    //处理亿的部分
    if (price > 99999999.99) {
    if (price >= 100000000M) {
    ParseInteger(sb, yiPart);
    sb.Append("亿");
    }

    //处理万的部分
    if (price > 9999.99) {
    if (price > 99999999.99 && wanPart > 0 && wanPart <= 999) {
    if (price >= 10000M) {
    if (price >= 100000000M && wanPart > 0 && wanPart <= 999) {
    sb.Append("零");
    }
    ParseInteger(sb, wanPart);
    sb.Append("万");
    }

    //处理千及以后的部分
    if (price > 9999.99 && qianPart > 0 && qianPart <= 999) {
    if (price >= 10000M && qianPart > 0 && qianPart <= 999) {
    sb.Append("零");
    }
    ParseInteger(sb, qianPart);
  13. oldrev revised this gist Sep 20, 2013. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -22,7 +22,6 @@ public class RmbUpperConverter {
    public static string ToUpper(double price) {
    var sb = new StringBuilder();

    int nDigits = (int)Math.Floor(Math.Log10(Math.Abs(price))) + 1;
    var qianPart = (long)(price % 10000);
    var wanPart = ((long)(price % 100000000) - qianPart) / 10000;
    var yiPart = ((long)(price % 100000000000) - qianPart - wanPart) / 100000000;
  14. oldrev revised this gist Sep 20, 2013. 1 changed file with 23 additions and 26 deletions.
    49 changes: 23 additions & 26 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -13,10 +13,11 @@ namespace RMBUpper {

    public class RmbUpperConverter {

    private static readonly Char[] RmbDigits = {
    private static readonly Char[] RmbDigits = {
    '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
    private static readonly Dictionary<int, string> DecDigits =
    new Dictionary<int, string>() { { 0, "" }, { 1, "拾" }, { 2, "佰" }, { 3, "仟" }, { 5, "万" } };

    private static readonly string[] DecDigits = {
    string.Empty, "拾", "佰", "仟", string.Empty, "万" };

    public static string ToUpper(double price) {
    var sb = new StringBuilder();
    @@ -56,28 +57,26 @@ public static string ToUpper(double price) {
    }

    private static void ParseDecimal(StringBuilder sb, long decPart) {
    if (decPart <= 0) {
    sb.Append("整");
    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 {
    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("整");
    }
    }
    sb.Append("整");
    }
    }

    @@ -109,9 +108,7 @@ private static void ParseInteger(StringBuilder sb, long value) {

    if (!skipSpec) {
    var f1 = nDigits - i - 1;
    if (DecDigits.ContainsKey(f1)) {
    sb.Append(DecDigits[f1]);
    }
    sb.Append(DecDigits[f1]);
    }

    u -= u / factor * factor;
  15. oldrev created this gist Sep 20, 2013.
    124 changes: 124 additions & 0 deletions RmbUpperConverter.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,124 @@
    /** 中文互联网上写的最漂亮效率最高的大写人民币金额转换代码
    * 作者:李维 <[email protected]>
    * 版权所有 (c) 2013 李维。保留所有权利。
    * 本代码基于 BSD License 授权。
    * */

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace RMBUpper {

    public class RmbUpperConverter {

    private static readonly Char[] RmbDigits = {
    '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
    private static readonly Dictionary<int, string> DecDigits =
    new Dictionary<int, string>() { { 0, "" }, { 1, "拾" }, { 2, "佰" }, { 3, "仟" }, { 5, "万" } };

    public static string ToUpper(double price) {
    var sb = new StringBuilder();

    int nDigits = (int)Math.Floor(Math.Log10(Math.Abs(price))) + 1;
    var qianPart = (long)(price % 10000);
    var wanPart = ((long)(price % 100000000) - qianPart) / 10000;
    var yiPart = ((long)(price % 100000000000) - qianPart - wanPart) / 100000000;
    var integerPart = yiPart * 100000000 + wanPart * 10000 + qianPart;
    var decPart = (long)(price * 100) % 100;

    //处理亿的部分
    if (price > 99999999.99) {
    ParseInteger(sb, yiPart);
    sb.Append("亿");
    }

    //处理万的部分
    if (price > 9999.99) {
    if (price > 99999999.99 && wanPart > 0 && wanPart <= 999) {
    sb.Append("零");
    }
    ParseInteger(sb, wanPart);
    sb.Append("万");
    }

    //处理千及以后的部分
    if (price > 9999.99 && 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) {
    sb.Append("整");
    }
    else {
    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("整");
    }
    }
    }
    }

    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;
    if (DecDigits.ContainsKey(f1)) {
    sb.Append(DecDigits[f1]);
    }
    }

    u -= u / factor * factor;
    lastDigit = digit;
    }
    }

    }

    }