如何排序列表视图列有$符号类似的金额
本文关键字:符号 金额 视图 何排序 排序 列表 | 更新日期: 2023-09-27 18:02:20
我在排序时遇到了一些问题。我从msd文档中获得以下代码,它适用于所有字段,但不适用于以$开头的金额字段,例如
amount
$1900
$4444
$39
$0
这段代码没有对该列进行排序,那么我应该做些什么更改,以便它也对开始时带有$符号的金额进行排序。
这是代码:
class ListViewItemComparer : IComparer {
private int col;
private SortOrder order;
public ListViewItemComparer() {
col=0;
order = SortOrder.Ascending;
}
public ListViewItemComparer(int column, SortOrder order)
{
col=column;
this.order = order;
}
public int Compare(object x, object y)
{
int returnVal= -1;
returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text,
((ListViewItem)y).SubItems[col].Text);
// Determine whether the sort order is descending.
if(order == SortOrder.Descending)
// Invert the value returned by String.Compare.
returnVal *= -1
return returnVal;
}
}
我调用listview列click事件中的代码为
private void lvwUsers_ColumnClick(Object eventSender, ColumnClickEventArgs eventArgs)
{
if (lvwUsers.Sorting == SortOrder.Ascending)
lvwUsers.Sorting = SortOrder.Descending;
else
lvwUsers.Sorting = SortOrder.Ascending;
lvwUsers.Sort();
this.lvwUsers.ListViewItemSorter = new ListViewItemComparer(eventArgs.Column,
lvwUsers.Sorting);
}
可以正常工作,但不能用于带有$符号的金额
那么如何排序listview有金额列与$符号?
发人深省这个方法对于美元符号是硬编码的,但是,可以有一个正则表达式来检测非数字字符,存储它们,然后您将它们注入到末尾的字符串中。
private List<string> sortthelist(List<string> incomingList)
{
List<int> convertedlist = new List<int>();
for (int i = 0; i < incomingList.Count; i++)
{
convertedlist.Add(int.Parse(incomingList[i].Replace("$", "")));//convert your strings into integers
}
convertedlist.Sort();//sort your integers
incomingList.Clear();//clear the existing list
foreach (int item in convertedlist)//fill it back up
{
incomingList.Add("$" + item.ToString());//add the dollar sign back into the string
}
return incomingList;//return the sorted list
}
你已经有一个比较器了。为什么不把它修改成你想要的排序方式呢?使用十进制。解析将字符串转换为十进制值,然后比较它们。无需修改列表数据。它还能自我适应不同的文化。
如果数据可以包含货币值以外的东西,您可能希望使这段代码更有弹性,以处理您获得的任何类型的值。
class ListViewItemComparer : IComparer
{
private int col;
private SortOrder order;
public ListViewItemComparer()
{
col = 0;
order = SortOrder.Ascending;
}
public ListViewItemComparer(int column, SortOrder order)
{
col = column;
this.order = order;
}
public int Compare(object x, object y)
{
int returnVal = -1;
decimal value1;
Decimal.TryParse(((ListViewItem)x).SubItems[col].Text,
System.Globalization.NumberStyles.Currency,
System.Globalization.CultureInfo.CurrentUICulture,
out value1);
decimal value2;
Decimal.TryParse(((ListViewItem)y).SubItems[col].Text,
System.Globalization.NumberStyles.Currency,
System.Globalization.CultureInfo.CurrentUICulture,
out value2);
returnVal = Decimal.Compare(value1, value2);
// Determine whether the sort order is descending.
if (order == SortOrder.Descending)
// Invert the value returned by String.Compare.
returnVal *= -1;
return returnVal;
}
}