Лидирующие нули
По теме из базы знаний
- Добавить лидирующие нули к произвольному значению
- Обработка по восстановлению лидирующих нулей для Бухгалтерии 2.0
- Простой способ убрать префикс и лидирующие нули из номера.
- Получение номера без префикса и лидирующих нулей
- Расширение для тех, кто не знает как убрать префиксы и лидирующие нули в печатных формах всех документов УТ 11.4
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
Функция Формат() тебе точно не подойдет:
Встроенные функции языка.Формат (Script functions.Format)
Встроенные функции языка (Script functions)
Формат (Format)
Синтаксис:
Формат(<Значение>, <ФорматнаяСтрока>)
Параметры:
<Значение> (обязательный)
Тип: Число; Дата; Булево.
Только Число,Дата, Булево!!!!
Встроенные функции языка.Формат (Script functions.Format)
Встроенные функции языка (Script functions)
Формат (Format)
Синтаксис:
Формат(<Значение>, <ФорматнаяСтрока>)
Параметры:
<Значение> (обязательный)
Тип: Число; Дата; Булево.
Только Число,Дата, Булево!!!!
Может так как то...
не помню с 0 или с 1 нумерация символов в строке начинается только
не помню с 0 или с 1 нумерация символов в строке начинается только
Результат = "";
ДлинаЗначение = СтрДлина(Зачение);
Для сч = 0 по ДлинаЗначение Цикл
Если НЕ Сред(Значение,Сч,Сч) = "0" Тогда
Результат = Результат+Сред(Значение,Сч,1);
КонецЕсли;
КонецЦикла;
Показать
Способы
1) Через цикл. Это понятно.
2) Через функцию
Потом Формат . Годится только если в строке будут всегда числа.
3) СтрЗаменить(СокрЛ(СтрЗаменить("000000078009000","0"," "))," ","0")
1) Через цикл. Это понятно.
2) Через функцию
Функция КЧислу(Строка) Экспорт
ОписаниеТипов = Новый ОписаниеТипов("Число");
Возврат ОписаниеТипов.ПривестиЗначение(Строка);
КонецФункции
Потом Формат . Годится только если в строке будут всегда числа.
3) СтрЗаменить(СокрЛ(СтрЗаменить("000000078009000","0"," "))," ","0")
МассивНенужного = Новый Массив;
МассивНенужного.Добавить("0");
СтрокаНенужного = "";
Для симв = 1 по СтрДлина(СокрЛП(Значение)) Цикл
Символ = Сред(СокрЛП(Значение),симв,1);
Если МассивНенужного.Найти(Символ) = Неопределено тогда
Значение = Сред(СокрЛП(Значение),симв);
Прервать;
КонецЕсли;
КонецЦикла;
Сообщить(СокрЛП(Значение))
ПоказатьНомер = "00000000170"
Пока Лев(Номер,1)="0" Цикл
Номер = Прав(Номер,СтрДлина(Номер)-1);
КонецЦикла;
Возврат Номер;
Пусть имеется строка Номер состоящая только из числе от 0 до 9, типа Строка
Получим итог ввиде ИтоговаяСтрока типа Строка не содержащая ведущих нулей.
1. Для любителей регулярных выражений
2. Для любителей рекурсий
3. Для любителей циклов (взят пример выше)
4. Для любителей языка 1С
На мой взгляд более правильно оформить "Функцию УбратьВедущиеНули(Знач Номер)", можно в глобальном модуле, вложив в неё реализацию циклом.
P.S. Не одна из представленных реализаций не проверяет входящее значение, поэтому не стоит их использовать в лоб в готовых решениях.
Получим итог ввиде ИтоговаяСтрока типа Строка не содержащая ведущих нулей.
1. Для любителей регулярных выражений
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^0*([1-9][0-9]*)$";
Matches = RegExp.Execute(Номер);
ИтоговаяСтрока = Matches.Item(0).SubMatches.Item(0);
2. Для любителей рекурсий
Функция УбратьНули(НомерСтрокой)
Если Лев(НомерСтрокой, 1) = "0" Тогда
Возврат УбратьНули(Прав(НомерСтрокой, СтрДлина(НомерСтрокой) - 1));
Иначе
Возврат НомерСтрокой;
КонецЕсли;
КонецФункции
ИтоговаяСтрока = УбратьНули(Номер);
Показать3. Для любителей циклов (взят пример выше)
Пока Лев(Номер, 1) = "0" Цикл
Номер = Прав(Номер, СтрДлина(Номер) - 1);
КонецЦикла;
ИтоговаяСтрока = Номер;
4. Для любителей языка 1С
ИтоговаяСтрока = СтрЗаменить(Формат(Число(Номер), "ЧРГ='_'"), "_", "");
На мой взгляд более правильно оформить "Функцию УбратьВедущиеНули(Знач Номер)", можно в глобальном модуле, вложив в неё реализацию циклом.
P.S. Не одна из представленных реализаций не проверяет входящее значение, поэтому не стоит их использовать в лоб в готовых решениях.
Мож кому пригодится -- нужно было убрать лидирующие нули в запросе.
В моем случае номер 10-ти значный и строковый, но префиксы не используются.
В моем случае номер 10-ти значный и строковый, но префиксы не используются.
ВЫБРАТЬ
ВЫБОР
КОГДА Не ПОДСТРОКА(&Номер, 1, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 1, 10)
КОГДА Не ПОДСТРОКА(&Номер, 2, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 2, 9)
КОГДА Не ПОДСТРОКА(&Номер, 3, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 3, 8)
КОГДА Не ПОДСТРОКА(&Номер, 4, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 4, 7)
КОГДА Не ПОДСТРОКА(&Номер, 5, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 5, 6)
КОГДА Не ПОДСТРОКА(&Номер, 6, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 6, 5)
КОГДА Не ПОДСТРОКА(&Номер, 7, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 7, 4)
КОГДА Не ПОДСТРОКА(&Номер, 8, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 8, 3)
КОГДА Не ПОДСТРОКА(&Номер, 9, 1) = "0" ТОГДА ПОДСТРОКА(&Номер, 9, 2)
Иначе ПОДСТРОКА(&Номер, 10, 1)
КОНЕЦ КАК Поле1
Показать
Небольшой тест провел. Длина номера 12, номер от 1 до 99999
Правильность функций не проверял
Правильность функций не проверял
К = 100 000
Функция, время (сек)
Строка = УбратьНулиРекурсией(Номер); 4
Строка = УбратьНулиЦикломПока(Номер); 3
Строка = УбратьНулиФорматом(Номер); 3
Строка = УбратьНулиФорматом2(Номер); 3
Строка = УбратьНулиМассивНенужного(Номер); 6
Строка = УбратьНулиЦикломДля(Номер); 4
К = 300 000
Функция, время (сек)
Строка = УбратьНулиРекурсией(Номер); 16
Строка = УбратьНулиЦикломПока(Номер); 8
Строка = УбратьНулиФорматом(Номер); 9
Строка = УбратьНулиФорматом2(Номер); 7
Строка = УбратьНулиМассивНенужного(Номер); 16
Строка = УбратьНулиЦикломДля(Номер); 12
Показать
Вот такая функция быстрее других работает, не универсально конечно
Функция УбратьНулиЗаменой(НомерСтрокой) // Для Номер длиной 12
Возврат СтрЗаменить(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить("=" + НомерСтрокой,
"=000000000000","0"),
"=00000000000",""),
"=0000000000",""),
"=000000000",""),
"=00000000",""),
"=0000000",""),
"=000000",""),
"=00000",""),
"=0000",""),
"=000",""),
"=00",""),
"=0",""),
"=","");
КонецФункции
Показать
К = 400 000
Функция, время (сек)
Строка = УбратьНулиРекурсией(Номер); 9
Строка = УбратьНулиЦикломПока(Номер); 5
Строка = УбратьНулиФорматом(Номер); 7
Строка = УбратьНулиФорматом2(Номер); 5
Строка = УбратьНулиМассивНенужного(Номер); 8
Строка = УбратьНулиЦикломДля(Номер); 5
Строка = УбратьНулиЗаменой(Номер); 3
ПоказатьФункция УдалитьПовторяющиесяСимволы(Знач Строка, Знач Символ, Знач Режим = "Слева") Экспорт
Если ВРег(Режим) = "СЛЕВА" Тогда
Пока Лев(Строка, 1)= Символ Цикл
Строка = Сред(Строка, 2);
КонецЦикла;
ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
Пока Прав(Строка, 1)= Символ Цикл
Строка = Лев(Строка, СтрДлина(Строка) - 1);
КонецЦикла;
КонецЕсли;
Возврат Строка;
КонецФункции
Показать
Я тоже хочу заработать $m
не комильфо, потому что 1С будет в цикле копировать строку, а это медленно. Надо так:
Пока Лев(Номер, 1) = "0" Цикл
Номер = Прав(Номер, СтрДлина(Номер) - 1);
КонецЦикла;
не комильфо, потому что 1С будет в цикле копировать строку, а это медленно. Надо так:
Для к = 1 по СтрДлина(Номер) Цикл
Если Сред(Номер, к, 1) <> "0" Тогда
Номер = Сред(Номер, к);
прервать;
КонецЕсли;
КонецЦикла;
(39)
Быстродействие в данной задаче не критично, но из спортивного интереса сделал следующий замер:
Предложенный Вами вариант из сравниваемых трех оказался самым медленным:
Результат функции НомерБезНулей1: 13 ; Время, мсек: 4 119
Результат функции НомерБезНулей2: 13 ; Время, мсек: 3 649
Результат функции НомерБезНулей3: 13 ; Время, мсек: 3 527
будет в цикле копировать строку, а это медленно
Быстродействие в данной задаче не критично, но из спортивного интереса сделал следующий замер:
Функция НомерБезНулей1(Знач Номер)
Для к = 1 по СтрДлина(Номер) Цикл
Если Сред(Номер, к, 1) <> "0" Тогда
Номер = Сред(Номер, к);
прервать;
КонецЕсли;
КонецЦикла;
Возврат Номер;
КонецФункции // НомерБезНулей1()
Функция НомерБезНулей2(Знач Номер)
Пока Лев(Номер, 1) = "0" Цикл
Номер = Прав(Номер, СтрДлина(Номер) - 1);
КонецЦикла;
Возврат Номер;
КонецФункции // НомерБезНулей2()
Функция НомерБезНулей3(знач Номер)
//убираем префикс и нули
Пока Найти("123456789",Лев(номер,1)) = 0 Цикл
Номер = Сред(Номер,2);
КонецЦикла;
Возврат Номер;
КонецФункции // НомерБезНулей3()
НомерСНулями = "0000000000000013";
замер = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для й=1 По 20000 Цикл
тест = НомерБезНулей1(НомерСНулями);
КонецЦикла;
Сообщить("Результат функции НомерБезНулей1: "+тест+" ; Время, мсек: "+Строка(ТекущаяУниверсальнаяДатаВМиллисекундах()-замер));
замер = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для й=1 По 20000 Цикл
тест = НомерБезНулей2(НомерСНулями);
КонецЦикла;
Сообщить("Результат функции НомерБезНулей2: "+тест+" ; Время, мсек: "+Строка(ТекущаяУниверсальнаяДатаВМиллисекундах()-замер));
замер = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для й=1 По 20000 Цикл
тест = НомерБезНулей3(НомерСНулями);
КонецЦикла;
Сообщить("Результат функции НомерБезНулей3: "+тест+" ; Время, мсек: "+Строка(ТекущаяУниверсальнаяДатаВМиллисекундах()-замер));
ПоказатьПредложенный Вами вариант из сравниваемых трех оказался самым медленным:
Результат функции НомерБезНулей1: 13 ; Время, мсек: 4 119
Результат функции НомерБезНулей2: 13 ; Время, мсек: 3 649
Результат функции НомерБезНулей3: 13 ; Время, мсек: 3 527
(42) не смотрел все варианты, может и был.
Но проще всего же:
Но проще всего же:
Функция УбратьЛидирующиеНули(ЧислоСтрокой)
Результат = "";
ДлинаСтроки = СтрДлина(ЧислоСтрокой);
Для к = 1 По ДлинаСтроки Цикл
Если Сред(ЧислоСтрокой,к,1) <> "0" Тогда
Результат = Прав(ЧислоСтрокой, ДлинаСтроки - к+1);
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Показать
Функция УбратьЛидирующиеНули(КодНоменклатуры)
КодНоменклатурыДляОбработки = КодНоменклатуры;
СимволКода = 0;
Пока СимволКода = 0 Цикл
КодНоменклатурыДляОбработки = Прав(КодНоменклатурыДляОбработки, СтрДлина(КодНоменклатурыДляОбработки) - 1);
СимволКода = Лев(КодНоменклатурыДляОбработки, 1);
СимволКода = Число(СимволКода);
КонецЦикла;
КодНоменклатурыБезНуля = КодНоменклатурыДляОбработки;
Возврат КодНоменклатурыБезНуля;
КонецФункции
ПоказатьФункция УбратьЛидирующиеНули(Строка) Экспорт
Для сч = 0 по СтрДлина(Строка) Цикл
Если НЕ Сред(Строка,Сч, 1) = "0" Тогда //Как только всретили не ноль, возвращаем хвостик
Возврат Сред(Строка , Сч);
КонецЕсли;
КонецЦикла;
Возврат "";
КонецФункции
ПоказатьФункция УбратьЛидирующиеНули(Код) Экспорт
_Код = СтрЗаменить(Код, "УТ", "");
Если Лев(_Код, 1) = "0" Тогда
Возврат УбратьЛидирующиеНули(Прав(_Код, СтрДлина(_Код) - 1));
Иначе
Возврат _Код;
КонецЕсли;
КонецФункции
Показать
у вас приведен пример именно с цифрами: значение "000001".
если там не только цифры, то все символы слева от произвольной позиции в этой строке можно считать лидирующими и задача сводится к тому, как найти эту позицию (гадать какие лидирующие символы в этой строке я не берусь ибо телепатическими способностями не обладаю), напишите пример
если там не только цифры, то все символы слева от произвольной позиции в этой строке можно считать лидирующими и задача сводится к тому, как найти эту позицию (гадать какие лидирующие символы в этой строке я не берусь ибо телепатическими способностями не обладаю), напишите пример
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)