2

How to add default support for numeric-comma sorting in jQuery Datatables?

...without the need to specify columns using sType.

2 Answers 2

2

Step 1:

extend dataTableExt.oSort with the following code:

$.extend($.fn.dataTableExt.oSort, {
  "numeric-pre": function(a) {
    a = (a === "-" || a === "") ? 0 : a.replace(/[^\d\-\.]/g, "");
    return parseFloat(a);
  },
  "numeric-asc": function(a, b) {
    return a - b;
  },
  "numeric-desc": function(a, b) {
    return b - a;
  }
});

Step 2: extend dataTableExt.aTypes, add comma to sValidChars variable:

 # Added comma to sValidChars
 $.extend $.fn.dataTableExt.aTypes, [
        /*
         * Function: -
         * Purpose:  Check to see if a string is numeric
         * Returns:  string:'numeric' or null
         * Inputs:   mixed:sText - string to check
         */
        function (sData) {
            /* Allow zero length strings as a number */
            if (typeof sData === 'number') {
                return 'numeric';
            }
            else if (typeof sData !== 'string') {
                return null;
            }

            var sValidFirstChars = "0123456789-";
            var sValidChars = "0123456789.,";
            var Char;
            var bDecimal = false;

            /* Check for a valid first char (no period and allow negatives) */
            Char = sData.charAt(0);
            if (sValidFirstChars.indexOf(Char) == -1) {
                return null;
            }

            /* Check all the other characters are valid */
            for (var i = 1; i < sData.length; i++) {
                Char = sData.charAt(i);
                if (sValidChars.indexOf(Char) == -1) {
                    return null;
                }

                /* Only allowed one decimal place... */
                if (Char == ".") {
                    if (bDecimal) {
                        return null;
                    }
                    bDecimal = true;
                }
            }

            return 'numeric';
        },

        /*
         * Function: -
         * Purpose:  Check to see if a string is actually a formatted date
         * Returns:  string:'date' or null
         * Inputs:   string:sText - string to check
         */
        function (sData) {
            var iParse = Date.parse(sData);
            if ((iParse !== null && !isNaN(iParse)) || (typeof sData === 'string' && sData.length === 0)) {
                return 'date';
            }
            return null;
        },

        /*
         * Function: -
         * Purpose:  Check to see if a string should be treated as an HTML string
         * Returns:  string:'html' or null
         * Inputs:   string:sText - string to check
         */
        function (sData) {
            if (typeof sData === 'string' && sData.indexOf('<') != -1 && sData.indexOf('>') != -1) {
                return 'html';
            }
            return null;
        }
    ]);
Sign up to request clarification or add additional context in comments.

2 Comments

Awesome!!! The perfect answer!! Was breaking my head on this for quite some time. Thanks!!
you should find these functions in jquery.dataTables.js
0

The latest dataTables version (1.10.4) handles formatted numeric sorting without any extension, that is, puts $1,000.00 before $900.00 when sorting in descending order and puts $900.00 before $1,000.00 when sorting in ascending order.

See num-fmt in http://datatables.net/reference/option/columns.type.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.