Формулировка проблемы: на данный момент сортировка в таблице реестра по значениям столбцов типа дата и число осуществляется лексикографически[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)