Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Буквенно чисельный диапазон
Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011 Откуда: Крым
Помог: 25 раз(а)
Приветствую.
Стоит задача:
Пользователь может ввести в поле "от" и "до" диапазон значений содержащий латинскую букву (A-Z) в начале или в конце строки и цифры. Например, диапазон может быть следующий:
Цитата:
A00001 - B99999
или
00001A - 99999B
Как эти диапазоны лучше хранить в базе, для максимально удобной проверки, входит ли значение N в какой-то из диапазонов.
Спасибо.
----- Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
RickMan
Отправлено: 15 Октября, 2014 - 10:16:08
Участник
Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012
Помог: 30 раз(а)
А пользователь может ввести A00001 - 99999B ?
snikers987
Отправлено: 15 Октября, 2014 - 10:20:10
Участник
Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011 Откуда: Крым
Помог: 25 раз(а)
RickMan пишет:
А пользователь может ввести A00001 - 99999B ?
нет
----- Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
RickMan
Отправлено: 15 Октября, 2014 - 10:20:12
Участник
Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012
Помог: 30 раз(а)
Вообще решением я думаю будет пройтись посимвольно и сверить. (Добавление)
А что если сравнивать эти два числа, исходя из того, что они в 16-ричной системе? Тогда и сравнивать не сложно.
Sail
Отправлено: 15 Октября, 2014 - 10:29:33
Участник
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
Помог: 57 раз(а)
RickMan, "содержащий латинскую букву (A-Z)". "Гранаты не той системы" snikers987, 12345G больше, чем 99999B, или не больше?
Мелкий
Отправлено: 15 Октября, 2014 - 10:31:13
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Можно чуть про предметную область? Может, получится подсказать что-нибудь более адекватное.
Буква есть всегда, только одна? По каким правилам её сравнивать?
Решение в лоб:
is_letter_first - bool, начинается ли диапазон с буквы
Пара bigint, в которых первые или последние два десятичных знака (соответственно is_letter_first) отдать под числовой идентификатор соответствующей буквы. Остальные знаки будут хранить собственно число. Начало и конец диапазона, собственно.
----- PostgreSQL DBA
RickMan
Отправлено: 15 Октября, 2014 - 10:41:21
Участник
Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012
Помог: 30 раз(а)
Sail Ну и будет побольше система, что здесь плохово? Логика остается преждней.
snikers987
Отправлено: 15 Октября, 2014 - 10:44:34
Участник
Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011 Откуда: Крым
Помог: 25 раз(а)
Мелкий пишет:
Можно чуть про предметную область? Может, получится подсказать что-нибудь более адекватное.
Буква есть всегда, только одна? По каким правилам её сравнивать?
Решение в лоб:
is_letter_first - bool, начинается ли диапазон с буквы
Пара bigint, в которых первые или последние два десятичных знака (соответственно is_letter_first) отдать под числовой идентификатор соответствующей буквы. Остальные знаки будут хранить собственно число. Начало и конец диапазона, собственно.
Там могут быть значения как с буквами, так и без них совсем (т.е. только цифры), но в каждом диапазоне, значение A и B всегда по одной схеме, т.е. если с буквой то оба значения с ней и буква в одинаковом месте, если без буквы, то оба значения без буквы. Суть в том, что при создании жалобы (обращение в страховую), вводится, среди прочего, этот код(ы) , при этом нужно проверять, входит, ли введенный код, в какой либо диапазон, если да, то выполняются некоторые действия.
Пока, самым адекватным решением, мне кажется, приводить все буквы к числам (т.е. 1-26), и хранить их в отдельных полях базы данных, и сравнивать все как десятичные числа. (Добавление)
Sail пишет:
snikers987, 12345G больше, чем 99999B, или не больше?
----- Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
Sail
Отправлено: 15 Октября, 2014 - 11:17:44
Участник
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
Помог: 57 раз(а)
snikers987 пишет:
приводить все буквы к числам (т.е. 1-26)
Неужели, есть разница, буквы сравнивать (латинские), или числа?!
Раз уж 12345G больше, чем 99999B, то действительно придётся разделять буку и число (строка с лидирующими нулями).
Вот ещё вариант:
- признак наличия буквенного символа (0 - нет, 1 - в начале, 2 - в конце)
- числовая часть кода
- буквенный символ (или просто пробел).
Сравнивать со строками: 'буквенный символ'.'числовая часть кода'.
Признак наличия актуален для корректного отображения кода в форме (отчёте).
****
Впрочем, и хранить можно в одной строке... обрабатывая буквенный символ при выводе, в зависимости от признака...
И сравнивать, как предложил RickMan.
index_a и index_b - содержит порядковый номер буквы (1-26)
value_a и value_b - содержит числовую часть кода, в начало которой добавлен числовой индекс буквы.
index_after - хранит позицию буквенного индекса в строке (0 - начало, 1- конец)
затем можно искать, например код A0003, можно вот так:
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.