自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

利用結(jié)構(gòu)化的設(shè)計(jì)看待人民幣大寫(xiě)轉(zhuǎn)換

開(kāi)發(fā) 架構(gòu)
在網(wǎng)上看到不少人民幣大寫(xiě)轉(zhuǎn)換的類,或多或少的總有一些問(wèn)題,不放心用在企業(yè)開(kāi)發(fā)上。而且每個(gè)人的思路總是天馬行空,別說(shuō)面向?qū)ο蟮姆椒?,就是面向過(guò)程也說(shuō)不通,充斥著各種各樣的特殊情況。如果少考慮一種情況,那結(jié)果就很難預(yù)料,而且代碼的可讀性,我實(shí)在不敢恭維。

昨天,突然心血來(lái)潮,用結(jié)構(gòu)化的思想整理了一遍,在這里就拿出來(lái)分享一下。

首先,數(shù)字應(yīng)該分段,分成萬(wàn)以下的、萬(wàn)、億、兆這幾個(gè)段,并且每個(gè)段的長(zhǎng)度固定是4個(gè)數(shù)字。比如說(shuō) 123456 分為兩個(gè)段,前面一個(gè)未滿的段:12 ,后面是滿的段:3456 。

其次,每個(gè)滿段其實(shí)都是個(gè)十百千四個(gè)單位。比如:12345678 ,轉(zhuǎn)成數(shù)字大寫(xiě)是:壹仟貳佰叁拾肆  萬(wàn)  伍仟陸佰柒拾捌,發(fā)現(xiàn)什么規(guī)律了嗎?

***,就是處理一些必須有 0 的問(wèn)題了,比如說(shuō):303 ,不能說(shuō):叁佰叁,應(yīng)該是:叁佰零叁,這個(gè)“零”有很多講究的。

針對(duì)這些規(guī)律,我有針對(duì)性的整理出來(lái)兩個(gè)方法:SingleConvert 、MultiConvert 。其中 SingleConvert 處理段內(nèi)的邏輯,MultiConvert 處理段間的邏輯,在段內(nèi)的數(shù)字 0 問(wèn)題穿插到 SingleConvert 方法中,段間的數(shù)字 0 問(wèn)題穿插到 MultiConvert 方法中。另外,小數(shù)部分的處理,只有兩位數(shù)字,可以寫(xiě)死,這個(gè)最簡(jiǎn)單了。

說(shuō)一下數(shù)字 0 的邏輯。

數(shù)字【3003】轉(zhuǎn)換出來(lái)應(yīng)該是【叁仟零叁】,數(shù)字【303】轉(zhuǎn)換出來(lái)應(yīng)該是【叁佰零叁】,可以看到段內(nèi)連續(xù)出現(xiàn)一個(gè)或多個(gè)數(shù)字 0 的情況下,只會(huì)出現(xiàn)一個(gè)漢字【零】。

數(shù)字【3000000000300】轉(zhuǎn)換出來(lái)應(yīng)該是【叁兆零叁佰】,數(shù)字【300000300】轉(zhuǎn)換出來(lái)應(yīng)該是【叁億零叁佰】,可以看到段間連續(xù)出現(xiàn)一個(gè)或多個(gè)數(shù)字 0 的情況下,只會(huì)出現(xiàn)一個(gè)漢字【零】。

所以,段內(nèi)邏輯和段間邏輯,在連續(xù)出現(xiàn)多個(gè)【零】的時(shí)候,只保留一個(gè)【零】。

數(shù)字【300】轉(zhuǎn)換出來(lái)應(yīng)該是【叁佰】,數(shù)字【3000】轉(zhuǎn)換出來(lái)應(yīng)該是【叁仟】,可以看到在段內(nèi)***不管連續(xù)出現(xiàn)多少【零】,都抹掉不提。所以,段內(nèi)邏輯中,末尾的一個(gè)或多個(gè)【零】,均不保留。

還有兩個(gè)不值得提的規(guī)律:每個(gè)數(shù)字對(duì)應(yīng)一個(gè)單位,必定是【個(gè)十百千】;每段對(duì)應(yīng)一個(gè)單位,從低到高的對(duì)應(yīng)是【空、萬(wàn)、億、兆、……】。原諒我不知大更高的單位是什么了,這輩子沒(méi)見(jiàn)過(guò)那么多錢,神那~~

然后,然后就沒(méi)規(guī)律了,下面上代碼:

 
  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.     /// 數(shù)字轉(zhuǎn)大寫(xiě)漢字字符類 
  10.     /// </summary> 
  11.     [DebuggerStepThrough] 
  12.     public class NumericConvert 
  13.     { 
  14.         #region Private Fields 
  15.         /// <summary> 
  16.         /// 段的分隔字符,從低到高依次增加:空、萬(wàn)、億、萬(wàn)億,***不超過(guò)萬(wàn)億的數(shù)字都可以 
  17.         /// </summary> 
  18.         public static readonly string[] DefaultRangeNumeric = new string[] { string.Empty, "萬(wàn)""億""兆" }; 
  19.         /// <summary> 
  20.         /// 位的分隔字符,從低到高依次是:仟、佰、拾、空 
  21.         /// </summary> 
  22.         public static readonly char[] DefaultUnitNumeric = new char[] { '仟''佰''拾'char.MinValue }; 
  23.         /// <summary> 
  24.         /// 數(shù)字替換的字符,從低到高依次是:零、壹、貳、叁、肆、伍、陸、柒、捌、玖 
  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.         /// 重置數(shù)字替換的字符,必須從小到大是 10 個(gè)漢字字符。 
  37.         /// </summary> 
  38.         /// <param name="data">目標(biāo)字符數(shù)組</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 個(gè)漢字字符。 
  52.         /// </summary> 
  53.         /// <param name="data">目標(biāo)字符數(shù)組</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">目標(biāo)字符數(shù)組</param> 
  68.         public void ResetRangeNumeric(string[] data) 
  69.         { 
  70.             rangeNumeric = data ?? DefaultRangeNumeric; 
  71.         } 
  72.   
  73.         /// <summary> 
  74.         /// 執(zhí)行數(shù)字轉(zhuǎn)大寫(xiě)漢字字符的操作。 
  75.         /// </summary> 
  76.         /// <param name="obj">待轉(zhuǎn)換的數(shù)字</param> 
  77.         /// <returns>轉(zhuǎn)換完成的大寫(xiě)漢字字符串。</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.   
 
如果你喜歡本文,請(qǐng)點(diǎn)一下推薦,謝謝!
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2021-07-31 10:38:53

數(shù)字人民幣數(shù)字貨幣區(qū)塊鏈

2021-07-17 23:02:15

數(shù)字人民幣支付寶微信

2021-10-14 09:06:37

數(shù)字人民幣數(shù)字貨幣區(qū)塊鏈

2021-07-20 22:23:12

數(shù)字人民幣支付寶微信

2021-07-07 09:31:41

數(shù)字人民幣數(shù)字貨幣區(qū)塊鏈

2021-08-09 15:08:15

數(shù)字人民幣比特幣貨幣

2022-02-07 14:18:06

數(shù)字人民幣冬奧會(huì)安全

2022-02-15 21:52:25

數(shù)字人民幣數(shù)字貨幣區(qū)塊鏈

2021-01-18 23:05:35

數(shù)字貨幣人民幣現(xiàn)金

2021-01-18 11:05:40

數(shù)字貨幣人民幣現(xiàn)金

2021-05-14 14:44:42

支付寶數(shù)字人民幣移動(dòng)應(yīng)用

2021-11-16 14:36:36

數(shù)字人民幣數(shù)字貨幣區(qū)塊鏈

2021-02-07 11:19:03

數(shù)字貨幣人民幣金融

2021-03-23 17:28:19

數(shù)字人民幣安全銀行

2021-03-19 11:13:37

區(qū)塊鏈數(shù)字貨幣人民幣

2011-11-18 09:35:18

App Store

2022-02-17 15:46:08

數(shù)字人民幣區(qū)塊鏈

2021-05-12 07:10:55

支付寶數(shù)字人民幣移動(dòng)應(yīng)用

2021-07-02 16:50:02

數(shù)字人民幣微信支付寶

2020-12-09 09:19:15

數(shù)字人民幣貨幣
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)