成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

利用結構化的設計看待人民幣大寫轉換

開發 架構
在網上看到不少人民幣大寫轉換的類,或多或少的總有一些問題,不放心用在企業開發上。而且每個人的思路總是天馬行空,別說面向對象的方法,就是面向過程也說不通,充斥著各種各樣的特殊情況。如果少考慮一種情況,那結果就很難預料,而且代碼的可讀性,我實在不敢恭維。

昨天,突然心血來潮,用結構化的思想整理了一遍,在這里就拿出來分享一下。

首先,數字應該分段,分成萬以下的、萬、億、兆這幾個段,并且每個段的長度固定是4個數字。比如說 123456 分為兩個段,前面一個未滿的段:12 ,后面是滿的段:3456 。

其次,每個滿段其實都是個十百千四個單位。比如:12345678 ,轉成數字大寫是:壹仟貳佰叁拾肆  萬  伍仟陸佰柒拾捌,發現什么規律了嗎?

***,就是處理一些必須有 0 的問題了,比如說:303 ,不能說:叁佰叁,應該是:叁佰零叁,這個“零”有很多講究的。

針對這些規律,我有針對性的整理出來兩個方法:SingleConvert 、MultiConvert 。其中 SingleConvert 處理段內的邏輯,MultiConvert 處理段間的邏輯,在段內的數字 0 問題穿插到 SingleConvert 方法中,段間的數字 0 問題穿插到 MultiConvert 方法中。另外,小數部分的處理,只有兩位數字,可以寫死,這個最簡單了。

說一下數字 0 的邏輯。

數字【3003】轉換出來應該是【叁仟零叁】,數字【303】轉換出來應該是【叁佰零叁】,可以看到段內連續出現一個或多個數字 0 的情況下,只會出現一個漢字【零】。

數字【3000000000300】轉換出來應該是【叁兆零叁佰】,數字【300000300】轉換出來應該是【叁億零叁佰】,可以看到段間連續出現一個或多個數字 0 的情況下,只會出現一個漢字【零】。

所以,段內邏輯和段間邏輯,在連續出現多個【零】的時候,只保留一個【零】。

數字【300】轉換出來應該是【叁佰】,數字【3000】轉換出來應該是【叁仟】,可以看到在段內***不管連續出現多少【零】,都抹掉不提。所以,段內邏輯中,末尾的一個或多個【零】,均不保留。

還有兩個不值得提的規律:每個數字對應一個單位,必定是【個十百千】;每段對應一個單位,從低到高的對應是【空、萬、億、兆、……】。原諒我不知大更高的單位是什么了,這輩子沒見過那么多錢,神那~~

然后,然后就沒規律了,下面上代碼:

 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Diagnostics; 
  4. using System.Linq; 
  5. using System.Text; 
  6.   
  7. namespace Lenic.Core 
  8.     /// <summary> 
  9.     /// 數字轉大寫漢字字符類 
  10.     /// </summary> 
  11.     [DebuggerStepThrough] 
  12.     public class NumericConvert 
  13.     { 
  14.         #region Private Fields 
  15.         /// <summary> 
  16.         /// 段的分隔字符,從低到高依次增加:空、萬、億、萬億,***不超過萬億的數字都可以 
  17.         /// </summary> 
  18.         public static readonly string[] DefaultRangeNumeric = new string[] { string.Empty, "萬""億""兆" }; 
  19.         /// <summary> 
  20.         /// 位的分隔字符,從低到高依次是:仟、佰、拾、空 
  21.         /// </summary> 
  22.         public static readonly char[] DefaultUnitNumeric = new char[] { '仟''佰''拾'char.MinValue }; 
  23.         /// <summary> 
  24.         /// 數字替換的字符,從低到高依次是:零、壹、貳、叁、肆、伍、陸、柒、捌、玖 
  25.         /// </summary> 
  26.         public static readonly char[] DefaultCharNumeric = new char[] { '零''壹''貳''叁''肆''伍''陸''柒''捌''玖' }; 
  27.   
  28.         private char[] charNumeric = DefaultCharNumeric; 
  29.         private string[] rangeNumeric = DefaultRangeNumeric; 
  30.         private char zeroNumeric = DefaultCharNumeric[0]; 
  31.         private char[] unitNumeric = DefaultUnitNumeric; 
  32.         #endregion 
  33.   
  34.         #region Business Methods 
  35.         /// <summary> 
  36.         /// 重置數字替換的字符,必須從小到大是 10 個漢字字符。 
  37.         /// </summary> 
  38.         /// <param name="data">目標字符數組</param> 
  39.         /// <returns>成功替換則返回 <c>true</c> 。</returns> 
  40.         public bool ResetCharNumeric(char[] data) 
  41.         { 
  42.             if (data == null || data.Length != 10) 
  43.                 return false
  44.   
  45.             charNumeric = data; 
  46.             zeroNumeric = data[0]; 
  47.             return true
  48.         } 
  49.   
  50.         /// <summary> 
  51.         /// 重置位的分隔字符,必須從小到大是 4 個漢字字符。 
  52.         /// </summary> 
  53.         /// <param name="data">目標字符數組</param> 
  54.         /// <returns>成功替換則返回 <c>true</c> 。</returns> 
  55.         public bool ResetUnitNumeric(char[] data) 
  56.         { 
  57.             if (data == null || data.Length != 4) 
  58.                 return false
  59.   
  60.             unitNumeric = data; 
  61.             return true
  62.         } 
  63.   
  64.         /// <summary> 
  65.         /// 重置段的分隔字符。 
  66.         /// </summary> 
  67.         /// <param name="data">目標字符數組</param> 
  68.         public void ResetRangeNumeric(string[] data) 
  69.         { 
  70.             rangeNumeric = data ?? DefaultRangeNumeric; 
  71.         } 
  72.   
  73.         /// <summary> 
  74.         /// 執行數字轉大寫漢字字符的操作。 
  75.         /// </summary> 
  76.         /// <param name="obj">待轉換的數字</param> 
  77.         /// <returns>轉換完成的大寫漢字字符串。</returns> 
  78.         public string Convert(decimal obj) 
  79.         { 
  80.             if (obj > 9999999999999999.99M) 
  81.                 throw new ApplicationException("The numeric too big!"); 
  82.   
  83.             var data = obj.ToString("#.##"); 
  84.   
  85.             var list = data.Split('.'); 
  86.   
  87.             var result = MultiConvert(list[0]); 
  88.             if (list.Length > 1) 
  89.                 result += DecimalConvert(list[1]); 
  90.   
  91.             return result; 
  92.         } 
  93.         #endregion 
  94.   
  95.         #region Private Methods 
  96.         private string MultiConvert(string data) 
  97.         { 
  98.             var list = Split(data).ToArray(); 
  99.   
  100.             var results = new List<string>(); 
  101.             foreach (var item in list) 
  102.                 results.Add(SingleConvert(item)); 
  103.   
  104.             var sbResult = new StringBuilder(); 
  105.             var len = results.Count; 
  106.             var index = len - 1; 
  107.   
  108.             for (int i = 0; i < len; i++) 
  109.             { 
  110.                 var item = results[i]; 
  111.                 if ((i + 2 < len) && item == zeroNumeric.ToString() && results[i + 1].StartsWith(zeroNumeric.ToString())) 
  112.                     continue
  113.   
  114.                 if (!(i == (len - 1) && item == zeroNumeric.ToString())) 
  115.                     sbResult.Append(item); 
  116.   
  117.                 var unit = rangeNumeric[index - i]; 
  118.                 if (unit != string.Empty && item != zeroNumeric.ToString()) 
  119.                     sbResult.Append(unit); 
  120.             } 
  121.   
  122.             if (sbResult[sbResult.Length - 1] == zeroNumeric) 
  123.                 sbResult.Remove(sbResult.Length - 1, 1); 
  124.             sbResult.Append("元"); 
  125.   
  126.             return sbResult.ToString(); 
  127.         } 
  128.   
  129.         private string SingleConvert(string data) 
  130.         { 
  131.             var len = data.Length; 
  132.             var result = new List<char>(); 
  133.             var previousChar = char.MinValue; 
  134.             var unitIndex = len == 4 ? 0 : (4 - len); 
  135.   
  136.             for (int i = 0; i < len; i++) 
  137.             { 
  138.                 var item = CharToInt(data[i]); 
  139.                 var currentChineseChar = charNumeric[item]; 
  140.                 if (currentChineseChar == previousChar && previousChar == zeroNumeric && currentChineseChar == zeroNumeric) 
  141.                     continue
  142.                 else 
  143.                 { 
  144.                     result.Add(previousChar = currentChineseChar); 
  145.   
  146.                     var currentUnit = unitNumeric[unitIndex + i]; 
  147.                     if (currentChineseChar != zeroNumeric && currentUnit != char.MinValue) 
  148.                         result.Add(currentUnit); 
  149.                 } 
  150.             } 
  151.   
  152.             if (result.Count != 1 && result.Last() == zeroNumeric) 
  153.                 result.RemoveAt(result.Count - 1); 
  154.   
  155.             return new string(result.ToArray()); 
  156.         } 
  157.   
  158.         private string DecimalConvert(string data) 
  159.         { 
  160.             StringBuilder sbResult = new StringBuilder(); 
  161.             if (data[0] != '0'
  162.             { 
  163.                 sbResult.Append(charNumeric[CharToInt(data[0])]); 
  164.                 sbResult.Append("角"); 
  165.             } 
  166.             if (data[1] != '0'
  167.             { 
  168.                 sbResult.Append(charNumeric[CharToInt(data[1])]); 
  169.                 sbResult.Append("分"); 
  170.             } 
  171.             return sbResult.ToString(); 
  172.         } 
  173.   
  174.         private IEnumerable<string> Split(string data) 
  175.         { 
  176.             var len = data.Length / 4; 
  177.             var mod = data.Length % 4; 
  178.             if (mod != 0) 
  179.                 len += 1; 
  180.   
  181.             var startIndex = 0; 
  182.             var blockLength = mod != 0 ? mod : 4; 
  183.   
  184.             for (int i = 0; i < len; i++) 
  185.             { 
  186.                 yield return data.Substring(startIndex, blockLength); 
  187.                 startIndex += blockLength; 
  188.                 blockLength = 4; 
  189.             } 
  190.         } 
  191.   
  192.         private int CharToInt(char obj) 
  193.         { 
  194.             return ((int)obj) - 48; 
  195.         } 
  196.         #endregion 
  197.     } 
  198.   
 
如果你喜歡本文,請點一下推薦,謝謝!
責任編輯:彭凡 來源: 博客園
相關推薦

2021-07-17 23:02:15

數字人民幣支付寶微信

2021-07-31 10:38:53

數字人民幣數字貨幣區塊鏈

2021-08-09 15:08:15

數字人民幣比特幣貨幣

2022-02-07 14:18:06

數字人民幣冬奧會安全

2022-02-15 21:52:25

數字人民幣數字貨幣區塊鏈

2021-10-14 09:06:37

數字人民幣數字貨幣區塊鏈

2021-07-20 22:23:12

數字人民幣支付寶微信

2021-07-07 09:31:41

數字人民幣數字貨幣區塊鏈

2021-05-14 14:44:42

支付寶數字人民幣移動應用

2021-11-16 14:36:36

數字人民幣數字貨幣區塊鏈

2021-02-07 11:19:03

數字貨幣人民幣金融

2021-01-18 11:05:40

數字貨幣人民幣現金

2021-01-18 23:05:35

數字貨幣人民幣現金

2021-03-23 17:28:19

數字人民幣安全銀行

2021-03-19 11:13:37

區塊鏈數字貨幣人民幣

2021-07-02 16:50:02

數字人民幣微信支付寶

2021-11-26 17:21:44

數字人民幣數字貨幣貨幣

2020-12-09 09:19:15

數字人民幣貨幣

2020-12-01 16:06:40

數字貨幣人民幣網絡

2020-11-23 16:14:30

數字貨幣人民幣
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品一区二 | 亚洲最色网站 | 久久久久91| 久久精品亚洲精品国产欧美 | 国产精品久久二区 | 亚洲男人天堂 | 午夜av毛片| 国产精品美女久久久久久免费 | 国产精品美女久久久久久免费 | 国产一级电影在线观看 | 夜夜爽99久久国产综合精品女不卡 | 97在线超碰 | 欧美黑人国产人伦爽爽爽 | 日本人做爰大片免费观看一老师 | 日韩国产精品一区二区三区 | 男女精品久久 | 久久激情五月丁香伊人 | 国产精品视屏 | 欧美日韩精品影院 | 久久亚洲精品久久国产一区二区 | 四虎成人av| 国产精品视频一二三区 | 色视频网站免费 | 雨宫琴音一区二区在线 | 精品久久久久久亚洲综合网 | 超碰导航 | 欧美精品久久久久久 | 久久精品国产亚洲一区二区三区 | 美女久久 | 97精品视频在线 | 在线观看免费av网 | 一级特黄a大片 | 国产精品久久久久久久久久久久 | 九色国产| 玖玖在线精品 | 精品不卡| 羞羞视频免费在线观看 | 午夜影院在线观看 | 91国内产香蕉 | 欧美一级三级 | 国产精品99久久久久久宅男 |