Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Почему так сортируются строки?  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
Замыкая круг.
Разработчик в принципе подтвердил моё рассуждение в 18564206, только вот никаких псевдочисел нет: "In ANSI collation, any number (or string that is in canonic numeric form) is collated numerically, before all non-numeric strings."
Причём это не всегда было так, а начиная с какой-то версии (не сказали с какой, но видимо c довольно давней). Не важен ни результат $isvalidnum, ни возможный <MAXNUMBER> при "классической" проверке на число: n=+n.
Не стал бы и писать об этом, но механизм сортировки один из "ядерных", и его непонятное поведение меня встревожило. Теперь успокоили :)

Всем спасибо, кто поучаствовал.
17 дек 15, 19:52    [18574775]     Ответить | Цитировать Сообщить модератору
 Re: Почему так сортируются строки?  [new]
Timur Safin
Member

Откуда:
Сообщений: 54
Alexey Maslov
"In ANSI collation, any number (or string that is in canonic numeric form) is collated numerically, before all non-numeric strings."
Причём это не всегда было так, а начиная с какой-то версии (не сказали с какой, но видимо c довольно давней).

Это с SPJ932 присутствующем в продукте еще с 1993(!) года.
17 дек 15, 23:41    [18575701]     Ответить | Цитировать Сообщить модератору
 Re: Почему так сортируются строки?  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
Alexey Maslov,

Подробное объяснение
10 июн 16, 08:22    [19278797]     Ответить | Цитировать Сообщить модератору
 Re: Почему так сортируются строки?  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
servit,

спасибо, правда я и тогда всё понял :). Однако лучше бы для большей понятности автор поста употребил оператор ]], а не ], т.к. ] трактуется как "следует-за в порядке кодов символов без учёта специфики числовой сортировки". Для преодоления этого недостатка и был когда-то добавлен в язык Стандарта ISO/1995 оператор ]] - "следует-за в порядке действующей Collation". Мой старый пример, расширенный примером автора, наглядно показывает разницу:
num 
  
b("12345678901234567870")="Num20 @ S.Hobbs" b("12345678901234567874")="NotNum20 @ S.Hobbs"
  
a=1E30,b(+a)=1,b(+a_"11")=11,b(+a_"111")=111,b(+a_"1a")="3a",a=3E30,b(+a)=3,b(+a_"33")=33,b(+a_"333")=333,b(+a_"1a")="4a"
  
i="",i0="" f  s i=$o(b(i)) q:i=""  "(i]]i0)=",i]]i0," (i]i0)=",i]i0," (i>i0)=",i>i0,?30," " zw b(ii0=i
  
q
+
LEARN>num^ztest
(i]]i0)=1 (i]i0)=1 (i>i0)=1 b(12345678901234567870)="Num20 @ S.Hobbs"
(i]]i0)=1 (i]i0)=1 (i>i0)=0 b("12345678901234567874")="NotNum20 @ S.Hobbs"
(i]]i0)=1 (i]i0)=0 (i>i0)=1 b(1000000000000000000000000000000)=1
(i]]i0)=1 (i]i0)=1 (i>i0)=1 b(3000000000000000000000000000000)=3
(i]]i0)=1 (i]i0)=0 (i>i0)=1 b("100000000000000000000000000000011")=11
(i]]i0)=1 (i]i0)=1 (i>i0)=1 b("300000000000000000000000000000033")=33
(i]]i0)=1 (i]i0)=0 (i>i0)=1 b("1000000000000000000000000000000111")=111
(i]]i0)=1 (i]i0)=1 (i>i0)=1 b("3000000000000000000000000000000333")=333
(i]]i0)=1 (i]i0)=0 (i>i0)=0 b("10000000000000000000000000000001a")="3a"
(i]]i0)=1 (i]i0)=1 (i>i0)=1 b("30000000000000000000000000000001a")="4a"
10 июн 16, 13:57    [19280539]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить