views:

195

answers:

2

I'm using .net. Is there some code somewhere that can change

$11,456.50 -> eleven thousand four hundred fifty six and 50/100 Dollars

I can do it myself, but don't want to rewrite something that's already there.

A: 

Not, in the .Net framework itself.

You'll need to do it yourself or find an existing implementation online (Google it).

SLaks
what wording to i google? can't come up with anything
Jose
@Jose: try searching `.NET money formatting` or maybe `.NET currency formatting` or `.NET convert numbers to words` (but then you'd have to apply your own changes for "dollars" and "cents").
FrustratedWithFormsDesigner
SLaks
+3  A: 

Here is an unpolished first shot. No error checking at all and the code does not handle the fractional part. And it is almost untested. With BigInteger the method can handle values up to 10^66 - 1 or about 219 bits easily extended by adding more entries to M2.

public static String NumberToText(Decimal n)
{
    if (n < 0)
    {
        return "minus " + NumberToText(-n);
    }
    else if (n == 0)
    {
        return M1[n];
    }
    else
    {
        var scale = 0;
        var parts = new List<String>();

        while (n != 0)
        {
            if (n % 1000 != 0)
            {
                parts.Add(String.Format("{0} {1}", NumberToTextSmaller1000(n % 1000), M2[scale]));
            }

            n = Math.Floor(n / 1000);
            scale++;
        }

        parts.Reverse();

        return String.Join(", ", parts.ToArray());
    }
}

private static String NumberToTextSmaller1000(Decimal n)
{
    var pattern = (n < 100) ? "{2}" : (n % 100 == 0) ? "{0} {1}" : "{0} {1} {2}";

    return String.Format(pattern, M1[Math.Floor(n / 100)], M1[100], NumberToTextSmaller100(n % 100));
}

private static String NumberToTextSmaller100(Decimal n)
{
    return (0 <= n) && (n < 20)) || (n % 10 == 0) 
        ? M1[n] 
        : String.Format("{0}-{1}", M1[n - n % 10], M1[n % 10];
}

private static readonly IDictionary<Decimal, String> M1 = new Dictionary<Decimal, String>
    {
        { 0, "zero" }, { 1, "one" }, { 2, "two" }, { 3, "three" },
        { 4, "four" }, { 5, "five" }, { 6, "six" }, { 7, "seven" },
        { 8, "eight" }, { 9, "nine" }, { 10, "ten" }, { 11, "eleven" },
        { 12, "twelve" }, { 13, "thirteen" }, { 14, "fourteen" },
        { 15, "fifteen" }, { 16, "sixteen" }, { 17, "seventeen" },
        { 18, "eighteen" }, { 19, "nineteen" }, { 20, "twenty" },
        { 30, "thirty" }, { 40, "forty" }, { 50, "fifty" }, { 60, "sixty" },
        { 70, "seventy" }, { 80, "eighty" }, { 90, "ninety" }, { 100, "hundred" }
    };

// The leading spaces are important.
private static readonly IDictionary<Decimal, String> M2 = new Dictionary<Decimal, String>
    {
        { 0, String.Empty }, { 1, " thousand" }, { 2, " million" }, { 3, " billion" },
        { 4, " trillion" }, { 5, " quadrillion" }, { 6, " quintillion" },
        { 7, " sextillion" }, { 8, " septillion" }, { 9, " octillion" },
        { 10, " nonillion" }, { 11, " decillion" }, { 12, " undecillion" },
        { 13, " duodecillion" }, { 14, " tredecillion" }, { 15, " quattuordecillion" },
        { 16, " quindecillion" }, { 17, " sexdecillion" }, { 18, " septendecillion" },
        { 19, " octodecillion" }, { 20, " novemdecillion" }, { 21, " vigintillion" }
    };

Called on Decimal.MaxValue the method returns the following.

seventy-nine octillion, two hundred twenty-eight septillion, one hundred sixty-two sextillion, five hundred fourteen quintillion, two hundred sixty-four quadrillion, three hundred thirty-seven trillion, five hundred ninety-three billion, five hundred forty-three million, nine hundred fifty thousand, three hundred thirty-five

Daniel Brückner