|
![]() |
Overclock.net - Overclocking.net > Software, Programming and Coding > Coding and Programming | |
Programming Challenge
|
||
![]() |
|
|
LinkBack | Thread Tools |
|
|
#101 (permalink) |
|
Case Modder
![]() |
Here's my C# implementation of the "convert dollar amount" challenge:
Code:
using System;
namespace WrittenAmount
{
public class ConvertDollar
{
public string ToWrittenAmount(string dollarAndCentsAmount)
{
// Strip off the leading '$'.
string cleanDollarAndCentsAmount = ExtractDollarAmount(dollarAndCentsAmount);
// Separate the dollars and cents.
string[] dollarAndCents = ExtractCentsAmount(cleanDollarAndCentsAmount);
if (dollarAndCents.Length == 0)
{
return string.Empty;
}
// Just dollars?
if (dollarAndCents.Length == 1)
{
return DollarsAndCentsToText(dollarAndCents[0], "0");
}
// Dollars and (possibly nul) cents.
return DollarsAndCentsToText(dollarAndCents[0],
String.IsNullOrEmpty(dollarAndCents[1]) ? "0" : dollarAndCents[1]);
}
private string DollarsAndCentsToText(string dollars, string cents)
{
// ConvertDollarResources.DollarsAndCentsFormat fetches the format
// string from the .resx file.
return String.Format(ConvertDollarResources.DollarsAndCentsFormat, NumberToText(dollars), NumberToText(cents));
}
//
// This is the "meat" of the conversion process.
//
private string NumberToText(string number)
{
string text = "";
char[] digits = number.ToCharArray();
for (int i = 0; i < digits.Length; ++i)
{
string thisNumber;
// Ugh. Special case the teens (10 through 19). :(
if (IsTensPlace(i, digits.Length) && IsTeenNumber(digits[i].ToString() + digits[i + 1].ToString()))
{
thisNumber = TeenNumberToText(digits[i].ToString() + digits[i + 1].ToString());
i += 2;
}
else
{
thisNumber = NumberToText(digits[i].ToString(), digits.Length - i);
}
if (thisNumber.Length > 0)
text = String.Concat(text, thisNumber, " ");
}
return text;
}
private bool IsTensPlace(int currentDigit, int totalDigits)
{
// 1112.00
// ^
// +-- Are we here?
if ((totalDigits - currentDigit) == 2)
return true;
return false;
}
private bool IsTeenNumber(string possibleTeen)
{
if (Convert.ToInt16(possibleTeen) >= 10 && Convert.ToInt16(possibleTeen) <= 19)
return true;
return false;
}
private string TeenNumberToText(string teen)
{
string resourceKey = "N" + teen;
return GetResourceString(resourceKey);
}
private string NumberToText(string digit, int place)
{
// i.e. "N9_4" is equivalent to "nine thousand"
string resourceKey = "N" + digit + "_" + place.ToString();
return GetResourceString(resourceKey);
}
private string ExtractDollarAmount(string dollarAmount)
{
int indexOfDollarSign = dollarAmount.IndexOf('$');
if (indexOfDollarSign < 0)
{
return dollarAmount;
}
return dollarAmount.Remove(indexOfDollarSign, 1);
}
private string[] ExtractCentsAmount(string amount)
{
return amount.Split(new Char[] { '.' });
}
private string GetResourceString(string key)
{
return ConvertDollarResources.ResourceManager.GetString(key);
}
}
}
Code:
using System;
using NUnit.Framework;
using WrittenAmount;
namespace WrittenAmount.UnitTest
{
[TestFixture]
public class ConvertDollarTests
{
[Test]
public void ToText_0()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$0.0");
StringAssert.AreEqualIgnoringCase("zero dollars and zero cents", text);
}
[Test]
public void ToText_0_16()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$0.16");
StringAssert.AreEqualIgnoringCase("zero dollars and sixteen cents", text);
}
[Test]
public void ToText_16_0()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$16.0");
StringAssert.AreEqualIgnoringCase("sixteen dollars and zero cents", text);
text = converter.ToWrittenAmount("$16.00");
StringAssert.AreEqualIgnoringCase("sixteen dollars and zero cents", text);
}
[Test]
public void ToText_1_03()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$1.03");
StringAssert.AreEqualIgnoringCase("one dollars and three cents", text);
}
[Test]
public void ToText_1_23()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$1.23");
StringAssert.AreEqualIgnoringCase("one dollars and twenty three cents", text);
}
[Test]
public void ToText_10_23()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$10.23");
StringAssert.AreEqualIgnoringCase("ten dollars and twenty three cents", text);
}
[Test]
public void ToText_12_34()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$12.34");
StringAssert.AreEqualIgnoringCase("twelve dollars and thirty four cents", text);
}
[Test]
public void ToText_112_34()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$112.34");
StringAssert.AreEqualIgnoringCase("one hundred twelve dollars and thirty four cents", text);
}
[Test]
public void ToText_123_45()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$123.45");
StringAssert.AreEqualIgnoringCase("one hundred twenty three dollars and fourty five cents", text);
}
[Test]
public void ToText_1234_56()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$1234.56");
StringAssert.AreEqualIgnoringCase("one thousand two hundred thirty four dollars and fifty six cents", text);
}
[Test]
public void ToText_9999()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$9999");
StringAssert.AreEqualIgnoringCase("nine thousand nine hundred ninety nine dollars and zero cents", text);
}
[Test]
public void ToText_9999_()
{
WrittenAmount.ConvertDollar converter = new WrittenAmount.ConvertDollar();
string text = converter.ToWrittenAmount("$9999.");
StringAssert.AreEqualIgnoringCase("nine thousand nine hundred ninety nine dollars and zero cents", text);
}
}
}
__________________
Rich Custom Wooden Case Builder
|
|
|
|
|
|
#102 (permalink) | ||||||||||||||
|
Original OCN Gangsta
![]() |
Is anyone up for some NTLM hash work?
__________________
My CNC Mill Project Quote:
--Randy Pausch Current Best Benchmark
|
||||||||||||||
|
|
![]() |
| Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
| Thread Tools | |
|
|