Получить следующую букву алфавита 1с
Я создаю автозаполнение, которое выполняет поиск из представления CouchDB.
Мне нужно взять последний символ входной строки и заменить последний символ следующей буквой английского алфавита. (Здесь i18n не нужен)
(на случай, если вам интересно, я обязательно включу параметр inclusive_end=false , чтобы этот дополнительный символ не испортил мой набор результатов)
Вопрос
- Есть ли встроенная функция в Javascript, которая может просто получить следующую букву алфавита?
- Или мне просто нужно втянуть это в себя и выполнить свою собственную причудливую функцию с базовой строкой, такой как «abc . xyz» и indexOf() ?
// Это вернет A для Z и a для z.
Более комплексное решение, которое получает следующую букву в соответствии с нумерацией столбцов в MS Excel . A B C . Y Z AA AB . AZ BA . ZZ AAA
Это работает с маленькими буквами, но вы можете легко расширить его и для заглавных букв.
Вот функция, которая делает то же самое (за исключением только верхнего регистра, но это легко изменить), но использует slice только один раз и является итеративным, а не рекурсивным. В быстром тесте он примерно в 4 раза быстрее (что актуально только в том случае, если вы действительно активно его используете!).
Просто чтобы объяснить основную часть кода, который написал Бипул Ядав (пока не могу комментировать из-за отсутствия представителей). Без учета цикла и просто взяв в качестве примера символ "a":
"a" .charCodeAt (0) = 97 . следовательно, "a" .charCodeAt (0) + 1 = 98 и String.fromCharCode (98) = "b" . поэтому следующая функция для любой буквы вернет следующую букву в алфавите:
Насколько я понимаю, исходный вопрос заключался в перемещении последней буквы строки вперед к следующей букве. Но я пришел к этому вопросу, которого больше интересовало изменение всех букв в строке, а затем возможность отменить это. Итак, я взял код, написанный Бипулом Ядавом, и добавил еще немного кода. Приведенный ниже код принимает серию букв, увеличивает каждую из них до следующего регистра, поддерживающего букву (и позволяет Zz стать Aa), затем откатывает их к предыдущей букве (и позволяет Aa вернуться к Zz).
Возникла задача склеить два шестизначных числовых кода и записать их в один шестизначный код типа строка. О практическом применении напишу ниже.
Решение:
Выложим последовательность букв в ряд, например по алфавиту:
Алфавит = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ";
У каждой буквы есть порядковый номер: А = 1, Б = 2, В = 3 …, Ю = 32, Я = 33.
Если после прохождения всех номеров добавлять разрядность и продолжать нумерацию то получим: АА = 34, АБ = 35, АВ = 36 … ААА = 1123, ААБ = 1124 .
Таким образом, буквенный ряд, как и числовой, будет бесконечным.
Из этого следует, что каждому числу соответствует одна комбинация букв нашего буквенного ряда, но при этом разрядность буквенной записи меньше за счет того, что букв в нашем ряде 33, а в числовом 10.
Это похоже на запись числа в шестнадцатеричном виде, но алгоритм немного другой и разрядов больше :)
Соответственно чем больше знаков в исходном буквенном ряде, тем меньше знаков потребуется для кодирования числа. Например, если составить ряд из букв верхнего и нижнего регистра русского и латинского алфавитов + цифры от 1 до 9 (ноль не используется) то длина его будет 127 символов.
Использем этот ряд для преобразование числа 999 999 999 999 в строку, получим значение 48AшяC
т.е. 12-ти значное число можем "свернуть" в 6-ти символьную строку.
Механизм по обратному преобразованию можно использовать не только для определения первоначального числа.
Например используя в качастве буквенного ряда алфавит, можно получить порядковый номер любого слова, этот номер постоянный и не может изменится. т.к. алфавит не меняется.
так слово КЛАССИФИКАТОР будет иметь номер 20674162138069284621
а слово АЛГОРИТМ номер 59583701312
Кроме того, добавив в буквенный ряд заглавные буквы, знаки препинания и пробел, можно получать номера целых предложений например:
Без труда не выловишь и рыбку из пруда. = 19470269484383031306224885067323003470882054702807657091899034219691830
Теперь по реализации преобразования:
Немного математики и получаем механизмы перевода значения числа в строку и обратно используя собственный буквенный ряд.
&НаКлиенте
Процедура Выполнить2 ( Команда )
//Из числа в строку
Алфавит2 = Объект . Алфавит2 ;
КолСимволов = СтрДлина ( Алфавит2 );
Сл = "" ;
Ч = Число (?( ЗначениеЗаполнено ( СокрЛП ( Объект . Строка2 )), СокрЛП ( Объект . Строка2 ), 0 ));
Пока Ч > КолСимволов Цикл
цел = Цел ( Ч / КолСимволов );
дроб = ( Ч / КолСимволов )- цел ;
Если дроб = 0 Тогда
НомерБуквы = КолСимволов ;
Ч = цел - 1 ;
Иначе
НомерБуквы = дроб * КолСимволов ;
Ч = цел ;
КонецЕсли;
Сл = Сред ( Алфавит2 , Окр ( НомерБуквы ), 1 ) + Сл ;
Если Ч > 0 Тогда
Сл = Сред ( Алфавит2 , Ч , 1 )+ Сл ;
КонецЕсли;
// Из строки в число
Ч = 0 ;
ДлСтроки = СтрДлина ( СокрЛП ( Объект . Строка ));
Для А = 1 По ДлСтроки Цикл Ч = Ч + Pow ( КолСимволов , ДлСтроки - А )* Найти ( Алфавит2 , Сред ( СокрЛП(Объект . Строка) , А , 1 )) КонецЦикла;
&НаКлиенте
Процедура ПриОткрытии ( Отказ )
Объект . Алфавит2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя" ;
КонецПроцедуры
Способы применения:
- Использование максимального диапазона допустимых символов внутри установленной длинны кода.
- Визуальное кодирование и декодирование текста.
- Получение уникального идентификатора приемлемой длинны по нескольким элементам имеющим числовой код.
- Изменяя строку Алфавит2 (набор и последовательность символов), можно установить уникальную кодировку.
- Поместить строку в реквизит числового типа
- Генерировать строковые пароли
- Использовать как классификатор всех слов
Также можно подумать на счет хранения закодированного пароля в обычном реквизите типа число, при этом ключ надежно прятать :) может быть актульно для 7.7
число 22123476457584895786769029890898078978678123452153427867862146576367721919322327877721010111775763535555548388
строка рrюгщRPtpzWfнrYТHp1TЬйlЕldVdЙЛэCВщПzqJXлГэНZpmВeJяЧd
_______________________________________________________
строка ЕслиМеханизмИнтересенНажмитеПлюс
число 11214047979048599474046065949637649393355959347429435025149026973969
число 781060657266302177787942157125453912674901582490 (только русский алфавит нижний регистр, 33 знака)
Скрипт приведенный ниже демонстрирует следующие особенности работы с символами в 1С:
- Символ/КодСимвола работают в диапазоне -1..65535, причем Символ(-1) - строка без символов
- Скрипт ищет все символы "пустые строки". Некоторые из этих строк отображаются как непустые.
- Скрипт показывает, какие символы являются "буквами" для языка 1С - это полезно для написания обфускаторов и для проверок самописных парсеров языка 1С (собственно для проверки лексического генератора и написан этот скрипт).
- Скрипт показывает допустимость символов для XML. Это важно, потому что сервер и клиент 1С в управляемых формах общаются через XML, поэтому при попытке передать недопустимый символ возникнет ошибка времени выполнения. Если при загрузке данных из внешних источников это не учитывать, то может возникнуть ситуация, когда 1С будет всегда падать при открытии, например, справочника.
- Демонстрируется, что строка в 1С не является null-terminated. В скрипте не демонстрируется, но упомянуто, что ТекстовыйДокумент не умеет корректно работать со строками, содержащими Символ(0)
Сам скрипт проверялся в управляемых формах:
&НаКлиенте
Процедура ВыполнитьТест ( Команда )
РезультатТеста = Новый Массив ;
СтруктураДляПроверкиБукв = Новый Структура ;
Начало = - 2 ;
Конец = 65540 ;
Для Сч = Начало По Конец Цикл
Если Сч % 1024 = 0 Тогда
Состояние ( "Символ № " + Строка ( Сч ));
ОбработкаПрерыванияПользователя ();
КонецЕсли;
СимволПоКоду = Символ ( Сч );
СтруктураРезультат = Новый Структура (
"Номер, Символ, ЭтоСимвол, ПустаяСтрока, ЭтоБуква, ДопустимыйСимволыXML, КорректнаяКонкатенация" );
РезультатТеста . Добавить ( СтруктураРезультат );
СтруктураРезультат . Номер = Сч ;
СтруктураРезультат . Символ = СимволПоКоду ;
//Проверка 1 - Это символ?
//Демонстрируется, что Символ/КодСимвола работают в диапазоне -1..65535, причем Символ(-1) - строка без символов
КодПоСимволу = КодСимвола ( СимволПоКоду );
Если КодПоСимволу <> Сч Тогда
СтруктураРезультат . ЭтоСимвол = Ложь;
Продолжить;
Иначе
СтруктураРезультат . ЭтоСимвол = Истина;
КонецЕсли;
//Проверка 2 - Это пустая строка?
//Неочевидный момент - некоторые "пустые строки" вполне имеют графическое непустое отображение
СтруктураРезультат . ПустаяСтрока = ПустаяСтрока ( СимволПоКоду );
//Проверка 3 - Это буква?
//Буквой считаем символ, который может быть именем поля в структуре. Таких букв достаточно много.
ТекущееЗначение = "" ;
Попытка
Если СтруктураДляПроверкиБукв . Свойство ( СимволПоКоду , ТекущееЗначение ) Тогда
//Заодно сохраняем все "одинаковые" буквы, максимальное количество - 4:Θθϑe2;
СтруктураДляПроверкиБукв [ СимволПоКоду ] = ТекущееЗначение + СимволПоКоду ;
Иначе
СтруктураДляПроверкиБукв . Вставить ( СимволПоКоду , СимволПоКоду );
КонецЕсли;
СтруктураРезультат . ЭтоБуква = Истина;
Исключение
СтруктураРезультат . ЭтоБуква = Ложь;
КонецПопытки;
//Проверка 4 - Допустимые символы XML. Строки с недопустимыми символами нельзя передать с сервера или на сервер.
//При получении данных из любых сторонних источников, перез записью их в БД крайне желательно их проверять на то,
//что они смогут потом быть прочитанными.
СтруктураРезультат . ДопустимыйСимволыXML = ( НайтиНедопустимыеСимволыXML ( СимволПоКоду ) = 0 );
//Проверка 5 - корректность конкатенации
//- очевидно, что для символа с кодом -1 конкатенация не работает (это пустая строка длины 0)
//- менее очевидно, что символы кода 0 успешно конкатенируются. Только ТекстовыйДокумент об этом, к сожалению, не знает
ДлиннаяСтрока = СимволПоКоду + СимволПоКоду + СимволПоКоду + СимволПоКоду + СимволПоКоду ;
СтруктураРезультат . КорректнаяКонкатенация = ( СтрДлина ( ДлиннаяСтрока ) = 5 );
//1. в текстовый документ нельзя вывести "нулевой символ"
//2. Выводим "честно" - последовательно по строкам и колонкам, чтобы не привлекать дополнительные механизмы
ТабличныйДокумент = Новый ТабличныйДокумент ;
СчКолонок = 1 ;
Для каждого КлючИЗначениеСтруктураРезультат Из СтруктураРезультат Цикл
ТабличныйДокумент . Область ( 1 , СчКолонок , 1 , СчКолонок ). Текст = КлючИЗначениеСтруктураРезультат . Ключ ;
СчКолонок = СчКолонок + 1 ;
КонецЦикла;
ТабличныйДокумент . Область ( 1 , СчКолонок , 1 , СчКолонок ). Текст = "АналогичныеСимволы" ;
ТабличныйДокумент . Область ( 1 , СчКолонок + 1 , 1 , СчКолонок + 1 ). Текст = "КоличествоАналогов" ;
СчСтрок = 2 ;
Для каждого СтруктураРезультат Из РезультатТеста Цикл
Если СчСтрок % 1024 = 0 Тогда
Состояние ( "Строка № " + Строка ( СчСтрок ));
ОбработкаПрерыванияПользователя ();
КонецЕсли;
СчКолонок = 1 ;
Для каждого КлючИЗначениеСтруктураРезультат Из СтруктураРезультат Цикл
ТабличныйДокумент . Область ( СчСтрок , СчКолонок , СчСтрок , СчКолонок ). Текст = КлючИЗначениеСтруктураРезультат . Значение ;
СчКолонок = СчКолонок + 1 ;
КонецЦикла;
Если СтруктураРезультат . ЭтоБуква = Истина Тогда
ТабличныйДокумент . Область ( СчСтрок , СчКолонок , СчСтрок , СчКолонок ). Текст = СтруктураДляПроверкиБукв [ СтруктураРезультат . Символ ];
ТабличныйДокумент . Область ( СчСтрок , СчКолонок + 1 , СчСтрок , СчКолонок + 1 ). Текст = СтрДлина ( СтруктураДляПроверкиБукв [ СтруктураРезультат . Символ ]);
КонецЕсли;
СчСтрок = СчСтрок + 1 ;
КонецЦикла;
ТабличныйДокумент . Показать ();
Скрипт пробегает по всем символам и просто выводит на экран табличный документ с результатами.
Я бы за обозначенную сумму мог бы описать алгоритм на словах, но писать готовый код. нафиг-нафиг, желаю удачи!
не совсем понял, это глаза будут определять ?
---------------------
вход откуда и выход куда ?
(3)
это на русском, но я ничего не понял :)
ввод нельзя ограничить только буквами и одного алфавита.
или потом проверять,где есть буквы, похожие на цифры :)
(7)
как это может быть Аз АнЗ0
----------------
есть человек
он набирает в поле ввода
( что ему хочется или слепым методом )
конкретно слепым, что набирает, что попало :)
---------------------
потом это куда идет и для чего эта затея ?
можно учесть тот момент, что введёные данные могут быть только АР0 или ар0 допустим или ан0 или АН0
(10)вам вознаграждение умножить на 100
конкретно подать задачу и ждите результат от желающих :)
Постулаты программирования Туатмена
2. Самая опасная ошибка обнаруживается тогда, когда программа функционирует уже полгода.
Компьтерные законы по Голубу
1. Нечеткая формулировка целей проекта используется для того, чтобы избежать неприятных минут при определении предполагаемых затрат на осуществление этих целей.
(14)Честно скажу, вроде бы понятно, что и как должно отрабатывать, как более понятную формулировку дать, не совсем понимаю, сейчас только дополню, откуда число берётся и куда выводитсяРуководство по системному программированию Штейнбаха
Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать.
М-да. "Плоды раздумья" Козьмы Пруткова:
"Если у тебя есть фонтан, заткни его, дай отдохнуть и фонтану"
примерно так, нужное соответствие дополнить
Нужно определить предел схожести. "u" и "и" тоже, говорят, похожи.
А по реализации предлагаю сделать наборы похожих символов. Хранить в регистре или в справочнике с табчастью. Или хранить в строках наборы символов, потом в цикле перебирать. Для ускорения получения нужных наборов предлагаю сделать регистр с фиксированным набором символов, чтобы осуществлять по ним поиск.
Перебираем символы в слове, ищем набор, в котором присутствует символ, формируем варианты слова с перебором символов.
Читайте также: