用C#寫一個CheckWriter的控制臺程序,如果你在銀行工作,需要一個系統能夠當你輸入一串數字金額后能用其對應的英文輸出,這樣方便打印在支票上防止篡改。用戶輸入一個0到20億的數字包含最多2位小數,將其轉換為英文輸出。例如輸入1258276.25,能夠輸出:one million, three hundred and fifty seven thousand, two hundred and fitty six DOLLARS AND thirty two CENTS.
~~~
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CheckWriter
{
class Program
{
private static string[] _lessTwentyNumbers = new string[]{"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight",
"Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen","Sixteen", "Seventeen", "Eighteen", "Nineteen"};
private static string[] _lessHundredNumbers = new string[]{"", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty","Ninety"};
private static string[] _scaleNumbers = new string[] { "", "Thousand", "Million", "Billion" };
static void Main(string[] args)
{
string s = ConvertDecimalToWords(1258276.25);
Console.WriteLine(s);
Console.Read();
}
/// <summary>
/// 將數字轉為英文描述
/// </summary>
/// <param name="number"></param>
/// <returns></returns>
private static string ConvertNumberToWords(int number)
{
if (number == 0)
{
return _lessTwentyNumbers[0];
}
int[] digitGroups = new int[4];
int positive = Math.Abs(number);
// 將數字按三位一段保存到數組里
for (int i = 0; i < 4; i++)
{
digitGroups[i] = positive % 1000;
positive /= 1000;
}
string[] groupText = new string[4];
for (int i = 0; i < 4; i++)
{
// 每三位一段轉為相應的英文字符
groupText[i] = ConvertThreeDigitToWords(digitGroups[i]);
}
string combined = groupText[0];
for (int i = 1; i < 4; i++)
{
if (digitGroups[i] != 0)
{
// 每一段加上相應的這一段的級別數字
string prefix = groupText[i] + " " + _scaleNumbers[i];
if (!string.IsNullOrEmpty(prefix))
{
if (string.IsNullOrEmpty(combined))
{
combined = prefix;
}
else
{
combined = prefix + ", " + combined;
}
}
}
}
if (number < 0)
{
combined = "Negative " + combined;
}
return combined;
}
?/// <summary>
/// 處理三位數以內的數字轉為英文描述
/// </summary>
/// <param name="threeDigits"></param>
/// <returns></returns>
private static string ConvertThreeDigitToWords(int threeDigits)
{
string groupText = "";
// 獲取百位
int hundreds = threeDigits / 100;
int tensUnits = threeDigits % 100;
if (hundreds != 0)
{
groupText += _lessTwentyNumbers[hundreds] + " Hundred";
if (tensUnits != 0)
{
groupText += " and ";
}
}
// 獲取十位
int tens = tensUnits / 10;
int units = tensUnits % 10;
if (tens >= 2)
{
groupText += _lessHundredNumbers[tens];
if (units != 0)
{
groupText += " " + _lessTwentyNumbers[units];
}
}
else if (tensUnits != 0)
{
groupText += _lessTwentyNumbers[tensUnits];
}
return groupText;
}
private static string ConvertDecimalToWords(double number)
{
int i = (int)number;
int p = (int)((number - i) * 100);
return ConvertNumberToWords(i) + " DOLLARS AND " + ConvertNumberToWords(p) + " CENTS";
}
}
}
~~~
上面的代碼中兩個核心函數是ConvertNumberToWords和ConvertThreeDigitToWords,ConvertThreeDigitToWords的作用主要是能將小于1000的整數轉為相應的金額,而ConvertNumberToWords負責將不同段的金額組合成完整的金額,主要是加上了該金額對應的位,例如本程序由于只要求對20億以內的數字進行處理,因此分為千,百萬和十億三檔。理解好了這兩個函數基本就能知道是怎么做的。