Overclock.net - Overclocking.net
     
 
Home Gallery Reviews Blogs Register Today's Posts Mark Forums Read Members List


Go Back   Overclock.net - Overclocking.net > Software, Programming and Coding > Coding and Programming

Reply
 
LinkBack Thread Tools
Old 03-19-09   #101 (permalink)
Case Modder
 
Spotswood's Avatar
 
Join Date: Jul 2008
Location: New Hampshire, USA
Posts: 235

Rep: 45 Spotswood is acknowledged by some
Unique Rep: 38
Trader Rating: 0
Default

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);
        }


    }
}
NUnit test fixture:
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
Overclock.net Mod of the Month
Spotswood is offline   Reply With Quote
Old 07-23-09   #102 (permalink)
Original OCN Gangsta
 
Burn's Avatar
 
intel nvidia

Join Date: Sep 2004
Location: Massachusetts
Posts: 13,685
Blog Entries: 2

FAQs Submitted: 14
Folding Team Rank: 134
Team Name: CPU Burners
Hardware Reviews: 5
Trader Rating: 7
Default

Is anyone up for some NTLM hash work?
__________________
My CNC Mill Project
Quote:
Originally Posted by CyberDruid
Burn + Electricty + Water =
But the man has the patience of a saint...
We cannot change the cards we are dealt, just how we play the hand.
--Randy Pausch
Current Best Benchmark

System: Burning Phoenix
CPU
Intel Q9550
Motherboard
Gigabyte EP45-UD3P
Memory
4GB G.Skill DDR2-1000 5-5-5-15
Graphics Card
eVGA GTX 260 Core 216 SuperClocked
Hard Drive
3 WD 80GB RAID0, Seagate 500GB, WD 1TB Caviar BLCK
Sound Card
Creative SB Audigy 2 ZS
Power Supply
Silverstone OP750
Case
Lian-Li PC-A10B
CPU cooling
D-Tek Fuzion V1
GPU cooling
D-Tek Fuzion GFX + D-Tek Unisink
OS
Windoze 7 Professional
Monitor
Dual Dell E207WFP 20.1" Widescreen LCD's
1 Million+ Folding at Home points
Burn is offline I fold for Overclock.net Overclocked Account Burn's Gallery   Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools



All times are GMT -5. The time now is 10:11 AM.


Overclock.net is a Carbon Neutral Site Creative Commons License

Terms of Service / Forum Rules | Privacy Policy | DMCA Info | Advertising | Become an Official Vendor
Copyright © 2009 Shogun Interactive Development. Most rights reserved.
Page generated in 0.10700 seconds with 9 queries