|
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С-ку )
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |