如何排序列表视图列有$符号类似的金额

本文关键字:符号 金额 视图 何排序 排序 列表 | 更新日期: 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;
        }
    }