Формулировка проблемы: на данный момент сортировка в таблице реестра по значениям столбцов типа дата и число осуществляется лексикографически[21]. Это приводит к тому, что, например, число 10 следует за числом 1, а не за числом 9. Необходима более точная сортировка для дат и чисел, чтобы число 10 следовало за числом 9, а не числом 1.
Связанные задачи: 50.7998 и 50.8074
Решение: алгоритм сортировки таблицы реестра необходимо изменить следующим образом.
Для начала определим, на чем будет основана сортировка в реестрах. Любой компонент формы реестра, попадающий в «Поля формы реестра» и, соответственно, в столбцы таблицы, имеет значение и текстовое представление этого значения.
Для столбца таблицы реестра, содержащего компонент формы
Дата/время
, сортировка по убыванию/по возрастанию
должна осуществляться не по текстовому представлению, а
непосредственно по значениям даты
(timestamp
[22]).
Пример сортировки по возрастанию:
1 апреля 2014 2 апреля 2014 13 апреля 2014 1 мая 2014 3 мая 2014 11 мая 2014
Для столбца таблицы реестра, содержащего компонент формы,
отличный от
Дата/время
, сортировка по возрастанию
должна осуществляться по нижеописанному алгоритму. Для краткости
значение текстового представления столбца, по которому
производится сортировка будем называть полем
сортировки.
Первый критерий сортировки (приоритет числам):
сначала идут все пустые записи (не содержащие пробелы, а именно пустые);
потом идут записи, поле сортировки у которых начинается с цифр[23], причем все начальные нули не учитываются;
набор цифр, идущих подряд до первого вхождения "не цифры" либо до конца записи, интерпретируется как число, сортировка осуществляется по значению этих чисел;
записи, после чисел у которых идут "не цифры", сортируются лексикографически (поразрядно);
Второй критерий сортировки:
далее идут остальные записи[24], сортировка лексикографическая (поразрядная);
Сортировка по убыванию, соответственно, осуществляется наоборот.
Пример сортировки по возрастанию для указанного алгоритма:
#пустая запись 1 1а 1б 1.1 2 03 10 100 #запись, содержащая пробел $ & A B C Z a b c m100a m1a m2 n1a z А Б В Я а б в я
[23] Диапазон в таблице символов Unicode: 0030 - 0039 (в таблице символов ASCII: 48 - 57)
[24] Все символы из таблицы символов Unicode, начиная с 0000, исключая 0030 - 0039 (http://unicode-table.com/ru/#tagbanwa)