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

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 499 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 222 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 4253 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"") КАК Код,
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот