Имя: Пароль:
1C
1C 7.7
v7: Первые буквы в словах сделать заглавными
0 Масянька
 
06.02.15
16:46
День добрый!
Есть нечто подобное в стандарте (порылась - не нашла): есть строка, в ней несколько слов (может быть и одно), слова разделены - пробел, точка, тире и т. д. (то есть не только пробелом) - все слова в строке сделать с большой буквы.
Заранее спасибо.
1 anatoly
 
06.02.15
16:49
несколько раз разложить строку в массив (с каждым разделителем).
сделать Врег на первый символ каждой подстроки и собрать обратно с разделителем.
повторить для каждого разделителя.
2 anatoly
 
06.02.15
16:50
ну и сначала наверное Нрег для всей строки, если заранее неизвестно какие символы, и требуется чтобы только первая буква большая.
3 Duke1C
 
06.02.15
16:52
(0) Откуда у вас такие задачи-то берутся? :))
Ща до магазина схожу, если не решишь самостоятельно подсоблю кодом
4 Масянька
 
06.02.15
16:54
(1) То есть стандарта нет?
(3) Ой! Я такая ... противная :)))
5 Абыр
 
06.02.15
16:56
кисло-сладкий - одно слово?)
6 Масянька
 
06.02.15
16:58
(5) Два. Должно получиться - Кисло-Сладкий.
7 Deon
 
06.02.15
16:58
(1) Я бы зашел не со стороны разделителей, а со стороны русских букв. Всё остальное можно считать разделителем.
8 Масянька
 
06.02.15
17:05
(7) Хорошая идея...
9 Ёпрст
 
06.02.15
17:05
регуляркой разбиваешь на слова и дальше всё просто
10 Deon
 
06.02.15
17:06
Кстати, а условие:
ВРег(Символ) = Нрег(Символ)
наверняка будет выдавать Истину только в случае небукв.
11 Ёпрст
 
06.02.15
17:06
можно и примитив - цикл по символу и Врег
12 Deon
 
06.02.15
17:07
Примитив быстрее com-регулярки
13 anatoly
 
06.02.15
17:10
(11) имхо кода будет больше чтобы ловить первый символ слова...
14 Гёдза
 
06.02.15
17:11
А в 8 есть )))
15 Масянька
 
06.02.15
17:11
(9) Какой "регуляркой"?
16 Масянька
 
06.02.15
17:12
(14) И что?
17 Ёпрст
 
06.02.15
17:12
(12) ну не знаю, не проверял,  для большого текста, не знаю... мерить надо :)
18 Ёпрст
 
06.02.15
17:13
(15) регулярными выражениями
19 Масянька
 
06.02.15
17:14
(18) Через разделитель?
20 Deon
 
06.02.15
17:15
(17) У меня в проведении документа было. Перепроведение замедлялось хорошо так.
21 Deon
 
06.02.15
17:15
(19) Делай циклом. Дольше будешь изучать регулярки
22 Масянька
 
06.02.15
17:20
(21) Мне очень нравится идея из (7). Кстати - спасибо :)
23 Deon
 
06.02.15
17:22
Пожалуйста
24 Duke1C
 
06.02.15
17:30
На вот на скорую руку:

ЭтоБуквы="абвгдеёжзийклмнопрстуфхцчшщьыъэюя";
    ДС=СтрДлина(МояСтрока);
    ГотоваяСтрока="";ПерваяБуква=0;
    Для Л=1 по ДС Цикл
        Символ=Сред(МояСтрока,Л,1);
        ПерваяБуква=?(Найти(ЭтоБуквы,Нрег(Символ))>0,ПерваяБуква+1,0);
        ГотоваяСтрока=ГотоваяСтрока+?(ПерваяБуква=1,Врег(Символ),Символ);
    КонецЦикла;
25 Kumar_K
 
06.02.15
17:30
БольшаяБ = 1;  
     строкаитог = "";
    стр = СОКРЛП(СТР1);
        Для а=1 По Стрдлина(Стр) Цикл    
            тексимв = Лев(стр,а)  ;
            тексимв = Прав(тексимв,1);
          
            Если а=1 Тогда
            тексимв =    Врег( тексимв);
                БольшаяБ = 0;
                КонецЕсли;
                  
            Если    БольшаяБ = 1 Тогда          
                тексимв =    Врег( тексимв);
                БольшаяБ = 0;
                КонецЕсли;    
        
                 Сообщить(КодСимв(тексимв));
                Если ((КодСимв(тексимв) > 96) и (КодСимв(тексимв) < 123) ) Тогда  
                Иначе
                    БольшаяБ = 1;
                    КонецЕсли;
                
            строкаитог = строкаитог + тексимв;
        
            КонецЦикла;
            Сообщить( строкаитог);


(КодСимв(тексимв) < 123) сами коды надо исправить
26 Kumar_K
 
06.02.15
17:31
(24) Одновременно
27 Duke1C
 
06.02.15
17:36
+ (24) Кстати, если нужно чтобы гарантировано заглавными были только первые буквы, то так:

ДС=СтрДлина(МояСтрока);
    ГотоваяСтрока="";ПерваяБуква=0;
    Для Л=1 по ДС Цикл
        Символ=Нрег(Сред(МояСтрока,Л,1));
        ПерваяБуква=?(Найти(ЭтоБуквы,Символ)>0,ПерваяБуква+1,0);
        ГотоваяСтрока=ГотоваяСтрока+?(ПерваяБуква=1,Врег(Символ),Символ);
    КонецЦикла;
28 Масянька
 
06.02.15
17:39
Спасибо пацаны!
Чмоки не будет - я свой ваяю :)
Все равно - спасибо!!!!
29 Duke1C
 
06.02.15
17:39
(26) Ничего личного, но я бы за такой код руки бы оторвал, хотя... работает не трожь :)))))

Особенно порадовало:

тексимв = Лев(стр,а)  ;
тексимв = Прав(тексимв,1);
30 Duke1C
 
06.02.15
17:42
(28) Ну наваяешь - поделись, так сказать для расширения нашего кругозора :)
31 Deon
 
06.02.15
17:46
Кто первым напишет решение в одну строку?
32 Duke1C
 
06.02.15
17:51
(31) Ну барин, тут помощник нужен :))))
33 Масянька
 
06.02.15
17:55
(30) Ага! Чтобы вы тут ... раскритиковали по полной программе?
34 Deon
 
06.02.15
17:57
(33) Чтобы мы порадовались и похвалили.
35 Масянька
 
06.02.15
18:00
Я не могу найти - по какой таблице эска коды берет?
"р" = 238
36 Deon
 
06.02.15
18:02
(35) Слющяй, зачэм тебе эти коды-шмоды. Держи супер-разработку:
ВРег(Символ)=НРег(Символ)
37 Duke1C
 
06.02.15
18:03
(33) см. (34)  + привели его к (31)
(35) *не претендуя на уникальность* - а мой вариант не пробовала? Глядишь и с кодами возиться не надо будет...
38 kosts
 
06.02.15
18:04

Функция ПервыеБуквыВСловахСделатьЗаглавными(ИсходнаяСтрока)
    ПервыйСимвол = Лев(ИсходнаяСтрока, 1);
    Если ПервыйСимвол = "" Тогда
        Возврат "";
    ИначеЕсли Не ЭтоБуква(ИсходнаяСтрока) Тогда
        Возврат ПервыйСимвол + Врег(Сред(ИсходнаяСтрока,2,1)) + ПервыеБуквыВСловахСделатьЗаглавными(Сред(ИсходнаяСтрока,3));
    Иначе
        Возврат ПервыйСимвол + ПервыеБуквыВСловахСделатьЗаглавными(Сред(ИсходнаяСтрока,2));
    КонецЕсли;
КонецФункции


Проверьте кто-нибудь, а то проверить негде. Первый символ не делается заглавным (если вообще это работает).
Не судите строго, сегодня пятница ))
39 Масянька
 
06.02.15
18:04
(36) Да видела я.
Попробую...
40 anatoly
 
06.02.15
18:05
(35) там коды для латиницы!
для кирилицы >128
41 Deon
 
06.02.15
18:05
(37) Я не знаю как 31 сделать. Наверно, никак. Ну, разве что, не пользоваться Enter'ом при написании кода.
42 Duke1C
 
06.02.15
18:06
+ (36) кстати, да - сам не пробовал, но раз человек говорит, значит что-то в этом есть...
43 Deon
 
06.02.15
18:06
(38) Рекурсия рулит. Зачёт. Хз работает или нет.
44 Deon
 
06.02.15
18:07
(42) Я тоже не пробовал, но выглядит забавно
45 Масянька
 
06.02.15
18:08
Всё... Голова квадратная... До понедельника...
Всем - спасибо и (уговорили) ЧМОКИ! :)))
46 Duke1C
 
06.02.15
18:08
Вау, как темка то развилась, уже и  с рекурсией примеры пошли...
Хотя то ли дело - пятница же :))))
47 kosts
 
06.02.15
18:08
(38) Эта строка такая должна быть


Возврат ПервыйСимвол + ПервыеБуквыВСловахСделатьЗаглавными(Врег(Сред(ИсходнаяСтрока,2,1)) + Сред(ИсходнаяСтрока,3));
48 Duke1C
 
06.02.15
18:14
+ (46)  Кстаааааааааааати а в нонешнем году пятничные темы отменились чтоль, а то с этими годовыми/квартальными что-то совсем не до этого было, а щас по поиску смотрю - последняя пятничная тема аж в начале января была, или меня уже глючит вместе с поиском???
49 Kumar_K
 
06.02.15
18:15
(29) Наоборот, критика даже очень хорошо

Чем, конкретно не понравилось
И чем убило
тексимв = Лев(стр,а)  ;
            тексимв = Прав(тексимв,1);


PS да, я студент и в жизни рабочего никогда ничего не делал.
Поэтому я за критику что б дров не навалять
50 anatoly
 
06.02.15
18:15
ОбщегоНазначения.СделатьПервыеБуквыВСловахЗаглавными()
)))
51 anatoly
 
06.02.15
18:15
(48) кризис - пятницы сократили.
52 Deon
 
06.02.15
18:16
(49) Просто есть функция Сред(), которой можно заметить 2 этих оператора
53 Kumar_K
 
06.02.15
18:16
(52) Знаешь, не знал спасибо.
54 Deon
 
06.02.15
18:21
(50) Кстати, есть функция:
СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов()
в частных случаях может помочь
55 Duke1C
 
06.02.15
19:16
(49) Ну это хорошо, что так воспринимаешь. Я уж опосля нажатия Ctrl+Enter подумал - а не погорячился ли я?
Значит нет :)))
P.S. Все мы когда-то студентами были - это нормально, тем более профессионализм это такая штука, что чем больше ты познаешь, чем чаще тебе кажется, что ты нихрена не знаешь :)))
56 Масянька
 
09.02.15
09:43
Давайте - критикуйте :(

    ДлинаСлова = СтрДлина(мСтрока);
    мСтрока = НРег(мСтрока);
    // первый символ - всегда заглавная
    ПервыйСимвол = Сред(мСтрока, 1, 1);
    мНоваяСтрока = Врег(ПервыйСимвол);
    
    Для й = 2 По ДлинаСлова Цикл
        ТекСимвол = Сред(мСтрока, й, 1);
        СледСимвол = Сред(мСтрока, й + 1, 1);
        Буква = ?(врег(ТекСимвол) = нрег(ТекСимвол),1,0);

        Если (Буква = 1) Тогда
            мНоваяСтрока = мНоваяСтрока + ТекСимвол + Врег(СледСимвол);
            й = й + 1;
        Иначе
            мНоваяСтрока = мНоваяСтрока + ТекСимвол;
        КонецЕсли;
    КонецЦикла;

    Возврат мНоваяСтрока;
57 Ненавижу 1С
 
гуру
09.02.15
09:46
(10) неа, есть грузинский алфавит
58 Масянька
 
09.02.15
09:47
(57) Слюшай, дарагой! (с) Мы же не в Грузии :)
59 kosts
 
09.02.15
10:17
(56) Согласно заданию, надо сделать "Первые буквы в словах сделать заглавными", про нижний регистр ничего не сказано.

Для ".иванов" не работает...
60 Масянька
 
09.02.15
10:20
(59) "." первой в строке быть не может.
61 Chameleon1980
 
09.02.15
10:23
список или строка, после которых нужно балшую букву.
и поехали по исходной строке
62 Chameleon1980
 
09.02.15
10:23
список или строка, после которых нужно балшую букву.

список или строка символов, после которых нужно балшую букву.
63 welwel
 
09.02.15
10:36
В типовой 77 вроде бы есть функция глРазделить, на выходе сз
Дальше к каждому элементу врег(лев(слово, 1)) + нрег(сред(слово,2))

вместо глРазделить можно заменить пробелы на РазделительСтроки, а потом обходить многострочную строку, использую функции СтрКоличество и СтрПолучить
64 kosts
 
09.02.15
10:39
Пусть так


    с = "";
    СловоНачалось = Ложь;
    Для ч = 1 По СтрДлина(ИсходнаяСтрока) Цикл
        Символ = Сред(ИсходнаяСтрока, ч, 1);
        ЭтоБуква = ВРег(Символ) <> НРег(Символ);
        Если Не СловоНачалось и ЭтоБуква Тогда
            СловоНачалось = Истина;
            Символ = Врег(Символ);
        ИначеЕсли Не ЭтоБуква Тогда
            СловоНачалось = Ложь;
        КонецЕсли;
        с = с + Символ;
    КонецЦикла;
    
    Сообщить(с, СтатусСообщения.Информация);
65 Classic
 
09.02.15
10:41
Результ = "";
Для Сч = 1 По СтрДлина(ИсходнаяСтрока) Цикл
    Результ = Результ + ?(Сч = 1 ИЛИ Сред(ИсходнаяСтрока, Сч-1,1) = " ", ВРЕГ(Сред(ИсходнаяСтрока, Сч,1)), Сред(ИсходнаяСтрока, Сч,1))
КонецЦикла;
66 Ёпрст
 
09.02.15
10:45
(65) Хрень же.. если разделитель не пробел ?
А Бахши-Заде ?
67 Classic
 
09.02.15
10:48
(66)
Если не пробел, то условие Сред(ИсходнаяСтрока, Сч-1,1) = " " меняется на Найти(" ;,.?-", Сред(ИсходнаяСтрока, Сч-1,1)) >0
68 Масянька
 
09.02.15
10:49
(64) Плюет в душу... :(
Истина, ложь - "это ж бубль-гум" (С) (в смысле семерка).
Ну, и "ЭтоБуква = ВРег(Символ) <> НРег(Символ)" - тоже не работает. :(
(67) Издеваешься?!
69 Classic
 
09.02.15
10:50
(68)
В смысле?
Ты не в курсе, какие могут быть разделители?

Результ = "";
Для Сч = 1 По СтрДлина(ИсходнаяСтрока) Цикл
    Результ = Результ + ?(Сч = 1 ИЛИ Найти(" ;,.?-", Сред(ИсходнаяСтрока, Сч-1,1)) >0, ВРЕГ(Сред(ИсходнаяСтрока, Сч,1)), Сред(ИсходнаяСтрока, Сч,1))
КонецЦикла;
70 Масянька
 
09.02.15
10:50
(69) Не-а.
71 Classic
 
09.02.15
10:52
(70)
Строка пра?5кадр как должна в результате выглядеть?
72 Поpyчик-4
 
09.02.15
10:56
ТРег(<Строка>)  не предлагать?
73 Classic
 
09.02.15
10:56
Если "слова" - это исключительно буквы, тогда
Результ = "";
Для Сч = 1 По СтрДлина(ИсходнаяСтрока) Цикл
    Результ = Результ + ?(Сч = 1 ИЛИ Найти("абвгдеёжзийклмнопрстуфкцчшщэюя", Нрег(Сред(ИсходнаяСтрока, Сч-1,1))) =0, ВРЕГ(Сред(ИсходнаяСтрока, Сч,1)), Сред(ИсходнаяСтрока, Сч,1))
КонецЦикла;
74 Масянька
 
09.02.15
10:58
(71) Пра?5Кадр
(72) Нет :)
(73) "Не исключительно" буквы.
75 Classic
 
09.02.15
11:00
(74)
А что кроме букв?
На каком примере тебе код из (73) (это кстати аналог ТРЕГ) не подходит
76 Chameleon1980
 
09.02.15
11:04
пля ну список разделителей возможных
пошли по символам по исходной строке
если очередной символ в исх строке входит в список возможных разделителей, то следующий символ ВРЕГ
77 Chameleon1980
 
09.02.15
11:05
возможных разделителей могет сколько хочешь
78 Classic
 
09.02.15
11:05
(76)
Да вот пытаюсь то же самое донести. Но мне говорят, что бред
79 Duke1C
 
09.02.15
15:47
(68) Млин а мой код из (24) не работает чтоль?
Как и писал в (3) - с магазина пришел - накидал, а проверять лень было, но по идее работать то должно...
Или (28) принципиально? Т.е. спросить спрошу, но делать буду сама
80 Масянька
 
09.02.15
16:25
(79) Я же говорила, что я "противная" ;)))))
Всегда интересно - сделай сам (С)
81 Duke1C
 
09.02.15
17:11
(80) Ну мучайся, чо :)))
Но может все-таки проверишь, заодно и моё самолюбие потешится вдруг ;)
82 Масянька
 
09.02.15
18:03
(81) Мда... А ты - противнее меня :)))
Завтра - попробую.
83 Duke1C
 
09.02.15
21:01
Нее я просто немного настойчивый...:))) ну или неугомонный, там уж кому как больше нравится ;)
84 1s_ivan
 
09.02.15
22:49
Цикл перебрать все разделители
Цикл перебрать все буквы алфавита
                .. опять В исходной строке заменить (разделитель+БОЛЬШАЯ БУКВА) на (разделитель+маленькая буква)
Конец Цикла
Конец Цикла

// при количестве разделителей 10, а букв 31  = 310 раз операция замены, т.е. эффективно использовать, только при строках более 300 символов - "больших строках".
85 Масянька
 
10.02.15
08:47
(83) Сам себя не похвалишь... (С)
Работает :))
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс