Javascript 比较两个千位分隔符的函数不起作用

Javascript function to compare two thousands separator number not working

我正在尝试在 javascript 中编写一个比较器函数,它比较两个数字,如 '100,000''200,000' 等,以及 returns 它们的差异。我想在 ag-grid 的内置自定义排序中使用它,按此处为日期列提供的“comparator”功能进行排序:https://www.ag-grid.com/javascript-grid-sorting/

我的代码是这样的:

function thousandsComparator(Num1, Num2) {
    var Number1 = thousandsToComparableNumber(Num1);
    var Number2 = thousandsToComparableNumber(Num2);

    if (Number1===null && Number2===null) {
        return 0;
    }
    if (Number1===null) {
        return -1;
    }
    if (Number2===null) {
        return 1;
    }

    return Number1 - Number2;
}

function thousandsToComparableNumber(num) {
    var total = parseFloat(num.replace(/,/g, ''));
    return total;

}

但是,它不起作用。它不是对列进行排序! --> {headerName: "ORDER Qty", field: "ORDER_QTY", width: 150, comparator: thousandsComparator, unSortIcon: true, cellStyle:{"text-align":"right"}},

列数据是这样的"100,000", "200,000"等等

您的代码有错别字,建议您在thousandsToComparableNumber

中支持nulls
function thousandsComparator(Num1, Num2) {
    var Number1 = thousandsToComparableNumber(Num1);
    var Number2 = thousandsToComparableNumber(Num2);

    if (Number1===null && Number2===null) {
        return 0;
    }
    if (Number1===null) {
        return -1;
    }
    if (Number2===null) {
        return 1;
    }

    return Number1 - Number2; // there was a typo --> return Number1 - 2Number2;
}

function thousandsToComparableNumber(num) {

    if (num === null){
        return null;
    }

    var total = parseFloat(num.replace(/,/g, ''));
    return total;

}

也许,您应该尝试替换:

return 数字 1 - 2 数字 2;

与:

return 数字 1 - 数字 2;

您需要在调用 thousandsToComparable 之前检查 null,因为 null 没有 .replace() 方法,所以当您尝试时会出错转换 null.

function thousandsComparator(Num1, Num2) {

    if (Num1===Num2) {
        return 0;
    }
    if (Num1===null) {
        return -1;
    }
    if (Num2===null) {
        return 1;
    }

    var Number1 = thousandsToComparableNumber(Num1);
    var Number2 = thousandsToComparableNumber(Num2);
    return Number1 - Number2;
}

看看你的 plunker 你是 dateComparator 就目前而言,它没有考虑逗号。您将 date1, date2) 作为 dateComparator 的参数,但在其中使用 date1Number/date2Number

您需要将 dateComparator 更改为:

function dateComparator(date1Number, date2Number) {

    if (date1Number === null && date2Number === null) {
        return 0;
    }
    if (date1Number === null) {
        return -1;
    }
    if (date2Number === null) {
        return 1;
    }

    return thousandsToComparableNumber(date1Number) - thousandsToComparableNumber(date2Number);
}

这将解决您的问题,但更好的解决方案是将数据保留在其原始状态并使用 cellRenderer 以逗号作为分隔符。

换句话说,完全删除 dateComparator,并为您的 colDef 添加以下内容:

{
    headerName: "ORDER Qty", 
    field: "ORDER_QTY", 
    width: 150, 
    cellStyle: {
        "text-align": "right"
    },
    cellRenderer: function (params) {
        return Number(params.value).toLocaleString();
    }
}