我有一个小数列表,我希望能够格式化为美国货币。我知道我可以用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
答案 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");
}
}
当然,您想要覆盖Equals
和GetHashCode
。这将显示按预期排序(控件属性允许),但它也会按预期显示。当然,您可能希望将类变为不可变struct
。但这只是为了表明要点。
这样的类也可以提供非常好的LINQ支持,因为你可以拥有IEnumerable<T>
并只需调用OrderBy(c => c)
。您甚至可以通过调用string.Join(Environment.NewLine, coll.OrderBy(c => c))
来打印行上的值,这非常干净。
当然,像这样的类应该只用于UI代码。你不想处理序列化或类似的事情,因为它会带来不必要的开销。
答案 2 :(得分:-1)
创建一个包含小数及其相应格式化字符串的类。 使用Linq按小数对类对象进行排序。