Поиск ошибок наименования (нелатинские символы среди латинских)
>> 10 октября 2013 г.
Возникла проблема, когда люди в наименовании товара указывают вместо латинских символов - русские (вспомним букву С в начале набора слова!). К сожалению, если наименование содержит по своей природе не только латинские символы, то выполнить проверку не так просто - не достаточно просто выловить все символы с кодом меньше/равно 127.
Можно немного ухитриться, и при проверке символа, определять не только то, что он не принадлежит "нормальным" символам, но и проверять его соседей. Лично я установил условие чтобы соседний символ не был сточной, либо прописной латинской буквой (согласитесь, странно выглядит русская буква в соседстве с латинской).
При это нужно указать два диапазона, чтобы исключить слэши, тире и остальные спецсимволы, так как они могут иметь место в паре с русскими.
Числа могу так же быть вместе с русскими символами, но это уже нужно обращать внимание на специфику наименования - если что, и эта проверка будет не лишней.
Как результат, мне удалось не только найти ошибки символьные, но и не прописанные пробелы между русскими и английскими словами в наименовании.
И что еще интереснее, удалось выделить английские символы, которые "затерялись" среди русских слов (выделялся русский символ, соседом которого был латинский).
Таблица символов ASCII
Можно немного ухитриться, и при проверке символа, определять не только то, что он не принадлежит "нормальным" символам, но и проверять его соседей. Лично я установил условие чтобы соседний символ не был сточной, либо прописной латинской буквой (согласитесь, странно выглядит русская буква в соседстве с латинской).
При это нужно указать два диапазона, чтобы исключить слэши, тире и остальные спецсимволы, так как они могут иметь место в паре с русскими.
Числа могу так же быть вместе с русскими символами, но это уже нужно обращать внимание на специфику наименования - если что, и эта проверка будет не лишней.
Как результат, мне удалось не только найти ошибки символьные, но и не прописанные пробелы между русскими и английскими словами в наименовании.
И что еще интереснее, удалось выделить английские символы, которые "затерялись" среди русских слов (выделялся русский символ, соседом которого был латинский).
Таблица символов ASCII
Процедура ДействияФормыПроверкаНаименования(Кнопка) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Наименование КАК Наименование, | Номенклатура.Код |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | (НЕ Номенклатура.ПометкаУдаления) | |УПОРЯДОЧИТЬ ПО | Наименование"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ОбработкаПрерыванияПользователя(); Индекс = обПроверитьСимволыЛатиницы(Выборка.Наименование); Если Индекс > 0 Тогда Символ = Сред(Выборка.Наименование,Индекс,1); НовоеИмя = Лев(Выборка.Наименование, Индекс-1)+"{"+Символ+"}"+Прав(Выборка.Наименование, СтрДлина(Выборка.Наименование)-Индекс); Сообщить(Формат(Выборка.Код, "ЧГ=")+" => "+НовоеИмя); КонецЕсли; КонецЦикла; КонецПроцедуры Функция обПроверитьСимволыЛатиницы(Строка) Для Индекс = 1 По СтрДлина(Строка) Цикл Символ = Сред(Строка,Индекс,1); Если НЕ обЭтоСимволЛатиницы(Символ) Тогда // -------------------------------------------- // проверим соседние символы Если Индекс>1 Тогда Символ = Сред(Строка,Индекс-1,1); Если обЭтоСимволЛатиницы(Символ, Истина) Тогда Возврат Индекс; КонецЕсли; КонецЕсли; Если Индекс<СтрДлина(Строка) Тогда Символ = Сред(Строка,Индекс+1,1); Если обЭтоСимволЛатиницы(Символ, Истина) Тогда Возврат Индекс; КонецЕсли; КонецЕсли; // -------------------------------------------- КонецЕсли; КонецЦикла; Возврат 0; КонецФункции Функция обЭтоСимволЛатиницы(Символ, ТолькоБуквы=Ложь) Код = КодСимвола(Символ); Если (Код < 128) Тогда // нелатинский символ Если ТолькоБуквы Тогда // исключим специальные символы Если (Код >= 65 И Код <= 90) Или (Код >= 97 И Код <= 122) Тогда //(Код >= 48 И Код <= 57) Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецЕсли; Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецФункции
0 коммент.:
Отправить комментарий