convert money/decimal to string
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 c开发者_JAVA百科an do it myself, but don't want to rewrite something that's already there.
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
Not, in the .Net framework itself.
You'll need to do it yourself or find an existing implementation online (Google it).
精彩评论