|
Как убрать слева в коде все нули | ☑ | ||
---|---|---|---|---|
0
sidalexsandr
30.05.18
✎
12:40
|
Подскажите алгоритм как убрать у кода слева все нули?
|
|||
1
Boleev
30.05.18
✎
12:42
|
Если в коде только числа, то привести к числу через формат
|
|||
2
Малыш Джон
30.05.18
✎
12:43
|
СтрЗаменить(СокрЛ(СтрЗаменить(ТвойКод, "0", " "))," ","0")
|
|||
3
aka AMIGO
30.05.18
✎
12:44
|
(0) Код - тип строка? замени на тип "Число"
А вдруг поможет :) |
|||
4
МихаилМ
30.05.18
✎
12:44
|
||||
5
bolobol
30.05.18
✎
12:51
|
А просто Число(СтрокаЛидированнаяНулями) - не прокатит?
|
|||
6
Stepankov Sergei
30.05.18
✎
12:53
|
Пока Лев(Код,1) = "0" Цикл
Код = Сред(Код,2); КонецЦикла; |
|||
7
_stay true_
30.05.18
✎
12:53
|
Есть в типовых общий модуль ПрефиксацияОбъектовКлиентСервер. Там уже есть готовая процедура.
|
|||
8
Lexey_
30.05.18
✎
12:54
|
(5) неа, неразрывный пробел
|
|||
9
bolobol
30.05.18
✎
12:55
|
(8) Откуда в коде пробелы?
|
|||
10
bolobol
30.05.18
✎
12:55
|
"000 000 002" ?
|
|||
11
mistеr
30.05.18
✎
12:59
|
(9) Из Экселя или из таб дока, отукда же еще.
|
|||
12
Stepankov Sergei
30.05.18
✎
13:00
|
(9) Если код больше 999 то поставит неразрывный пробел.
Например "001003" в число и обратно в строку - "1 003" Можно исправить с помощью СТрЗаменить(Строка,Символы.НПП,""). Должно получиться. |
|||
13
sidalexsandr
30.05.18
✎
13:05
|
Спасибо, помогло:
СимволовВСтроке = СтрДлина(ИскомаяСтрока); КодНуля = 48;// это для контроля Строка 0 и число О тракутются при сравнении по разному, но код символа у них один ПозицияНеНуля = 1; Для НомерСимвола = 1 По СимволовВСтроке Цикл ПроверяемыйСимвол = Сред(ИскомаяСтрока, НомерСимвола,1); Если КодСимвола(ПроверяемыйСимвол) <> 48 Тогда ПозицияНеНуля = НомерСимвола; Прервать; КонецЕсли; КонецЦикла; СтрокаБезВедущихнулей = Сред(ИскомаяСтрока, ПозицияНеНуля); |
|||
14
Малыш Джон
30.05.18
✎
13:05
|
(12) :))
Формат ( , "ЧГ=0") не предлагать?)) |
|||
15
Nikoss
30.05.18
✎
13:07
|
(13), что-то выбрал самый объемный код из всех возможных
|
|||
16
Segate
31.05.18
✎
09:41
|
(12)
Стр = Строка(ЧислоСЛидирующимиНулями); Пока Лев(Стр,1) = "0" цикл Стр = сред(стр,2); Конеццикла; Возврат стр; почему не так? |
|||
17
Segate
31.05.18
✎
09:43
|
(16) или в конце концов(если у тебя всегда число в строке)
Стр = Формат(Число(Стр),"ЧГ=0"); Тоже должно сработать |
|||
18
Segate
31.05.18
✎
09:46
|
Массив = стрРазделить(Стр,"0", ложь);
Стр = Сред(Стр,Стрнайти(Стр,Массив[0])); Или вот так например тоже должно сработать, но тут не уверен... |
|||
19
unregistered
31.05.18
✎
09:49
|
Есть же в типовых конфигурациях:
НомерБезВедущихНулей = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(НомерСНулями, "0"); |
|||
20
Пес Барбос
31.05.18
✎
09:51
|
// -- из типовой
// Удаляет лидирующие нули из номера объекта. // Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ХХХ...ХХ или ГГ-ХХХ...ХХ, где. // ОО - префикс организации; // ГГ - префикс информационной базы; // "-" - разделитель; // ХХХ...ХХ - номер/код объекта. // // Параметры: // НомерОбъекта - Строка - номер или код объекта из которого требуется лидирующие нули. // Функция УдалитьЛидирующиеНулиИзНомераОбъекта(Знач НомерОбъекта) Экспорт ПользовательскийПрефикс = ПользовательскийПрефикс(НомерОбъекта); Если НомерСодержитСтандартныйПрефикс(НомерОбъекта) Тогда Если НомерСодержитПятизначныйПрефикс(НомерОбъекта) Тогда Префикс = Лев(НомерОбъекта, 5); Номер = Сред(НомерОбъекта, 6 + СтрДлина(ПользовательскийПрефикс)); Иначе Префикс = Лев(НомерОбъекта, 3); Номер = Сред(НомерОбъекта, 4 + СтрДлина(ПользовательскийПрефикс)); КонецЕсли; Иначе Префикс = ""; Номер = Сред(НомерОбъекта, 1 + СтрДлина(ПользовательскийПрефикс)); КонецЕсли; // Удаляем лидирующие нули слева в номере. Номер = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(Номер, "0"); Возврат Префикс + ПользовательскийПрефикс + Номер; КонецФункции |
|||
21
Segate
31.05.18
✎
09:52
|
(20) а ты в курсе, что саму процедуру удаления нулей ты так и не показал? )))
|
|||
22
unregistered
31.05.18
✎
09:55
|
(21) А зачем?
Всё уже написано до нас. Для чего нужен еще один велосипед? |
|||
23
Timon1405
31.05.18
✎
09:59
|
Номер ="00000000010530";
БезНулей= СтрЗаменить(СокрЛ(СтрЗаменить(Номер,0," "))," ",0); |
|||
24
Cool_Profi
31.05.18
✎
10:00
|
(23) А просто Число("00000000010530") Что тебе даст?
|
|||
25
Timon1405
31.05.18
✎
10:02
|
(24) Число, а нужна строка)
|
|||
26
Cool_Profi
31.05.18
✎
10:03
|
(25) Продам описание функции Формат(), очень дорого.
|
|||
27
Segate
31.05.18
✎
10:03
|
(24) Выдаст ошибку очевидно же
|
|||
28
Вася Теркин
31.05.18
✎
10:23
|
Формат убирает неразрывный пробел на счет раз
|
|||
29
Cool_Profi
31.05.18
✎
10:30
|
||||
30
bolobol
31.05.18
✎
10:31
|
(28) Формат что-то убирает?... Мдя
|
|||
31
2S
31.05.18
✎
10:31
|
(25) в число, потом в строку
|
|||
32
Малыш Джон
31.05.18
✎
10:39
|
(30) убирает) даже больше скажу - меняет до неузнаваемости))
|
|||
33
Segate
31.05.18
✎
10:40
|
(29) Хорошо вот тебе код: "000000027корр1"
Вполне себе такой валидный код, почему нет... давай как покажи мне скриншот результата? |
|||
34
Cool_Profi
31.05.18
✎
10:47
|
(33) Подтасовка. В изначальной постановке такого не было.
|
|||
35
Segate
31.05.18
✎
11:04
|
(34) В (0) написано: "Подскажите алгоритм как убрать у кода слева все нули?" ничего про число нет
|
|||
36
Вася Теркин
31.05.18
✎
11:05
|
(32) Я бы сказал меняет до узнаваемости
|
|||
37
StanLee
31.05.18
✎
11:09
|
(0) следующим будет вопрос "как сделать свой механизм автонумерации"? )))
|
|||
38
bolobol
31.05.18
✎
11:09
|
(32) Да неужто! А можно пруф?
|
|||
39
Вася Теркин
31.05.18
✎
11:10
|
(37) В смысле? Частное ГАИ как зарегистрировать?
|
|||
40
bolobol
31.05.18
✎
11:14
|
(35) Тогда
й= 1; Пока СтрокаКодаЛидированнаяНулями[й] = "0" Цикл й= й+1; КонецЦикла; СтрокаКодаЛидированнаяНулями= Сред(СтрокаКодаЛидированнаяНулями, й); |
|||
41
НЕА123
31.05.18
✎
11:16
|
(23)+1
|
|||
42
1Сергей
31.05.18
✎
11:18
|
(41) там НПП не учитан
|
|||
43
1Сергей
31.05.18
✎
11:18
|
а вообще, делать вам нечего
|
|||
44
Малыш Джон
31.05.18
✎
11:21
|
(38) см. (14), (17)
|
|||
45
bolobol
31.05.18
✎
11:23
|
(44) Я пруф просил, что формат удаляет НПП. Или что-то меняет, кроме того, что по СП делает - создаёт строку определённого вида.
|
|||
46
bolobol
31.05.18
✎
11:25
|
(41), (42) Там не учитана сама задача из (0), как обратил внимание (33)
|
|||
47
Малыш Джон
31.05.18
✎
11:25
|
(45) тебе стоит яснее выражать свои мысли. телепатов, как ты знаешь, на мисте нет
|
|||
48
bolobol
31.05.18
✎
11:26
|
(47) Я вашего совета не спрашивал. Спасибо.
|
|||
49
Timon1405
31.05.18
✎
11:26
|
(45) такой пруф подойдет?
https://its.1c.ru/db/metod8dev#content:2514:hdoc:_top |
|||
50
1Сергей
31.05.18
✎
11:27
|
(46) Человек из (0) уже давно всё решил в (13). А вы тут сопли размазываете :)
|
|||
51
Малыш Джон
31.05.18
✎
11:28
|
(48) не за что) но на будущее: ты же позволишь здесь на мисте без твоего разрешения писать?
|
|||
52
novichok79
31.05.18
✎
11:29
|
че вы сиськи мнете? все в типовых есть уже давно.
|
|||
53
bolobol
31.05.18
✎
11:40
|
(49) Там ничего про НПП нет. НПП может быть в строке, Формат преобразовывает строку?
Как написать "Сумма 1<НПП>520<НПП>руб." без НПП через формат? (51) Если не читая вопрос - то лучше держать при себе) |
|||
54
bolobol
31.05.18
✎
11:47
|
(52) Предлагаешь в какой-то типовой изучить километры кода вместо написания 3-х строк?
|
|||
55
НЕА123
31.05.18
✎
11:51
|
(42)
при чем НПП? в (23) нет типа число. |
|||
56
novichok79
31.05.18
✎
12:18
|
(54) разве там километры?
модуль ПрефиксацияОбъектовКлиентСервер // Удаляем лидирующие нули из номера объекта. НомерОбъекта = УдалитьЛидирующиеНулиИзНомераОбъекта(НомерОбъекта); // Удаляем префикс организации и префикс информационной базы из номера объекта. НомерОбъекта = УдалитьПрефиксыИзНомераОбъекта(НомерОбъекта, Истина, УдалитьПрефиксИнформационнойБазы); берем и пользуемся. если делать самому, то обычно хватает чего-то типа этого убираем нецифры Пока Найти("0123456789", Лев(НомерОбъекта, 1)) = 0 Цикл НомерОбъекта = Сред(НомерОбъекта, 2); КонецЦикла; а потом убираем нули слева Пока Лев(НомерОбъекта, 1) = "0" Цикл НомерОбъекта= Сред(НомерОбъекта, 2); КонецЦикла; |
|||
57
bolobol
31.05.18
✎
12:21
|
Даже этот пост оказалось читать дольше, чем написать все варианты кода из этой ветки. И, самое главное, зачем? Зачем это читать, если можно это написать
|
|||
58
Mr_Rm
31.05.18
✎
12:25
|
(13) вот это странное в комментарии:
// это для контроля Строка 0 и число О тракутются при сравнении по разному, но код символа у них один |
|||
59
novichok79
31.05.18
✎
12:44
|
(57) основную прибыль 1Снику приносит работа с типовыми, так что привыкайте к размеру кода в типовых, что еще могу сказать. фирма 1С принимает односторонние решения.
|
|||
60
Tateossian
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)); КонецЦикла КонецЦикла; СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(МассивПодстрок, ""); |
|||
61
novichok79
31.05.18
✎
12:48
|
(60) ну да, давайте лепить на каждую мелочь вызов COMОбъекта + такой код неработоспособен не в Windows или есть сервак на Linux'е.
|
|||
62
Tateossian
31.05.18
✎
12:49
|
(61) Этот код в 24 раза быстрее типовой работает.
|
|||
63
Tateossian
31.05.18
✎
12:50
|
(61) Для линухи тоже можно написать без проблем, но будем откровенны - 1С под линухой стоит у 0,005% всех пользоателей.
|
|||
64
Tateossian
31.05.18
✎
12:50
|
(61) И быстрее вот этого (56)
|
|||
65
novichok79
31.05.18
✎
12:51
|
(62) а вот это интересно. вообще хорошо бы если бы 1С запилил поддержку RegExp в 1С.
(63) вот недавно у меня как раз был такой случай. (64) ну вообще шикарно. |
|||
66
Timon1405
31.05.18
✎
14:06
|
(60) если уж речь за регулярки,
Шаблон = "^0+(.+)"; RegExp.Pattern = Шаблон; Номер2= RegExp.Replace(Номер,"$1"); |
|||
67
bolobol
31.05.18
✎
14:23
|
(66) Стрелять надо за подобную китайскую грамоту в таких задачах. А других - в 1С и нет.
Станет код "Х00000000209/кр117", и как дорабатывать, чтоб "Х" тоже убирал? А я отвечу - стереть нахрен это варварство и вписать добрый, понятный и уютный овно-код |
|||
68
Timon1405
31.05.18
✎
14:30
|
(67) зато четко по ТЗ в заголовке)
все способы решения давно известны, это лишь еще один, не претендующий на универсальность, а лишь на изящество. может быть кто-то откроет для себя replace, уже хорошо |
|||
69
kittystark
31.05.18
✎
14:35
|
(66) "^0+" заменять на ""
|
|||
70
bolobol
31.05.18
✎
14:38
|
(68) Согласен! Но без комментариев, этот код - трэш, не более.
|
|||
71
kittystark
31.05.18
✎
14:41
|
(67),(70) поддержу всех кто использует регулярки - если знаешь их, то жить порой становится гораздо проще, чем писать простыню овно-кода
и никакой это не треш, а комментировать - да! надо! |
|||
72
bolobol
31.05.18
✎
14:54
|
(71) Простыни написаны в 1С, которые кто-то выше предлагал найти и ж0стко заюзать. У нас код - три строки. В (66) - тоже 3 строки, но без обфускатора, дешифратора и хард-хасп-старфорс-а - не разобраться.
Тема сисек не раскрыта, щетаю. |
|||
73
kittystark
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"); // Меняем все пробелы обратно на нули |
|||
76
bolobol
31.05.18
✎
16:34
|
Там забыто, что пробелы изначально должны быть тоже заменены на нечто оригинальное, иначе - код, содержащий пробел, будет испорчен
|
|||
77
mistеr
31.05.18
✎
18:32
|
Ну что, ВК никто не запилит? Слабовато что-то, на регэкспах остановились...
|
|||
78
Dmitry1c
22.06.18
✎
13:18
|
ап
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |