Имя: Пароль:
1C
1С v8
v8: Цикл удаления из строки крайнего определенного символа.
,
0 ProProg
 
23.03.12
15:05
Например нужно из строки удалить все крайние нули, но только крайние. не в середине и т.д.
Например

003568000 должно выйти 3568
И так во всех вариациях нулей слева и справа.

Но не так чтобы тупо код дублировать.

Красивой процедуркой в цикле.
3 Amra
 
23.03.12
15:07
(2) Тогда и у себя сам нули убирай))
5 H A D G E H O G s
 
23.03.12
15:08
Текст=СтрЗаменить(Текст," ","?");
Текст=СтрЗаменить(Текст,"0"," ");
Текст=СокрЛП(Текст);
Текст=СтрЗаменить(Текст,"?"," ");
6 H A D G E H O G s
 
23.03.12
15:08
? - это #255
7 Rovan
 
гуру
23.03.12
15:08
(0) см. Сред(), Лев(), Прав()
8 H A D G E H O G s
 
23.03.12
15:09
Кривокодировочный форум, блдж.
9 ShoGUN
 
23.03.12
15:09
(5) В середине нули разве не прибьешь?
10 Amra
 
23.03.12
15:09
(5) Садись, кол)
11 ProProg
 
23.03.12
15:10
(5) убьешь нули между цифрами.
12 Grobik
 
23.03.12
15:11
Номер  = СокрЛП(Номер);
Пока Лев(Номер, 1)="0" Цикл
 НомерГотов=Сред(Номер, 2);
КонецЦикла;
Номер  = НомерГотов;
Пока Прав(Номер, 1)="0" Цикл
 НомерГотов=Сред(Номер, 2);
КонецЦикла;

;)
13 ShoGUN
 
23.03.12
15:12
(12) Первое, что в голову приходит. Тупо, но действенно.
14 H A D G E H O G s
 
23.03.12
15:13
Забыл

Текст="01101 10";
Текст=СтрЗаменить(Текст," ","?");
Текст="01101?10";
Текст=СтрЗаменить(Текст,"0"," ");
Текст=" 11 1?1 ";
Текст=СокрЛП(Текст);
Текст="11 1?1";
Текст=СтрЗаменить(Текст," ","0");
Текст="1101?1";
Текст=СтрЗаменить(Текст,"?","");
Текст="1101 1";
15 ptiz
 
23.03.12
15:13
(5) - самая правильная идея
16 H A D G E H O G s
 
23.03.12
15:13
Текст=СтрЗаменить(Текст," ","?");
Текст=СтрЗаменить(Текст,"0"," ");
Текст=СокрЛП(Текст);
Текст=СтрЗаменить(Текст," ","0");
Текст=СтрЗаменить(Текст,"?","");
17 zak555
 
23.03.12
15:14
(0) самому никак не сообразить ?
18 Ненавижу 1С
 
гуру
23.03.12
15:15
(0) программист ))
19 H A D G E H O G s
 
23.03.12
15:15
(0) Мы ведь не Professional Programmist-s, мы так, по старинке.
20 ProProg
 
23.03.12
15:15
СтрокаПередачи = СокрЛП(СтрокаПередачи);
   ВремСтрока  = СтрокаПередачи;
   ДлинаСтроки = СтрДлина(СтрокаПередачи);
   Пока 1 = 1 Цикл
       Если Лев(ВремСтрока,1) = "0" Тогда
           ВремСтрока = Прав(ВремСтрока,ДлинаСтроки - 1);
           ДлинаСтроки = ДлинаСтроки - 1;
       Иначе
           Прервать;
       КонецЕсли;
   КонецЦикла;
21 ProProg
 
23.03.12
15:15
Это только для левых
22 Amra
 
23.03.12
15:15
(15) И тебе кол.
23 ShoGUN
 
23.03.12
15:15
(15) Идея правильная в (5), а реализация - в (16)
24 ProProg
 
23.03.12
15:15
два цикла короче решают проблему
25 ProProg
 
23.03.12
15:17
(16) да все верно! кросавец!
26 ShoGUN
 
23.03.12
15:17
(24) В 16 нормальное решение. Вместо символа с кодом 255 можно любой спецсимвол подставлять, которого точно в номерах нету.
27 Ненавижу 1С
 
гуру
23.03.12
15:18
(20) смотри, а то твоя разработку сопрут ))
28 vasilii85
 
23.03.12
15:19
(0)Автор еще тот программист ))))))
29 ProProg
 
23.03.12
15:19
тока убьет и пробелы если они есть. и нужны будут. надо другой какой нить символ вставить который сто пудов не будет попадаться.
30 H A D G E H O G s
 
23.03.12
15:21
Управляющие символы с кодом <32
Символ (11) к прмиеру
31 Ненавижу 1С
 
гуру
23.03.12
15:25
циклом

ДлинаСтроки = СтрДлина(СтрокаПередачи);
Начало = 0;
Конец = 0;
Для й=1 по ДлинаСтроки Цикл
 Если Сред(СтрокаПередачи,й)<>"0" Тогда
   Если Начало=0 Тогда
     Начало = й;
   КонецЕсли;
   Конец = й;
 КонецЕсли;  
КонецЦикла;
Результат = Сред(СтрокаПередачи,Начало,Конец-Начало+1);
32 Reset
 
23.03.12
15:28
(26)
Текст=" 01";
Текст=СтрЗаменить(Текст," ","?");
Текст=СтрЗаменить(Текст,"0"," ");
Текст=СокрЛП(Текст);
Текст=СтрЗаменить(Текст," ","0");
Текст=СтрЗаменить(Текст,"?","");
Сообщить(Текст);
33 Reset
 
23.03.12
15:29
+ выводит 01
34 H A D G E H O G s
 
23.03.12
15:30
(32) Частный случай, см. условие задачи.
35 ProProg
 
23.03.12
15:32
(32) крайние пробелы надо сразу прибивать
36 zak555
 
23.03.12
15:33
(31) самый быстрый будет
37 Grobik
 
23.03.12
15:33
Процедура КнопкаСформироватьНажатие(Кнопка)
   Номер  = СокрЛП(Реквизит1);
Пока Лев(Номер, 1)="0" Цикл
 Номер=Сред(Номер, 2);
КонецЦикла;
Пока Прав(Номер, 1)="0" Цикл
   Длинн=СтрДлина(Номер);
   Номер=Лев(Номер, Длинн-1);
КонецЦикла;
Реквизит2=Номер;
КонецПроцедуры
38 Grobik
 
23.03.12
15:34
работает
39 zak555
 
23.03.12
15:37
(37) два цикла - это много
40 ansh15
 
23.03.12
15:48
(0) Я, конечно, прошу извинить, что влезаю не в свою епархию(про 1С программирование не знаю ничего), но не может ли помочь в данном случае вот такое регулярное выражение:
^0*([0-9]+?)0*$  ?
То,что в скобках, идет в результат. И циклов никаких не надо.
41 Reset
 
23.03.12
15:49
(34)
Или
Текст="0 01"; ==> "01"  (ты же рассматривал подобный пример в (14) )

В условиях (кхм.. условиях... пара общих фраз) не сказано, есть там пробелы или нет.
Если есть, то код косячит. Если заведомо нет, то лишняя операция с подменой на служебный символ, т.е. достаточно:

Текст=СтрЗаменить(Текст,"0"," ");
Текст=СокрЛП(Текст);
Текст=СтрЗаменить(Текст," ","0");
42 ProProg
 
23.03.12
15:55
(41) ага. и если был пробел в середине влепит ноль в него.
43 Reset
 
23.03.12
15:56
(42) Учу читать ;)
"Если заведомо нет" ;)
44 kiruha
 
23.03.12
16:01
Присоединюсь - оптимально (31)

Все остальные функции также просматривают строку    но могут неявно
45 Tatitutu
 
23.03.12
16:18
Функция КнопкаВыполнитьНажатие(ПроверяемоеЗначение)
   НовыйКод=(Число(ПроверяемоеЗначение));
   АвдругНоль=НовыйКод;
   АвдругНоль=АвдругНоль/10;
   Пока Цел(АвдругНоль)=АвдругНоль  Цикл        
        АвдругНоль=АвдругНоль/10;  
   КонецЦикла;
   НовыйКод=АвдругНоль*10;
   Возврат НовыйКод;
КонецФункции
46 Невский
 
23.03.12
16:23
(31) только последние нули удаляет
47 Grobik
 
23.03.12
16:24
(45)
00025200025200525000
25 200 025 200 525
пробелы забыл удалить
48 Невский
 
23.03.12
16:27
(45) Пока Цел(АвдругНоль)=АвдругНоль

Цикл Это прикол?
49 Grobik
 
23.03.12
16:28
(46) не только
(31) делает вообще непонятно что
50 Kreont
 
23.03.12
16:29
(0)Минимальный код:
Сообщить(1*Сред(1*ИсхСтрока/100000000000000000,3));
51 zak555
 
23.03.12
16:31
(46) задача из (0) так поставлена

(49) удаляет крайние нули
из
000006767640647670000000
получаем

676764064767
52 Grobik
 
23.03.12
16:34
(51) на других цифрах проверь
(50) "100000000000000000" мало
0000025320001230001254000002562000000000
3 200 012 300 012 540,00002562
53 Невский
 
23.03.12
16:34
(51) (31) у меня не удаляет, я не так копипастю?
54 Fragster
 
гуру
23.03.12
16:35
регулярка
^[0]*(.*?)[0]*$
55 Fragster
 
гуру
23.03.12
16:35
(54)+ в подсовпадении получаем то, что нужно
56 Kreont
 
23.03.12
16:36
(52) ну так добавь сколько надо :)
57 Невский
 
23.03.12
16:37
(50) а буквы в номере
58 Kreont
 
23.03.12
16:39
(57) в (0) нету букв, в (50) правильный код, у меня работает, => без циклов и переборов
59 Невский
 
23.03.12
16:39
Ваще ТС должен был предложить самую крутую реализацию, всеш таки оченьмноготысячбаксоф получает
60 Grobik
 
23.03.12
16:39
(52) Посмотрел "Начало" и "Конец" в отладчике. Посмеялся.
61 Fragster
 
гуру
23.03.12
16:39
(59) запросом?
62 Tatitutu
 
23.03.12
16:39
(48) почему ?

//без проверки на валидность числа
Процедура Нажатие(ПроверяемоеЗначение)
   АвдругНоль=(Число(ПроверяемоеЗначение));
   Проверка=АвдругНоль/10;
   Если Цел(Проверка)=Проверка Тогда        
        Нажатие(Проверка)  ;
    Иначе
        Сообщить(АвдругНоль);
   КонецЕсли;  
КонецПроцедуры
63 ProProg
 
23.03.12
16:40
(50) а как бе строка вообще не число а текст. там даже точки есть и прочей фигни довига!
64 ProProg
 
23.03.12
16:40
так что забудьте про деление)
65 ProProg
 
23.03.12
16:42
скобки, точки, звездочки и прочая пои...
Просто артикулы у цела заводские от Камаза. а там сам черт голову сломит.
В заводском есть нули де попало. А поставщики их то вбивают, то не вбивают, то местами меняют.
А в самом артикуле вся фигня.
66 Kreont
 
23.03.12
16:42
(63) Это тогда совсем другая задача, и в (0) формулируй правильно тогда
А то счас со всеми "ЕСЛИ" еще УПП напишем :)
67 Grobik
 
23.03.12
16:43
(51) Я понял почему у тебя (31) работает. Переменная у тебя числовая.
68 Ненавижу 1С
 
гуру
23.03.12
16:54
ну все очень смешно, опечатался в (31)
вместо: Сред(СтрокаПередачи,й)
надо: Сред(СтрокаПередачи,й,1)
69 Vakhrin
 
23.03.12
16:58
я тоже хочу! )

   Текст = "000234000043600000";
   Текст1 = Формат(Число(Текст), "ЧГ=");
   СимволФиниш = 0;
   Для инд = 0 По СтрДлина(Текст1) - 1 Цикл
       Если НЕ Сред(Текст1, СтрДлина(Текст1) - инд, 1) = "0" Тогда
           СимволФиниш = СтрДлина(Текст1) - инд;
           Прервать;
       КонецЕсли;
   КонецЦикла;
   Сообщить(Лев(Текст1, СимволФиниш));
70 Fragster
 
гуру
23.03.12
16:59
(65)->(54). всю фигню, которую с краев отрезать надо - вносишь в квадратные скобки
71 Grobik
 
23.03.12
17:01
Таки да (68)
(69) смотри 63-65

У меня наверно единственного 1с есть, чтоб проверить свою придумку.
72 zak555
 
23.03.12
17:06
(68) видимо (52) (53) (67) тоже опечатались =)
73 Vakhrin
 
23.03.12
17:07
(71) ага... я только по (0) ориентировался )
74 orefkov
 
23.03.12
17:12
скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
скрипт.language="JScript";
скрипт.AddCode("function doReplace(text){return text.replace(/^0+|0+$/gm, '')}");
номер = скрипт.CodeObject.doReplace(номер);
75 Ненавижу 1С
 
гуру
23.03.12
17:12
(72) может не тупо копипастили?
76 Tatitutu
 
23.03.12
17:31
Ну тогда еще проще



Процедура Нажатие(ПроверяемоеЗначение)
   АвдругНоль=СокрЛП(СтрЗаменить(ПроверяемоеЗначение,"0"," "));
   АвдругНоль=Число(СтрЗаменить(АвдругНоль,"_","0"));
   Сообщить(Формат(АвдругНоль, "ЧГ=")) ;
КонецПроцедуры
77 Tatitutu
 
23.03.12
17:34
опс- опечатка была лишний "_"

Процедура Нажатие(ПроверяемоеЗначение)
   АвдругНоль=СокрЛП(СтрЗаменить(ПроверяемоеЗначение,"0"," "));
   АвдругНоль=Число(СтрЗаменить(АвдругНоль," ","0"));
   Сообщить(Формат(АвдругНоль, "ЧГ=")) ;
КонецПроцедуры
78 andrewks
 
23.03.12
17:34
мдэ...
79 Grobik
 
23.03.12
17:36
Во первых пробел, во вторых Число.
80 Vakhrin
 
23.03.12
17:47
тогда так... сначала вырываем чисто циферные части: \d[0-9]*$|\d[0-9]*
потом к каждой из них применяем 74
усе ))
81 Grobik
 
23.03.12
17:50
Интересно сколько в (74) циклов  и не является ли на самом деле циклом СтрДлина коих три в (69).
82 Fragster
 
гуру
23.03.12
17:52
(80) фигня какая-то... \d+ это уже циферные части
83 Vakhrin
 
23.03.12
17:58
(82) о... а у меня не получилось с первого раза ))
84 hhhh
 
23.03.12
18:01
(29) Задача как-то криво поставлена. Например, если допустим строка "1 000 000". Что должно получиться в итоге?
85 Grobik
 
23.03.12
18:06
У меня получается "1 000" что есть правильно, т.к. ТС не говорил пробелы убирать.
86 zak555
 
23.03.12
21:43
кто нашёл ошибку в (31) + (68) ?
87 zak555
 
24.03.12
10:58
видимо никто не нашёл
88 zak555
 
24.03.12
10:58
ProProg , раз уж завёл такую ветку, точно не нашёл
89 МихаилМ
 
24.03.12
11:08
если извесно , что в строке только цифры

строку в число (сразу пропали лидирующие нули)

пока отаток от деления но 10 = 0
делим

полученное число -> в строку
90 zak555
 
24.03.12
11:09
(89) а если там пробелы ?
91 МихаилМ
 
24.03.12
11:12
(89)
пробел - не цифра
92 zak555
 
24.03.12
11:14
(91) тогда разделитель триад =)
93 Deon
 
24.03.12
11:33
(86) Не могу понять, в чем там ошибка. По-моему её там нет
94 zak555
 
24.03.12
11:36
(93) граничные ситуации :
0000
...
95 Deon
 
24.03.12
11:39
(94) А, точняк. Молодец )
96 Deon
 
24.03.12
11:49
Ну так какой способ-то лучше всех?
97 zak555
 
24.03.12
11:50
(96) в (31)
98 Deon
 
24.03.12
11:54
(97) А я вот протестировал (31) на строчечке всего-то в 1 млн симолов. Думает, я вам скажу, долговато...
99 zak555
 
24.03.12
11:55
(98) тестируй на 100 символах =)
100 Deon
 
24.03.12
11:56
(99) На 100 неинтересно, там без разницы какой алгоритм
101 Deon
 
24.03.12
12:03
Во, я родил:
   Начало = 1; Конец = СтрДлина(стр);
   Пока Истина Цикл
       Если Сред(стр,Начало,1)="0" Тогда
           начало = начало + 1;
       ИначеЕсли Сред(стр,Конец,1)="0" Тогда
           Конец = Конец - 1 ;
       Иначе
           Прервать;                                    
       КонецЕсли;
   КонецЦикла;
   Результат = Сред(стр,Начало, Конец-Начало+1);
102 Deon
 
24.03.12
12:04
(101) Плохо родил, можно повесить 1С-ку )