Last active
December 23, 2015 12:09
Revisions
-
oldrev revised this gist
Sep 21, 2013 . No changes.There are no files selected for viewing
-
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 4 additions and 6 deletions.There are no files selected for viewing
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 charactersOriginal 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 && wanyiPart > 0) { zeroCount = ParseInteger(sb, wanyiPart, true, zeroCount); sb.Append("万"); } //处理亿到千亿的部分 if (integerPart >= 100000000L && yiPart > 0) { var isFirstSection = integerPart >= 100000000L && integerPart < 1000000000000L; zeroCount = ParseInteger(sb, yiPart, isFirstSection, zeroCount); sb.Append("亿"); } //处理万的部分 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 { zeroCount++; } integer -= integer / factor * factor; } -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 17 additions and 11 deletions.There are no files selected for viewing
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 charactersOriginal 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, true, zeroCount); sb.Append("万"); } //处理亿到千亿的部分 if (integerPart >= 100000000L) { var isFirstSection = integerPart >= 100000000L && integerPart < 1000000000000L; zeroCount = ParseInteger(sb, yiPart, isFirstSection, zeroCount); sb.Append("亿"); } //处理万的部分 if (integerPart >= 10000L) { var isFirstSection = integerPart >= 1000L && integerPart < 10000000L; zeroCount = ParseInteger(sb, wanPart, isFirstSection, zeroCount); sb.Append("万"); } //处理千及以后的部分 if (qianPart > 0) { 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) { Debug.Assert(decPart > 0 && decPart <= 99); var jiao = decPart / 10; var fen = decPart % 10; if (zeroCount > 0 && (jiao > 0 || fen > 0) && integerPart > 0) { sb.Append("零"); } if (jiao > 0) { sb.Append(RmbDigits[jiao]); sb.Append("角"); } 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, 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; -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 17 additions and 17 deletions.There are no files selected for viewing
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 charactersOriginal 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) { zeroCount = ParseInteger(sb, wanyiPart, zeroCount); sb.Append("万"); } //处理亿到千亿的部分 if (integerPart >= 100000000L) { zeroCount = ParseInteger(sb, yiPart, zeroCount); sb.Append("亿"); } //处理万的部分 if (integerPart >= 10000L) { zeroCount = ParseInteger(sb, wanPart, zeroCount); sb.Append("万"); } @@ -63,7 +58,7 @@ public static string ToRmbUpper(this decimal price) { sb.Append("零"); } if (qianPart > 0) { 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, 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, 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)) { sb.Append("零"); } if (fen > 0) { @@ -104,10 +104,9 @@ private static void ParseDecimal(StringBuilder sb, long integerPart, long decPar } } 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; 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; } } } -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 5 additions and 3 deletions.There are no files selected for viewing
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 charactersOriginal 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 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) { } } -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 23 additions and 23 deletions.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -1,17 +1,16 @@ /** 大写人民币金额转换代码 * 作者:李维 <[email protected]> * 版权所有 (c) 2013 昆明维智众源企业管理咨询有限公司。保留所有权利。 * 本代码基于 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 = { @@ -28,39 +27,39 @@ public static string ToRmbUpper(this decimal price) { price = Math.Round(price, 2); var sb = new StringBuilder(); 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 (integerPart >= 1000000000000L) { ParseInteger(sb, wanyiPart); sb.Append("万"); } //处理亿到千亿的部分 if (integerPart >= 100000000L) { if (integerPart >= 1000000000000L && yiPart > 0 && yiPart <= 999) { sb.Append("零"); } ParseInteger(sb, yiPart); sb.Append("亿"); } //处理万的部分 if (integerPart >= 10000L) { if (integerPart >= 100000000L && wanPart > 0 && wanPart <= 999) { sb.Append("零"); } ParseInteger(sb, wanPart); sb.Append("万"); } //处理千及以后的部分 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, 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 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 && 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 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 = integer / factor; if (digit != 0) { if (zeroCount > 0) { @@ -123,10 +122,11 @@ private static void ParseInteger(StringBuilder sb, long value) { zeroCount++; } } integer -= integer / factor * factor; } } } } -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 7 additions and 11 deletions.There are no files selected for viewing
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 charactersOriginal 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[] 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 && 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 > 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 = value / factor; if (digit != 0) { if (zeroCount > 0) { sb.Append("零"); } sb.Append(RmbDigits[digit]); sb.Append(SectionChars[nDigits - i - 1]); zeroCount = 0; } else { if (i < nDigits) { zeroCount++; } } value -= value / factor * factor; } } -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 29 additions and 26 deletions.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -18,24 +18,34 @@ public static class RmbUpperConverter { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; private static readonly string[] DecDigits = { string.Empty, "拾", "佰", "仟", "万" }; public static string ToRmbUpper(this decimal price) { if (price < 0M || price >= 9999999999999999.99M) { throw new ArgumentOutOfRangeException("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 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; var zeroCount = 0; for (var i = 0; i < nDigits; i++) { var factor = (long)Math.Pow(10, nDigits - 1 - i); var digit = u / factor; //几种情况 if (digit != 0) { if (zeroCount > 0) { //连续多位都是 0,则只出一个零 sb.Append("零"); } sb.Append(RmbDigits[digit]); var f1 = nDigits - i - 1; sb.Append(DecDigits[f1]); zeroCount = 0; } else { if (i < nDigits) { zeroCount++; } } u -= u / factor * factor; } } -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 3 additions and 0 deletions.There are no files selected for viewing
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 charactersOriginal 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("元"); } -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 29 additions and 20 deletions.There are no files selected for viewing
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 charactersOriginal 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("零"); } if (qianPart > 0) { ParseInteger(sb, qianPart); sb.Append("元"); } //处理小数 if (decPart > 0) { ParseDecimal(sb, decPart); } else { sb.Append("整"); } return sb.ToString(); } private static void ParseDecimal(StringBuilder sb, long decPart) { 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("整"); -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 3 additions and 2 deletions.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -11,15 +11,16 @@ 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; -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 8 additions and 8 deletions.There are no files selected for viewing
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 charactersOriginal 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(decimal price) { 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); -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 0 additions and 1 deletion.There are no files selected for viewing
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 charactersOriginal 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(); var qianPart = (long)(price % 10000); var wanPart = ((long)(price % 100000000) - qianPart) / 10000; var yiPart = ((long)(price % 100000000000) - qianPart - wanPart) / 100000000; -
oldrev revised this gist
Sep 20, 2013 . 1 changed file with 23 additions and 26 deletions.There are no files selected for viewing
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 charactersOriginal 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 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) { 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("整"); } } @@ -109,9 +108,7 @@ private static void ParseInteger(StringBuilder sb, long value) { if (!skipSpec) { var f1 = nDigits - i - 1; sb.Append(DecDigits[f1]); } u -= u / factor * factor; -
oldrev created this gist
Sep 20, 2013 .There are no files selected for viewing
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 charactersOriginal 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; } } } }