Имя: Пароль:
1C
 
Строка
0 VovoV
 
19.12.05
17:25
Как из строки Привет Привет Привет
получить строку Привет П. П.?????
1 mos-ad
 
19.12.05
17:26
глФИО(Строка)
2 VovoV
 
19.12.05
17:27
??? чего
3 mos-ad
 
19.12.05
17:28
ой
ФИО("Привет Привет Привет") - это процедура в глобальнике в бух
4 Таня
 
19.12.05
17:28
(2) функция такая есть в ГМ
5 Terv
 
19.12.05
17:29
это из бухии
//******************************************************************************
//    глФамилияИмяОтчество(Объект,Фамилия,Имя,Отчество)
//
//    Параметры:
//        Объект     - элемент справочника Сотрудники или Строка
//        Фамилия     - в этот параметр будет записана фамилия сотрудника
//        Имя         - в этот параметр будет записано имя сотрудника
//        Отчество - в этот параметр будет записано отчество сотрудника
//
//    Возвращаемое значение:
//        фамилия и инициалы сотрудника
//
//    Описание:
//        разбирает "наименование" сотрудника по Фамилия, Имя, Отчество
//        и возвращает фамилию и инициалы сотрудника
//
Функция глФамилияИмяОтчество(Объект,Фамилия="",Имя="",Отчество="") Экспорт
   
   Если ТипЗначения(Объект)=2 Тогда
       ФИО = глРазделить(СокрЛП(Объект),",");
   Иначе
       ФИО = глРазделить(СокрЛП(Объект.Наименование),",");
   КонецЕсли;                            
   ФИО = глРазложить(ФИО," ");
   Фамилия = ""; Имя = ""; Отчество = "";
   Если ФИО.РазмерСписка() > 0 Тогда
       Фамилия = ФИО.ПолучитьЗначение(1);
       Если ФИО.РазмерСписка() > 1 Тогда
           Имя        = ФИО.ПолучитьЗначение(2);
           Если ФИО.РазмерСписка() > 2 Тогда
               // а вот отчество бывает и не из одного слова                
               Для Сч = 3 По ФИО.РазмерСписка() Цикл
                   Отчество = Отчество + ФИО.ПолучитьЗначение(Сч) + " ";
               КонецЦикла;
               Если ПустоеЗНачение(Отчество) = 0 Тогда
                   Отчество = Лев(Отчество,СтрДлина(Отчество)-1);
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   
   Возврат Фамилия+?(ПустоеЗначение(Имя)=0," "+Лев(Имя,1)+"."+?(ПустоеЗначение(Отчество)=0,Лев(Отчество,1)+".",""),"")

КонецФункции    // глФамилияИмяОтчество



в ТиС , есть глФИО , точно такая же
6 skunk
 
19.12.05
17:29
не везде ... она такая есть
7 VovoV
 
19.12.05
17:30
Пасиб
8 LOD
 
19.12.05
17:30
(6) Но теперь она есть даже в этой ветке :)
9 Terv
 
19.12.05
17:32
(8) глФИО , немного другая, она более правильно написана
10 skunk
 
19.12.05
17:35
можно проще...
11 Terv
 
19.12.05
17:35
(10) пости... в книгу знаний добавим :)
12 Terv
 
19.12.05
17:36
+11 ошибся - " в базу знаний"
13 LOD
 
19.12.05
17:43
(10) В одну строку ? ;)
14 lisss
 
19.12.05
18:00
(0)
Стр = Лев(Стр,Найти(Стр," "))+" "+Лев(Сред(Стр,Найти(Стр," ")+1),1)+"."+Лев(Сред(Сред(Стр,Найти(Стр," ")+1),Найти(Сред(Стр,Найти(Стр," ")+1)," ")+1),1)+".";
15 lisss
 
19.12.05
18:01
(13) (14)в одну строку.....
16 skunk
 
19.12.05
18:09
(14)что вернет "Баранов Леонид" ?

за одну не знаю...

//*******************************************
function GetInitials(strName = "")
 strName = strreplace(strName, " ", linebreak);
 strName = strgetline(strName, 1) + " " +
 ?(isblankstring(strgetline(strName, 2)) = 0, left(strgetline(strName, 2), 1) + "." +
 ?(isblankstring(strgetline(strName, 2)) = 0, left(strgetline(strName, 3), 1) + ".", ""), "");
 return strName;
endfunction

не мое... автор Рупор... я так не много доработал
17 LOD
 
19.12.05
18:10
(15) Никто и не сомневался
18 lisss
 
20.12.05
09:12
ФИО=Лев(ФИО,?(Найти(ФИО," ")=0,СтрДлина(ФИО),Найти(ФИО," ")+1))+?(СтрЧислоВхождений(ФИО," ")=0,"",".")+?(СтрЧислоВхождений(ФИО," ")>1,Сред(Прав(ФИО,СтрДлина(ФИО)-Найти(ФИО," ")),Найти(Прав(ФИО,СтрДлина(ФИО)-Найти(ФИО," "))," ")+1,1)+".","")
19 skunk
 
20.12.05
09:15
;))) ... не могу .... сдаюсь... не проверял, но сдаюсь....
20 lisss
 
20.12.05
09:19
(19)не, правда работает... надо только чтоб пробелов не было в начале и в конце... :)
21 skunk
 
20.12.05
09:22
и между вамилией с именем... да  ;)))


в 16 в принципе тоже
22 lisss
 
20.12.05
09:28
(21)по идее, если добавить несколько СокрЛП, то вообще все зашибись будет.... счас доделаю....
23 skunk
 
20.12.05
09:29
не страдай... все равно ни кто не оценит
24 lisss
 
20.12.05
09:48
(23)так скучно, делать нечего....
25 skunk
 
20.12.05
09:55
ну тогда страда
26 skunk
 
20.12.05
09:56
страдай...
27 lisss
 
20.12.05
10:14
ФИО = Формат(СокрЛП(ФИО),"С"+?(Найти(СокрЛП(ФИО)," ")=0,Число(СтрДлина(СокрЛП(ФИО))),Число(Найти(СокрЛП(ФИО)," ")-1)))+?(СтрЧислоВхождений(СокрЛП(ФИО)," ")>0," "+Лев(СокрЛП(Сред(СокрЛП(ФИО),Найти(СокрЛП(ФИО)," "))),1)+".","")+?(СтрЧислоВхождений(СокрЛП(Сред(СокрЛП(ФИО),Найти(СокрЛП(ФИО)," ")))," ")>0,Лев(СокрЛП(Сред(СокрЛП(Сред(СокрЛП(ФИО),Найти(СокрЛП(ФИО)," "))),Найти(СокрЛП(Сред(СокрЛП(ФИО),Найти(СокрЛП(ФИО)," ")))," "))),1)+".","")

теперь ваще все круто....
28 lisss
 
20.12.05
10:16
ух ты... теперь в БЗ.... тогда последнюю добавьте лучше....
29 skunk
 
20.12.05
10:20
все теперя я в истории...
30 VadimG
 
20.12.05
10:21
(27) Научил людей в одну строку фигачить, блин.. =)
31 Прохожий
 
20.12.05
12:58
(31) Один человек "научил" практически в одну строку любые ФИО склонять...
32 skunk
 
20.12.05
13:08
(31)сам себе... что ли ;))
33 Рупор абсурда
 
20.12.05
13:23
Почему эта тупая ветка добавлена в БЗ?
34 NS
 
20.12.05
13:25
(33) Я знаю, но промолчу.
35 Рупор абсурда
 
20.12.05
13:27
(34) Потому, что инженер такой же?
36 NS
 
20.12.05
13:28
(35) Не надо меня провоцировать.
37 lisss
 
20.12.05
13:47
(33)а почему тупая?
38 smaharbA
 
20.12.05
14:03
СокрЛП(Сред(СокрЛП(СокрЛП(Сред(СокрЛП(СокрЛП(Сред(СокрЛП(СокрЛП(Сред(СокрЛП(СокрЛП(Сред(СокрЛП(СокрЛП(Сред(СокрЛП(СокрЛП(Сред(СокрЛП(...нашли
39 skunk
 
20.12.05
14:07
на зло врагам ... нас гнетущим..
40 lisss
 
20.12.05
14:16
(38)???
41 skunk
 
20.12.05
14:36
не много подправлю еще один косяк Рупора... на случай если вдруг между фамилией и именем оператор набъет два пробела

//*******************************************
function GetInitials(strName = "")
 while find(strName, "  ") > 0 do
   strName = strreplace(strName, "  ", " ");
 enddo;
 strName = strreplace(strName, " ", linebreak);
 strName = strgetline(strName, 1) + " " +
 ?(isblankstring(strgetline(strName, 2)) = 0, left(strgetline(strName, 2), 1) + "." +
 ?(isblankstring(strgetline(strName, 2)) = 0, left(strgetline(strName, 3), 1) + ".", ""), "");
 return strName;
endfunction
42 Рупор абсурда
 
20.12.05
14:37
(41) Опа ... А почему этот косяк носит моё имя?
43 Пкфте
 
20.12.05
14:38
Куя, исправил...
44 skunk
 
20.12.05
14:47
(42)так это ты предложил...
45 Пкфте
 
20.12.05
14:49
Скунки, ты везде у себя на аглицком калякаешь?
ЗЫ извиняй за (43) - всё, импортную писанину больше не читаю...
46 skunk
 
20.12.05
14:50
не поверишь везде...
47 Пкфте
 
20.12.05
14:52
поверю
48 Cheater дубль2
 
20.12.05
14:55
(41,44) Косяк Рупора или косяк, исправленный Рупором?
49 skunk
 
20.12.05
14:57
как подсказали... еще более правильный вариант

//*******************************************
function GetInitials(strName = "")
 if isblankstring(strName) > 0 then
   strName = "";
 else
   strName = trimall(strName);
   while find(strName, "  ") > 0 do
     strName = strreplace(strName, "  ", " ");
   enddo;
   strName = strreplace(strName, " ", linebreak);
   strName = strgetline(strName, 1) + " " +
   ?(isblankstring(strgetline(strName, 2)) = 0, left(strgetline(strName, 2), 1) + "." +
   ?(isblankstring(strgetline(strName, 2)) = 0, left(strgetline(strName, 3), 1) + ".", ""), "");
 endif;
 return strName;
endfunction
50 skunk
 
20.12.05
14:59
(48)в том варианте который предложил он... были Косячки...
51 Рупор абсурда
 
20.12.05
15:00
(50) Наговариваешь ты на меня ...
Тебе бы только всё хорошее ругать ...
52 skunk
 
20.12.05
15:04
(51)даже думать не смел
53 skunk
 
20.12.05
15:07
Рупор абсурда
9 - 21.09.05 - 15:35
Стр=СтрЗаменить(ФИО," ",РазделительСтрок);
Стр=СтрПолучитьСтроку(Стр,1)+" "+Лев(СтрПолучитьСтроку(Стр,2),1)+"."+Лев(СтрПолучитьСтроку(Стр,3),1)+".";


взято от сюда
Прав, Лев, СокрЛП
54 NS
 
20.12.05
15:20
СтрРазница=1;
Пока СтрРазница>0 Цикл
 СтрРазница=Стрдлина(стр);
 Стр=СтрЗаменить(Стр,"  "," ");
// два пробела на один
 СтрРазница=СтрРазница-Стрдлина(стр);
КонецЦикла;
55 skunk
 
20.12.05
15:21
ну все равно это полностью твой код... я просто сделал его не много универсальней...

у тебя кошерно отрабатывался только вариант "Баронов Лев Леонидович" ...

у меня за пох
"Баронов   Лев   Леонидович"
"   Баронов  Лев  Леонидович   "
"Баронов Лев Леонидович"
"Баронов Лев"
"Баронов"
56 NS
 
20.12.05
15:30
Баронов?
57 skunk
 
20.12.05
15:39
очепятка ... Баранов ...
58 Рупор абсурда
 
20.12.05
15:39
(53) А мне там код Grant'а понравился ...
Кстати, не знаешь куда он пропал?
59 skunk
 
20.12.05
15:40
нет... я даже не видал... а что там было?
60 Рупор абсурда
 
20.12.05
15:49
(59) Код там в (12) ...
Я не про пропажу кода спросил, а про пропажу самого Гранта ... :))
61 skunk
 
20.12.05
15:54
(60)нет куда Грант пропал незнаю ...

а код ... нет о еще кривее чем у тебя ... козябаки теже... а по скорости... твой делает...
62 Cheater дубль2
 
20.12.05
15:59
(55) А проверка на цифры и символы, например %,.>? =)
63 skunk
 
20.12.05
16:01
(62)за пох... проблема оператора...
64 smaharbA
 
20.12.05
16:07
А можно набивальщиц посадить, как кто в базе работает с ФИО у них выпрыгивает Ввести строку и они быстренько ее пишут, если тыщ 100 набивальщиц то быстрее любого алгоритму...
65 Cheater дубль2
 
20.12.05
16:18
(63) Проблема программера, имхо нужно при вводе проверять на недопустимые символы
66 skunk
 
20.12.05
16:19
"-" - допустимый символ?
67 Cheater дубль2
 
20.12.05
16:21
(66) да
68 lisss
 
20.12.05
16:21
(65)вопрос, я что делать с недопустимыми символами? Удалять слово, вырезать, считать раздилителем, вобще оператора нах... посылать?
69 lisss
 
20.12.05
16:22
+(68) раздЕлителем...
70 skunk
 
20.12.05
16:22
Опратор вел "Ба-ра-нов" чей косяк?
71 Cheater дубль2
 
20.12.05
16:23
(68) вырезать, в 80% случаев поможет
72 lisss
 
20.12.05
16:25
(71)один цикл в три строчки, если есть список недопустимых символов.... тебе написать?
73 Cheater дубль2
 
20.12.05
16:25
(70) Оператора, только я тебе про двойные пробелы говорил и !?:;%&*()$#@><'"][{}+/
74 skunk
 
20.12.05
16:28
(74) двойные пробелы... там удаляються... глянь внимательно
75 skunk
 
20.12.05
16:28
за остальное... надо тебе... ты удаляй... мне нет не надо...
76 lisss
 
20.12.05
16:30
(73)а двойные пробелы удаляются в обоих алгоритмах
77 smaharbA
 
20.12.05
17:56
Function Replacet(patrn,replStr,str1)
 Set regEx = New regexp
 regEx.Pattern = patrn
 regEx.IgnoreCase = true
 Replacet = regEx.Replace(str1,replStr)
End Function

str1 = "Петров-и-даже-водкин Василий Алибобаевич ибн Ибрагимович"
str1=Replacet("(\s)(.)(\S+)","$1$2.",str1)
for i=2 to ubound(split(str1," "))
   str1=Replacet("(\.)(\s)(.)(\S+)","$2$3.",str1)
next
for i=2 to ubound(split(str1," "))
   str1=Replacet("(\s)(\S)(\s)"," $2. ",str1)
next
MsgBox str1
;)
78 skunk
 
20.12.05
17:58
ржал
79 smaharbA
 
20.12.05
17:59
Function Replacet(patrn,replStr,str1)
 Set regEx = New regexp
 regEx.Pattern = patrn
 regEx.IgnoreCase = true
 Replacet = regEx.Replace(str1,replStr)
End Function

str1 = "Петров-и-даже-водкин  Василий Алибобаевич  ибн Ибрагимович"
for i=2 to ubound(split(str1," "))
   str1=Replacet("  "," ",str1)
next
str1=Replacet("(\s)(.)(\S+)","$1$2.",str1)
for i=2 to ubound(split(str1," "))
   str1=Replacet("(\.)(\s)(.)(\S+)","$2$3.",str1)
next
for i=2 to ubound(split(str1," "))
   str1=Replacet("(\s)(\S)(\s)"," $2. ",str1)
next
MsgBox str1
;)