dataTables でカンマで桁区切りをした数値をソート可能にする

<script type="text/javascript">
<!--
/* formatted-num は aoColums で独自に追加するデータタイプの名称。
 * 名称は変更しても、データタイプの名称を変更後の名称に修正すれば、問題ない。
 * -desc はこのデータタイプを降順でソートする場合の処理内容が記述されている。
 * -asc は昇順でソートする際の処理内容。
*/
jQuery.fn.dataTableExt.oSort['formatted-num-asc'] = function(x,y) {
    /* 正規表現で数値と小数点以外は削除する */
    x = x.replace(/[^\d\-\.\/]/g, '');
    y = y.replace(/[^\d\-\.\/]/g, '');
    /* 文字列が分数の場合は除算してソートできるようにする */
    if(x.indexOf('/') >= 0) x = eval(x);
    if(y.indexOf('/') >= 0) y = eval(y);
    return x/1 - y/1;
}
jQuery.fn.dataTableExt.oSort['formatted-num-desc'] = function(x,y) {
    /* 正規表現で数値と小数点以外は削除する */
    x = x.replace(/[^\d\-\.\/]/g, '');
    y = y.replace(/[^\d\-\.\/]/g, '');
    /* 文字列が分数の場合は除算してソートできるようにする */
    if(x.indexOf('/') >= 0) x = eval(x);
    if(y.indexOf('/') >= 0) y = eval(y);
    return y/1 - x/1;
}

$(document).ready(function() {
    $('table#example').dataTable({
        aoColumns: [
            {sTitle: 'ID',   sType: 'numeric'},
            /* 新たなデータタイプ formatted-num を設定し、
             * 桁区切りに「,」が存在してもソート可能にする
            */
            {sTitle: '売上', sType: 'formatted-num'}
        ],
        aaData: [
            /* formatted-num のデータタイプを指定した値は、
             * 「'」か「"」で囲み、文字列として記述する必要がある。
             * 理由は Int 型 や float 型だと正規表現を利用できないため。
            */
            [12, '12,359'],
            [25, '126,359'],
            [7, '6,126,359']
        ]
    });
});
-->
</script>

注意点

  1. 正規表現で「,」を除去するため、JavaScript 内は値を文字列にする必要がある。
    例えば、<?php printf("[%d, '%s'],", 12, number_format(6548625.02)); ?> と出力時に、「'」か「"」で囲んで、JavaScript に文字列として認識ささせる。
    「,」が含まれた数値なのだから、当然か…。
  2. 値を数値型として出力すると、エラーが発生する。(当然といえば、当然)

参考

  • DataTables - Plug-ins - Formatted numbers
    Removes any non-numeric (or a dot) characters, such that you can format numbers (for example 1,000,000) for easy reading. This plug-in allows those formatted numbers to be sorted numerically.
    注: リンク先のサンプルコードは昇順と降順のメソッドが逆になっていると思われる。