将money / decimal转换为字符串

时间:2010-02-22 18:23:36

标签: .net formatting

我正在使用.net。是否有某些代码可以改变

$ 11,456.50 - >十一点四五十六和50/100美元

我可以自己做,但不想重写已存在的东西。

2 个答案:

答案 0 :(得分:4)

这是一个未经修饰的第一枪。根本没有错误检查,代码不处理小数部分。它几乎没有经过测试。使用BigInteger,该方法可以通过向10^66 - 1添加更多条目来处理最多219或大约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" }
    };

Decimal.MaxValue上调用该方法会返回以下内容。

七十九,八十八,一百六十二,五十四,五十四,五十三万亿,三百三十七万亿,五百九十三亿,五百四千三百万,九十五万,三百三十五。

答案 1 :(得分:0)

不是,在.Net框架本身。

您需要自己动手或在线查找现有的实施方案(Google)。