Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Как убрать слева в коде все нули

[Волшебник, 31.05.18 - 14:54]
Как убрать слева в коде все нули
Я
   sidalexsandr
 
30.05.18 - 12:40
Подскажите алгоритм как убрать у кода слева все нули?
 
 
   Boleev
 
1 - 30.05.18 - 12:42
Если в коде только числа, то привести к числу через формат
   Малыш Джон
 
2 - 30.05.18 - 12:43
СтрЗаменить(СокрЛ(СтрЗаменить(ТвойКод, "0", " "))," ","0")
   aka AMIGO
 
3 - 30.05.18 - 12:44
(0) Код - тип строка? замени на тип "Число"
А вдруг поможет :)
   МихаилМ
 
4 - 30.05.18 - 12:44
   bolobol
 
5 - 30.05.18 - 12:51
А просто Число(СтрокаЛидированнаяНулями) - не прокатит?
   StepankovSergei
 
6 - 30.05.18 - 12:53
Пока Лев(Код,1) = "0" Цикл
Код = Сред(Код,2);
КонецЦикла;
   _stay true_
 
7 - 30.05.18 - 12:53
Есть в типовых общий модуль ПрефиксацияОбъектовКлиентСервер. Там уже есть готовая процедура.
   Lexey_
 
8 - 30.05.18 - 12:54
(5) неа, неразрывный пробел
   bolobol
 
9 - 30.05.18 - 12:55
(8) Откуда в коде пробелы?
   bolobol
 
10 - 30.05.18 - 12:55
"000 000 002" ?
 
 Рекламное место пустует
   mistеr
 
11 - 30.05.18 - 12:59
(9) Из Экселя или из таб дока, отукда же еще.
   StepankovSergei
 
12 - 30.05.18 - 13:00
(9) Если код больше 999 то поставит неразрывный пробел.
Например "001003" в число и обратно в строку - "1 003"
Можно исправить с помощью СТрЗаменить(Строка,Символы.НПП,""). Должно получиться.
   sidalexsandr
 
13 - 30.05.18 - 13:05
Спасибо, помогло:
СимволовВСтроке = СтрДлина(ИскомаяСтрока);
КодНуля = 48// это для контроля Строка 0 и число О тракутются при сравнении по разному, но код символа у них один 

ПозицияНеНуля = 1;
Для НомерСимвола = 1 По СимволовВСтроке Цикл
    ПроверяемыйСимвол =  Сред(ИскомаяСтрока, НомерСимвола,1);
    Если КодСимвола(ПроверяемыйСимвол) <> 48 Тогда
         ПозицияНеНуля = НомерСимвола;
         Прервать;
    КонецЕсли; 
КонецЦикла;

СтрокаБезВедущихнулей = Сред(ИскомаяСтрока, ПозицияНеНуля);
   Малыш Джон
 
14 - 30.05.18 - 13:05
(12) :))
Формат (   , "ЧГ=0") не предлагать?))
   Nikoss
 
15 - 30.05.18 - 13:07
(13), что-то выбрал самый объемный код из всех возможных
   Segate
 
16 - 31.05.18 - 09:41
(12)
Стр = Строка(ЧислоСЛидирующимиНулями);
Пока Лев(Стр,1) = "0" цикл

Стр = сред(стр,2);
Конеццикла;

Возврат стр;

почему не так?
   Segate
 
17 - 31.05.18 - 09:43
(16) или в конце концов(если у тебя всегда число в строке)

Стр = Формат(Число(Стр),"ЧГ=0");

Тоже должно сработать
   Segate
 
18 - 31.05.18 - 09:46
Массив = стрРазделить(Стр,"0", ложь);
Стр = Сред(Стр,Стрнайти(Стр,Массив[0]));

Или вот так например тоже должно сработать, но тут не уверен...
   unregistered
 
19 - 31.05.18 - 09:49
Есть же в типовых конфигурациях:

 НомерБезВедущихНулей = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(НомерСНулями, "0");
   Пес Барбос
 
20 - 31.05.18 - 09:51
// -- из типовой

// Удаляет лидирующие нули из номера объекта.
// Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ХХХ...ХХ или ГГ-ХХХ...ХХ, где.

// ОО - префикс организации;
// ГГ - префикс информационной базы;

// "-" - разделитель;
// ХХХ...ХХ - номер/код объекта.

//
// Параметры:

//  НомерОбъекта - Строка - номер или код объекта из которого требуется лидирующие нули.
// 

Функция УдалитьЛидирующиеНулиИзНомераОбъекта(Знач НомерОбъекта) Экспорт
    
    ПользовательскийПрефикс = ПользовательскийПрефикс(НомерОбъекта);
    
    Если НомерСодержитСтандартныйПрефикс(НомерОбъекта) Тогда
        
        Если НомерСодержитПятизначныйПрефикс(НомерОбъекта) Тогда
            Префикс = Лев(НомерОбъекта, 5);
            Номер = Сред(НомерОбъекта, 6 + СтрДлина(ПользовательскийПрефикс));
        Иначе
            Префикс = Лев(НомерОбъекта, 3);
            Номер = Сред(НомерОбъекта, 4 + СтрДлина(ПользовательскийПрефикс));
        КонецЕсли;
        
    Иначе
        
        Префикс = "";
        Номер = Сред(НомерОбъекта, 1 + СтрДлина(ПользовательскийПрефикс));
        
    КонецЕсли;
    
    // Удаляем лидирующие нули слева в номере.

    Номер = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(Номер, "0");
    
    Возврат Префикс + ПользовательскийПрефикс + Номер;
КонецФункции
   Segate
 
21 - 31.05.18 - 09:52
(20) а ты в курсе, что саму процедуру удаления нулей ты так и не показал? )))
   unregistered
 
22 - 31.05.18 - 09:55
(21) А зачем?
Всё уже написано до нас. Для чего нужен еще один велосипед?
   Timon1405
 
23 - 31.05.18 - 09:59
Номер ="00000000010530";
БезНулей= СтрЗаменить(СокрЛ(СтрЗаменить(Номер,0," "))," ",0);
   Cool_Profi
 
24 - 31.05.18 - 10:00
(23) А просто Число("00000000010530") Что тебе даст?
   Timon1405
 
25 - 31.05.18 - 10:02
(24) Число, а нужна строка)
   Cool_Profi
 
26 - 31.05.18 - 10:03
(25) Продам описание функции Формат(), очень дорого.
   Segate
 
27 - 31.05.18 - 10:03
(24) Выдаст ошибку очевидно же
   Вася Теркин
 
28 - 31.05.18 - 10:23
Формат убирает неразрывный пробел на счет раз
   Cool_Profi
 
29 - 31.05.18 - 10:30
   bolobol
 
30 - 31.05.18 - 10:31
(28) Формат что-то убирает?... Мдя
   2S
 
31 - 31.05.18 - 10:31
(25) в число, потом в строку
   Малыш Джон
 
32 - 31.05.18 - 10:39
(30) убирает) даже больше скажу - меняет до неузнаваемости))
   Segate
 
33 - 31.05.18 - 10:40
(29) Хорошо вот тебе код: "000000027корр1"

Вполне себе такой валидный код, почему нет... давай как покажи мне скриншот результата?
 
 
   Cool_Profi
 
34 - 31.05.18 - 10:47
(33) Подтасовка. В изначальной постановке такого не было.
   Segate
 
35 - 31.05.18 - 11:04
(34) В (0) написано: "Подскажите алгоритм как убрать у кода слева все нули?" ничего про число нет
   Вася Теркин
 
36 - 31.05.18 - 11:05
(32) Я бы сказал меняет до узнаваемости
   StanLee
 
37 - 31.05.18 - 11:09
(0) следующим будет вопрос "как сделать свой механизм автонумерации"? )))
   bolobol
 
38 - 31.05.18 - 11:09
(32) Да неужто! А можно пруф?
   Вася Теркин
 
39 - 31.05.18 - 11:10
(37) В смысле? Частное ГАИ как зарегистрировать?
   bolobol
 
40 - 31.05.18 - 11:14
(35) Тогда
й= 1;
Пока СтрокаКодаЛидированнаяНулями[й] = "0" Цикл
й= й+1;
КонецЦикла;
СтрокаКодаЛидированнаяНулями= Сред(СтрокаКодаЛидированнаяНулями, й);
   НЕА123
 
41 - 31.05.18 - 11:16
(23)+1
   1Сергей
 
42 - 31.05.18 - 11:18
(41) там НПП не учитан
   1Сергей
 
43 - 31.05.18 - 11:18
а вообще, делать вам нечего
   Малыш Джон
 
44 - 31.05.18 - 11:21
(38) см. (14), (17)
   bolobol
 
45 - 31.05.18 - 11:23
(44) Я пруф просил, что формат удаляет НПП. Или что-то меняет, кроме того, что по СП делает - создаёт строку определённого вида.
   bolobol
 
46 - 31.05.18 - 11:25
(41), (42) Там не учитана сама задача из (0), как обратил внимание (33)
   Малыш Джон
 
47 - 31.05.18 - 11:25
(45) тебе стоит яснее выражать свои мысли. телепатов, как ты знаешь, на мисте нет
   bolobol
 
48 - 31.05.18 - 11:26
(47) Я вашего совета не спрашивал. Спасибо.
   Timon1405
 
49 - 31.05.18 - 11:26
(45) такой пруф подойдет?
https://its.1c.ru/db/metod8dev#content:2514:hdoc:_top
 
 Рекламное место пустует
   1Сергей
 
50 - 31.05.18 - 11:27
(46) Человек из (0) уже давно всё решил в (13). А вы тут сопли размазываете :)
   Малыш Джон
 
51 - 31.05.18 - 11:28
(48) не за что) но на будущее: ты же позволишь здесь на мисте без твоего разрешения писать?
   novichok79
 
52 - 31.05.18 - 11:29
че вы сиськи мнете? все в типовых есть уже давно.
   bolobol
 
53 - 31.05.18 - 11:40
(49) Там ничего про НПП нет. НПП может быть в строке, Формат преобразовывает строку?
Как написать "Сумма 1<НПП>520<НПП>руб." без НПП через формат?

(51) Если не читая вопрос - то лучше держать при себе)
   bolobol
 
54 - 31.05.18 - 11:47
(52) Предлагаешь в какой-то типовой изучить километры кода вместо написания 3-х строк?
   НЕА123
 
55 - 31.05.18 - 11:51
(42)
при чем НПП?
в (23) нет типа число.
   novichok79
 
56 - 31.05.18 - 12:18
(54) разве там километры?
модуль ПрефиксацияОбъектовКлиентСервер
    
    // Удаляем лидирующие нули из номера объекта.

    НомерОбъекта = УдалитьЛидирующиеНулиИзНомераОбъекта(НомерОбъекта);
    
    // Удаляем префикс организации и префикс информационной базы из номера объекта.

    НомерОбъекта = УдалитьПрефиксыИзНомераОбъекта(НомерОбъекта, Истина, УдалитьПрефиксИнформационнойБазы);
    
берем и пользуемся.
если делать самому, то обычно хватает чего-то типа этого

убираем нецифры

Пока Найти("0123456789", Лев(НомерОбъекта, 1)) = 0 Цикл
    НомерОбъекта = Сред(НомерОбъекта, 2);
КонецЦикла;

а потом убираем нули слева

Пока Лев(НомерОбъекта, 1) = "0" Цикл
    НомерОбъекта= Сред(НомерОбъекта, 2);
КонецЦикла;
   bolobol
 
57 - 31.05.18 - 12:21
Даже этот пост оказалось читать дольше, чем написать все варианты кода из этой ветки. И, самое главное, зачем? Зачем это читать, если можно это написать
   Mr_Rm
 
58 - 31.05.18 - 12:25
(13) вот это странное в комментарии:
// это для контроля Строка 0 и число О тракутются при сравнении по разному, но код символа у них один
   novichok79
 
59 - 31.05.18 - 12:44
(57) основную прибыль 1Снику приносит работа с типовыми, так что привыкайте к размеру кода в типовых, что еще могу сказать. фирма 1С принимает односторонние решения.
   Tateossian
 
60 - 31.05.18 - 12:47
Пользуй на здоровье.

RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Multiline = Истина;
    RegExp.IgnoreCase = Истина;
    RegExp.Global = Истина;
    


    Шаблон = "([1-9]+\d*)([\/]?\d?)$";

    RegExp.Pattern = Шаблон;
    Варианты = RegExp.Execute(Номер);
    
    А = Варианты.Count-1;
    
    МассивПодстрок = Новый Массив;

    Для i=0 По Варианты.Count-1 Цикл
        Токены = Варианты.Item(i);
        Для j=0 По Токены.Submatches.Count-1 Цикл
            МассивПодстрок.Добавить(Токены.Submatches.Item(j));
        КонецЦикла
    КонецЦикла;    
    
    СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(МассивПодстрок, "");
   novichok79
 
61 - 31.05.18 - 12:48
(60) ну да, давайте лепить на каждую мелочь вызов COMОбъекта + такой код неработоспособен не в Windows или есть сервак на Linux'е.
   Tateossian
 
62 - 31.05.18 - 12:49
(61) Этот код в 24 раза быстрее типовой работает.
   Tateossian
 
63 - 31.05.18 - 12:50
(61) Для линухи тоже можно написать без проблем, но будем откровенны - 1С под линухой стоит у 0,005% всех пользоателей.
   Tateossian
 
64 - 31.05.18 - 12:50
(61) И быстрее вот этого (56)
   novichok79
 
65 - 31.05.18 - 12:51
(62) а вот это интересно. вообще хорошо бы если бы 1С запилил поддержку RegExp в 1С.
(63) вот недавно у меня как раз был такой случай.
(64) ну вообще шикарно.
   Timon1405
 
66 - 31.05.18 - 14:06
(60) если уж речь за регулярки, 
Шаблон = "^0+(.+)";
RegExp.Pattern = Шаблон;
Номер2= RegExp.Replace(Номер,"$1");
   bolobol
 
67 - 31.05.18 - 14:23
(66) Стрелять надо за подобную китайскую грамоту в таких задачах. А других - в 1С и нет.
Станет код "Х00000000209/кр117", и как дорабатывать, чтоб "Х" тоже убирал? А я отвечу - стереть нахрен это варварство и вписать добрый, понятный и уютный овно-код
   Timon1405
 
68 - 31.05.18 - 14:30
(67) зато четко по ТЗ в заголовке)
все способы решения давно известны, это лишь еще один, не претендующий на универсальность, а лишь на изящество. может быть кто-то откроет для себя replace, уже хорошо
   kittystark
 
69 - 31.05.18 - 14:35
(66) "^0+" заменять на ""
   bolobol
 
70 - 31.05.18 - 14:38
(68) Согласен! Но без комментариев, этот код - трэш, не более.
   kittystark
 
71 - 31.05.18 - 14:41
(67),(70) поддержу всех кто использует регулярки - если знаешь их, то жить порой становится гораздо проще, чем писать простыню овно-кода
и никакой это не треш, а комментировать - да! надо!
   bolobol
 
72 - 31.05.18 - 14:54
(71) Простыни написаны в 1С, которые кто-то выше предлагал найти и ж0стко заюзать. У нас код - три строки. В (66) - тоже 3 строки, но без обфускатора, дешифратора и хард-хасп-старфорс-а - не разобраться.
Тема сисек не раскрыта, щетаю.
   kittystark
 
73 - 31.05.18 - 15:12
(72) а я "щетаю" что если прог не знает регулярок ему же хуже...

просто я вспоминаю свои простыни кода с мильеном "если найти() тогда" и всякими там лев/прав/сред (и не важно где это было паскаль/делфи/си/эксель/1С ) везде кода много было

спустя годы, когда с регулярками освоился, понимаю какой же я тогда был... не важно кто :)  и понимаю, что те задачи решались бы гораздо быстрее и приятнее

могу сказать, что для себя вывел "постулат" - если речь идет о поиске и модификации строк - только регулярки, хотя СтрЗаменить() и Найти() тоже испульзую, не перегибая палку с регэкспами
короче: регэкспы рулят, пипл, учите эту матчасть! чтоб легче жилось
   Сияющий Асинхраль
 
74 - 31.05.18 - 15:51
(71) В пункте (2) весь код уместился в одну строку. Просто, походу, мало кто понимает как это работает, хотя, если разобраться, то код в (2) весьма даже красив...
   Сияющий Асинхраль
 
75 - 31.05.18 - 15:55
+(74) Хотя, если написать код в понятном виде, то тоже будет три строки, то бишь, вариант:

СтрЗаменить(СокрЛ(СтрЗаменить(ТвойКод, "0", " "))," ","0")

Можно записать так:

ТвойКод = СтрЗаменить(СокрЛП(ТвойКод), "0", " ");// меняем все нули на пробелы

ТвойКод = СокрЛ(ТвойКод);// Убираем все пробелы слева. Справа и в центре пробелы остаются

ТвойКод = СтрЗаменить(ТвойКод," ","0");// Меняем все пробелы обратно на нули
   bolobol
 
76 - 31.05.18 - 16:34
Там забыто, что пробелы изначально должны быть тоже заменены на нечто оригинальное, иначе - код, содержащий пробел, будет испорчен
   mistеr
 
77 - 31.05.18 - 18:32
Ну что, ВК никто не запилит? Слабовато что-то, на регэкспах остановились...
   Dmitry1c
 
78 - 22.06.18 - 13:18
ап


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует