将十进制格式化为货币

时间:2014-08-19 18:17:51

标签: c# formatting currency

我有一个小数列表,我希望能够格式化为美国货币。我知道我可以用string.format做到这一点,但是如果我将小数转换成字符串就不能长时间排序

1234.98
91234.12
541234.12

使用string.format转换为货币时,它们将按此顺序排序

$91,234.12
$541,234.12
$1,234.98

我希望它们保持小数位,以便正确排序为

$541,234.12
$91,234.12
$1,234.98

3 个答案:

答案 0 :(得分:4)

将它们保存为您用于排序的列表或容器中的小数,并在显示时简单地使用字符串格式。我不明白,当你可以随意显示它时,需要将它们同时作为字符串和小数。

答案 1 :(得分:2)

我在这里看到两个主要选项。首先是对你的数字进行零填充($001,234.98),这似乎会直接反对大多数用户的首选体验。

另一种选择可能是为货币创建一种类型:

public class Currency : IComparable
{
    public decimal Value { get; set; }

    public int CompareTo(Currency b)
    {
        return Value.CompareTo(b.Value);
    }

    public override string ToString()
    {
        return Value.ToString("C");
    }
}

当然,您想要覆盖EqualsGetHashCode。这将显示按预期排序(控件属性允许),但它也会按预期显示。当然,您可能希望将类变为不可变struct。但这只是为了表明要点。

这样的类也可以提供非常好的LINQ支持,因为你可以拥有IEnumerable<T>并只需调用OrderBy(c => c)。您甚至可以通过调用string.Join(Environment.NewLine, coll.OrderBy(c => c))来打印行上的值,这非常干净。

当然,像这样的类应该只用于UI代码。你不想处理序列化或类似的事情,因为它会带来不必要的开销。

答案 2 :(得分:-1)

创建一个包含小数及其相应格式化字符串的类。 使用Linq按小数对类对象进行排序。