Лидирующие нули

1. Fold 15.02.12 13:36 Сейчас в теме
Всем привет
Есть переменная "Значение" типа строка содержащая значение "000001", как убрать лидирующие нули способом отличного от этого?:

Число(Значение)

Этот способ не подходит т.к. преобразует тип значения в число. Как это сделать с помощью функции Формат?
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
25. Gennadiy83 19.08.15 13:30 Сейчас в теме
(1) Fold, форматная строка позволяет управлять лидирующими нулями. Лично добавлял к числу лидирующие нули, правда с преобразованием к строке. Надо попробовать тоже самое к строке. Пример форматной строки: "ЧЦ=4; ЧВН=; ЧГ=0"
2. Fish'ka 15.02.12 13:48 Сейчас в теме
СтрЗаменить(<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>) не подойдет?
3. tymba 28 15.02.12 13:52 Сейчас в теме
Функция Формат() тебе точно не подойдет:

Встроенные функции языка.Формат (Script functions.Format)
Встроенные функции языка (Script functions)
Формат (Format)
Синтаксис:

Формат(<Значение>, <ФорматнаяСтрока>)
Параметры:

<Значение> (обязательный)

Тип: Число; Дата; Булево.

Только Число,Дата, Булево!!!!
4. Fold 15.02.12 13:59 Сейчас в теме
Точно, СтрЗаменить нормально работает. А с помощью функции формат можно получить тот же результат что и Число(Значение)?
6. bot67 15.02.12 14:11 Сейчас в теме
(4) Fold, Только СтрЗаменить заменит все нули в строке, а не только лидирующие...
chrnv; Mechanik21; tw1ster_ok; +3 Ответить
7. bot67 15.02.12 14:16 Сейчас в теме
(4) Fold, В конфигураторе в меню "Текст" есть "Конструктор форматной строки" там всё с помощью галочек настраивается.
Только функция Формат все равно не для строки а для числа или даты...
5. SPID 15.02.12 14:03 Сейчас в теме
Может так как то...
не помню с 0 или с 1 нумерация символов в строке начинается только

Результат = "";
ДлинаЗначение = СтрДлина(Зачение);
Для сч = 0 по ДлинаЗначение Цикл

 Если НЕ Сред(Значение,Сч,Сч) = "0" Тогда
   Результат = Результат+Сред(Значение,Сч,1);
 КонецЕсли;

КонецЦикла;
Показать
PRoman; Akfourtys; +2 Ответить
8. SPID 15.02.12 14:18 Сейчас в теме
немного ошибся в своем посте
строчку Если НЕ Сред(Значение,Сч,Сч) = "0" Тогда заменить на Если НЕ Сред(Значение,Сч,1) = "0" Тогда
9. cool.vlad4 2 15.02.12 14:21 Сейчас в теме
Способы
1) Через цикл. Это понятно.
2) Через функцию
Функция КЧислу(Строка) Экспорт
	
	ОписаниеТипов = Новый ОписаниеТипов("Число"); 
    Возврат ОписаниеТипов.ПривестиЗначение(Строка); 
		
КонецФункции


Потом Формат . Годится только если в строке будут всегда числа.
3) СтрЗаменить(СокрЛ(СтрЗаменить("000000078009000","0"," "))," ","0")
insurgut; user825364; Мах; Hirondelle; herfis; MorrisMorgan; Светлый ум; +7 Ответить
44. herfis 498 02.10.17 16:41 Сейчас в теме
А мне понравился из (9) однострок:
СтрЗаменить(СокрЛ(СтрЗаменить("000000078009000","0"," "))," ","0")
user825364; mrChOP93; Hirondelle; adhocprog; kot26rus; +5 Ответить
10. SPID 15.02.12 14:54 Сейчас в теме
Подправил :)
ДлинаЗначение = СтрДлина(Значение);
Для сч = 0 по ДлинаЗначение Цикл

 Если НЕ Сред(Значение,Сч,1) = "0" Тогда
   Результат = Сред(Значение,Сч);
   Прервать;
 КонецЕсли;

КонецЦикла;
Показать
11. zinch 15.02.12 17:08 Сейчас в теме
А если так: Формат( Число( "000001" ), "ЧРГ=' '; ЧГ=0")
12. var777 17.02.12 11:39 Сейчас в теме
МассивНенужного = Новый Массив;
	МассивНенужного.Добавить("0");
		
	СтрокаНенужного = "";
	Для симв = 1 по СтрДлина(СокрЛП(Значение)) Цикл
		Символ = Сред(СокрЛП(Значение),симв,1);
		Если МассивНенужного.Найти(Символ) = Неопределено тогда
			Значение = Сред(СокрЛП(Значение),симв);
			Прервать;
		КонецЕсли;
	КонецЦикла;	
	Сообщить(СокрЛП(Значение))
Показать
13. a.p.soft 54 10.05.12 17:06 Сейчас в теме
Ок, если не подходит Число() - так как преобразует тип в число, то может быть подойдет Строка(Число(Значение)) ? =)
gybson; Nykos; maks_20; whilefor; elga2012; +5 Ответить
14. ilya.ilya 11.05.12 17:15 Сейчас в теме
Номер = "00000000170"
Пока Лев(Номер,1)="0" Цикл
 Номер = Прав(Номер,СтрДлина(Номер)-1);
КонецЦикла;

Возврат Номер;
user1252779; Lolmes; vkozak; andrey7617; Dimeron; stepan_boroda; Infector; insurgut; Spartan; ekomova; SAGerasimov; CratosX; vetaldober; yuraskas; Ziggurat; +15 Ответить
51. vkozak 20.12.19 11:27 Сейчас в теме
(14)
Номер = "00000000170"
Пока Лев(Номер,1)="0" Цикл
Номер = Прав(Номер,СтрДлина(Номер)-1);
КонецЦикла;

Возврат Номер;


Мне кажется для переменной типа "Строка" наиболее разумное решение.
15. Dragonim 139 12.05.12 08:57 Сейчас в теме
Пусть имеется строка Номер состоящая только из числе от 0 до 9, типа Строка
Получим итог ввиде ИтоговаяСтрока типа Строка не содержащая ведущих нулей.
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. Не одна из представленных реализаций не проверяет входящее значение, поэтому не стоит их использовать в лоб в готовых решениях.
Ujine1313; SAGerasimov; Chernov_Dmitriy; vetaldober; nana_rge; +5 Ответить
17. ascii32 27.07.12 17:38 Сейчас в теме
(15) Dragonim,
1 вариант найдет "0002", но не найдет "00202". Надо скорее что-то типа "^0*([1-9][0-9]*)$"

Второй вариант, самый красивый и правильный, но пока 1С не реализуют хвостовую рекурсию, к сожалению, бесполезный(
16. ilya.ilya 12.05.12 10:22 Сейчас в теме
Строка(Формат(Число(Номер),"ЧГ=0")); - тоже работает :) Правда будет исключение если префикс есть.
18. beldieff 27.07.12 17:58 Сейчас в теме
ОбщегоНазначения.ПолучитьНомерНаПечать()
Trost; keygen; Dimeron; adhocprog; anuar_medeup; Rustavelli; pbahushevich; cool.vlad4; krovohlebka; SAGerasimov; ekaterinaeon; AlexeyFreeLife; dicwork; anchovy; VladimirVladimir; deniseek77; ascii32; +17 Ответить
19. insurgut 207 28.07.12 09:18 Сейчас в теме
(18) beldieff, +1, toall - зачем велосипед изобретать, когда есть готовые наработки?
20. Alexander.Shvets 221 24.04.13 16:08 Сейчас в теме
Что мешает с начала преобразовать в Число(Значение), а потом Форматом преобразовать в строку? Или Строка(Значение)?
21. reneq 09.07.14 09:07 Сейчас в теме
Мож кому пригодится -- нужно было убрать лидирующие нули в запросе.
В моем случае номер 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
Показать
nnn; e7k8v12; +2 Ответить
22. miniogn 23 09.07.14 10:27 Сейчас в теме
Небольшой тест провел. Длина номера 12, номер от 1 до 99999
Правильность функций не проверял

К = 100 000
Функция, время (сек)
Строка = УбратьНулиРекурсией(Номер);            4
Строка = УбратьНулиЦикломПока(Номер);            3
Строка = УбратьНулиФорматом(Номер);            3
Строка = УбратьНулиФорматом2(Номер);            3
Строка = УбратьНулиМассивНенужного(Номер);            6
Строка = УбратьНулиЦикломДля(Номер);            4
К = 300 000
Функция, время (сек)
Строка = УбратьНулиРекурсией(Номер);            16
Строка = УбратьНулиЦикломПока(Номер);            8
Строка = УбратьНулиФорматом(Номер);            9
Строка = УбратьНулиФорматом2(Номер);            7
Строка = УбратьНулиМассивНенужного(Номер);            16
Строка = УбратьНулиЦикломДля(Номер);            12
Показать
23. miniogn 23 09.07.14 13:15 Сейчас в теме
Вот такая функция быстрее других работает, не универсально конечно
Функция УбратьНулиЗаменой(НомерСтрокой) // Для Номер длиной 12
	
	Возврат СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить(
	СтрЗаменить("=" + НомерСтрокой,
	"=000000000000","0"),
	"=00000000000",""),
	"=0000000000",""),
	"=000000000",""),
	"=00000000",""),
	"=0000000",""),
	"=000000",""),
	"=00000",""),
	"=0000",""),
	"=000",""),
	"=00",""),
	"=0",""),
	"=","");
	
КонецФункции
Показать


К = 400 000
Функция, время (сек)
Строка = УбратьНулиРекурсией(Номер);            9
Строка = УбратьНулиЦикломПока(Номер);            5
Строка = УбратьНулиФорматом(Номер);            7
Строка = УбратьНулиФорматом2(Номер);            5
Строка = УбратьНулиМассивНенужного(Номер);            8
Строка = УбратьНулиЦикломДля(Номер);            5
Строка = УбратьНулиЗаменой(Номер);            3
Показать
Pipapalamm; +1 Ответить
24. ITEkb 19.08.15 12:04 Сейчас в теме
Если есть строка дата время. И во времени нет лидирующих нулей. Это только подстановкой через функцию?
26. kot30688 3 20.08.15 11:04 Сейчас в теме
А такой вариант Строка(Число(Значение))?
28. ditp 91 20.08.15 11:24 Сейчас в теме
(26) kot30688, ничо так, если пробелы между триадами в больших числах устраивают.
31. kot26rus 03.03.16 12:37 Сейчас в теме
(28) ditp, там не совсем пробелы)
Результат = СтрЗаменить(Строка(Число(Номер)),Символы.НП,"");
32. m-serg74 46 03.03.16 12:40 Сейчас в теме
(31) kotloff, здесь все пишут чтоб СМ подзаработать? :)
Топик 2012 года...
33. kot26rus 03.03.16 12:43 Сейчас в теме
(32) m-serg74, конешно. жить-то надо)
34. DJDUH 17 03.03.16 12:45 Сейчас в теме
(32) m-serg74, скорее всего да!)
35. kot26rus 03.03.16 12:49 Сейчас в теме
(34) DJDUH, вообще-то это mailrum2004 некропостер, а я даже на даты и не посмотрел. каюсь.
27. Armando 1399 20.08.15 11:16 Сейчас в теме
Значение = "000001";
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
Число = ОписаниеТипаЧисло.ПривестиЗначение(Значение);
НовоеЗначение = Формат(Число, "ЧГ=0");
29. kot30688 3 20.08.15 12:53 Сейчас в теме
Ну, число можно и форматнуть же. Тут другая проблема, если вдруг значение содержит не только значение, например номер документа с префиксом.
30. mailrum2004 1 03.03.16 12:03 Сейчас в теме
	//убираем префикс и нули
	Пока Найти("123456789",Лев(номер,1)) = 0 Цикл
		Номер = Сред(Номер,2);	
	КонецЦикла;
whilefor; +1 Ответить
36. djolejek 15.06.16 00:46 Сейчас в теме
Функция УдалитьПовторяющиесяСимволы(Знач Строка, Знач Символ, Знач Режим = "Слева") Экспорт
	
	Если ВРег(Режим) = "СЛЕВА" Тогда
		
		Пока Лев(Строка, 1)= Символ Цикл
			
			Строка = Сред(Строка, 2);
			
		КонецЦикла;
		
	ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
		
		Пока Прав(Строка, 1)= Символ Цикл
			
			Строка = Лев(Строка, СтрДлина(Строка) - 1);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат Строка;
КонецФункции
Показать
37. brrart 26 22.07.16 16:56 Сейчас в теме
на СМ по большому счету пофиг ... но функция от miniogn помолга ... за что ему спасибо ...
38. Anchoret 60 15.09.16 17:34 Сейчас в теме
Видел еще такую функцию
ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(НомерОбъекта, Параметр2, Параметр3)
50. FesenkoA 57 12.03.18 13:01 Сейчас в теме
(38)
// Устарела. Следует использовать НомерНаПечать.
ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Номер, УдалитьПрефиксИнформационнойБазы, УдалитьПользовательскийПрефикс)
ranis888; Anchoret; +2 Ответить
39. ipoloskov 162 15.09.16 17:48 Сейчас в теме
Я тоже хочу заработать $m
Пока Лев(Номер, 1) = "0" Цикл 
    Номер = Прав(Номер, СтрДлина(Номер) - 1);
КонецЦикла;

не комильфо, потому что 1С будет в цикле копировать строку, а это медленно. Надо так:
Для к = 1 по СтрДлина(Номер) Цикл
   Если Сред(Номер, к, 1) <> "0" Тогда
      Номер = Сред(Номер, к);
      прервать;
   КонецЕсли;
КонецЦикла;
Светлый ум; +1 Ответить
42. mailrum2004 1 02.10.17 15:15 Сейчас в теме
(39)
будет в цикле копировать строку, а это медленно


Быстродействие в данной задаче не критично, но из спортивного интереса сделал следующий замер:
Функция НомерБезНулей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
43. spacecraft 02.10.17 16:26 Сейчас в теме
(42) не смотрел все варианты, может и был.
Но проще всего же:
Функция УбратьЛидирующиеНули(ЧислоСтрокой)
	Результат = "";
	ДлинаСтроки = СтрДлина(ЧислоСтрокой);
	Для к = 1 По ДлинаСтроки Цикл
		Если Сред(ЧислоСтрокой,к,1) <> "0" Тогда
			Результат = Прав(ЧислоСтрокой, ДлинаСтроки - к+1);
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;
КонецФункции
Показать
40. r-guliev 16.01.17 16:50 Сейчас в теме
Функция УбратьЛидирующиеНули(КодНоменклатуры)
	
	КодНоменклатурыДляОбработки = КодНоменклатуры;
	
	СимволКода = 0;
	
	Пока СимволКода = 0 Цикл
		
		КодНоменклатурыДляОбработки =  Прав(КодНоменклатурыДляОбработки, СтрДлина(КодНоменклатурыДляОбработки) - 1);
		
		
		СимволКода = Лев(КодНоменклатурыДляОбработки, 1);
		
		СимволКода = Число(СимволКода);
		
	КонецЦикла;
	
	КодНоменклатурыБезНуля = КодНоменклатурыДляОбработки;
	
    Возврат    КодНоменклатурыБезНуля;
	
КонецФункции 
Показать
41. fixin 4252 14.06.17 17:04 Сейчас в теме
Функция УбратьЛидирующиеНули(Строка) Экспорт
	
	Для сч = 0 по СтрДлина(Строка) Цикл
		
		Если НЕ Сред(Строка,Сч, 1) = "0" Тогда //Как только всретили не ноль, возвращаем хвостик
			Возврат Сред(Строка , Сч);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат "";
КонецФункции
Показать
adhocprog; +1 Ответить
45. Pixar0000 02.10.17 16:44 Сейчас в теме
Функция УбратьЛидирующиеНули(Код) Экспорт
    
    _Код = СтрЗаменить(Код, "УТ", "");
    
    Если Лев(_Код, 1) = "0" Тогда
        Возврат УбратьЛидирующиеНули(Прав(_Код, СтрДлина(_Код) - 1)); 
    Иначе
        Возврат _Код;
    КонецЕсли;
     
КонецФункции  
Показать
46. user612573_hi-zone 04.10.17 07:04 Сейчас в теме
Строка(Число("00000000000000120204")

результат: "120204"
48. kot26rus 12.10.17 09:42 Сейчас в теме
(46) а если там не только цифры?
47. THEBESTolo4b 10 04.10.17 07:08 Сейчас в теме
число преобразовать в формат строка
49. user612573_hi-zone 12.10.17 11:58 Сейчас в теме
у вас приведен пример именно с цифрами: значение "000001".

если там не только цифры, то все символы слева от произвольной позиции в этой строке можно считать лидирующими и задача сводится к тому, как найти эту позицию (гадать какие лидирующие символы в этой строке я не берусь ибо телепатическими способностями не обладаю), напишите пример
52. -AI- 27.02.20 11:11 Сейчас в теме
удаляет все лидирующие символы, в т.ч. префикс
Номер = Сред(Номер,СтрДлина(СтрРазделить(Номер,"123456789")[0])+1);

и да простят меня местные обитатели за некропост
53. elite 09.09.22 05:09 Сейчас в теме
(52) Молодец.
Номер = Сред(Номер,СтрДлина(СтрРазделить(Номер,"123456789")[0])+1);
Самый быстрый вариант. Отлично убирает и префикс, если он не из цифр.
54. FirstSlayer 18.11.22 11:51 Сейчас в теме
В запросе если код "000000100"
Получит "100"

| СТРЗАМЕНИТЬ(СОКРЛ(СТРЗАМЕНИТЬ(Т.Код, ""0"", "" "")), "" "", ""0"") КАК Код,
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)