Имя: Пароль:
1C
1С v8
Как выбрать из числа с префиксом число ?
0 yavasya
 
10.10.13
10:23
Есть номера документов БДЕ000056 мне надо взять 56 для вычислений
Числом получить знаю
Х=0+переменная;
номера документов можно достать без префикса процедурой сведения о физ.юрлице, но хочу научиться отделять буквы от цифр

примерно так= БДЕ000056-БДЕ )))
1 Rie
 
10.10.13
10:24
(0) Циклом бежишь по строке и смотришь - буква в этом месте или цифра.
2 Чайник Рассела
 
10.10.13
10:24
Найти()
3 vde69
 
модератор
10.10.13
10:25
число(сред("БДЕ000056",4))
4 1Сергей
 
10.10.13
10:25
//Убрать цифры из строки
Для Идн = 0 по 9 Цикл
    Стр = СтрЗаменить(Стр, "" + Идн, "");
КонецЦикла
5 elCust
 
10.10.13
10:25
Если префикс всегда одинаковый, то СтрЗаменить()
6 Aleksey T
 
10.10.13
10:31
а букв всегда 3?

Номер=БДЕ000056;
НомерЧислом=Число(УзнатьНомер(Прав(Номер,6)));

Функция УзнатьНомер(Номер)
Возврат ?(Лев(Номер,1)<>"0", Номер, УзнатьНомер(Прав(Номер, СтрДлина(Номер)-1)));
КонецФункции
7 Рэйв
 
10.10.13
10:33
Функция ВыжатьЧисло(Строчка)
    Ответ=0;
    //даже если там будет лежать строка вида "яыва45выва5ыва56" все равно получим 45556
    Если ТипЗнч(Строчка)=Тип("Число") Тогда
        Возврат Строчка;
    КонецЕсли;    
    Строчка=Строка(Строчка);
    Длина=СтрДлина(Строчка);
    Результат="";
    Для н=1 По Длина Цикл
        //собираем циферки
        Сим=Сред(Строчка,н,1);
        Если Найти("0123456789",Сим)>0 Тогда
            Результат=Результат+Сим;
        КонецЕсли;    
    Конеццикла;    
    Если Результат<>"" Тогда
        Ответ=Число(Результат);
    КонецЕсли;    
    Возврат Ответ;
КонецФункции
8 Rie
 
10.10.13
10:36
(7) Не взлетит.
Контрпример - "ФФФ111ЫЫЫ222".
9 Рэйв
 
10.10.13
10:37
(8)Ну да... это я немного для другого писал:-)
Значит надо до первой цифры, а потом резать
10 IamAlexy
 
10.10.13
10:39
(8) циклом с последнего символа и пока это цифра - собираешь цифру..
самый надежный способ.
11 Rie
 
10.10.13
10:40
(10) Смотря какое из чисел надо выбрать - первое или последнее.
12 IamAlexy
 
10.10.13
10:41
(11) ну если пошла такая пьянка то регэкспом сформировать массив вхождений чисел и затем обрабатывать либо первое значение массива либо последнее
13 Бледно Золотистый
 
10.10.13
10:44
Вообще есть типовая функция - ПолучитьНомерНаПечать
14 rmrush
 
10.10.13
10:46
Можете отбирать символы по их коду, у чисел диапазон кодов в пределах [48;57]
ТекСтрока = "АА0912ББС92";
Длина = СтрДлина(ТекСтрока);
Результат = "";

Для н = 1 По Длина Цикл

    ТекСимвол = Сред(ТекСтрока,н,1);

    Если КодСимвола(ТекСимвол) <= 57 И КодСимвола(ТекСимвол) >= 48 Тогда
        Результат=Результат+ТекСимвол;
    КонецЕсли;    
Конеццикла;
Сообщить(Результат);
15 Rie
 
10.10.13
10:47
(12) Можно и так :-)
16 Sabbath
 
10.10.13
10:47
(13) +1 недавно тема была
17 IamAlexy
 
10.10.13
10:48
(14) фиг там.. ты на выходе получиш 091292 а нужно 92 :)

нужно в условие добавить

иначе
Результат = "";
18 IamAlexy
 
10.10.13
10:48
+(17) ну или если первое нужно, то есть 0912 то прерывать цикл..
19 rmrush
 
10.10.13
10:49
(18) То есть первая часть считается префиксом от того, что есть буквы?
20 yavasya
 
10.10.13
10:50
номернапечать знаю
что - то универсальное надо для работы с числами и буквами
21 yavasya
 
10.10.13
10:50
ответы получил
всем спасибо
22 rmrush
 
10.10.13
10:51
(17) Ну в этом случае, можно при каждом натыкании на букву зачищать результат, и все будет ок :)
23 IamAlexy
 
10.10.13
10:51
(19) вообще то да.

префиксом считается все то что слева от числа.

то есть смотришь справа, пока цифры - это числовое значение номера
до первой буквы - и далее идет прфикс..

многие бухи накалываются на приколе с номреами типа

00000000001/1


им система кстати радостно  до 000000001/9 доводит номер и вуаля - далее номер неуникальный
24 Wobland
 
10.10.13
10:57
>надо взять 56 для вычислений
первый палец правой руки ставлю на то, что вычисления неправильный
25 Aleksey T
 
10.10.13
10:58
а если так(неуверен в правильности):

Номерок="";
Длина=СтрДлина(Номер)
Для инд=1 по Длина Цикл
  Попытка
   Число(Лев(Номер,инд));
   Шаг=Лев(Номер,инд);
  Исключение
   Шаг="";
  КонецПопытки;
Номерок=Номерок+Шаг;
Номер=Прав(Номер,СтрДлина(номер)-1);
КонецЦикла;

Номерок=Число(Номерок);

Чур не проклинать меня и слать порчу))))
26 yavasya
 
10.10.13
11:03
Длина=СтрДлина(Номер)
(номер) что за переменная ?
номер=номерДокумента ?
27 Rie
 
10.10.13
11:07
(26) Номер - это твоя строка, из которой число извлекаешь.
28 Serg_1960
 
10.10.13
11:11
Пятница всё-таки :)

А слабо придумать и озвучить самый лаконичный алгоритм выделения цифровой части для строки вида "ПрефиксЦифрыСуффикс", где префикс и суффикс - произвольный набор символов?
29 yavasya
 
10.10.13
11:13
ТекСтрока = "АА0912ББС92";
Длина = СтрДлина(ТекСтрока);
Результат = "";

Для н = 1 По Длина Цикл

    ТекСимвол = Сред(ТекСтрока,н,1);

     Если КодСимвола(ТекСимвол) <= 57 И КодСимвола(ТекСимвол) >= 48 Тогда
        Результат=Результат+ТекСимвол;
    КонецЕсли;    
Конеццикла;
Сообщить(Результат);


не работает, выводит с префиксом
30 Aleksey T
 
10.10.13
11:15
(28) Четверг((((((
31 Rie
 
10.10.13
11:16
(29) Неправда.
32 Serg_1960
 
10.10.13
11:18
(30) Ну, я так и говорю: "Завтра, ближе к вечеру, если будет время - посижу, подумаю" :))
33 yavasya
 
10.10.13
11:21
Номерок="";
Длина=СтрДлина(Номер)
Для инд=1 по Длина Цикл
  Попытка
   Число(Лев(Номер,инд));
   Шаг=Лев(Номер,инд);
  Исключение
   Шаг="";
  КонецПопытки;
Номерок=Номерок+Шаг;
Номер=Прав(Номер,СтрДлина(номер)-1);
КонецЦикла;

Номерок=Число(Номерок);

не работает
Встроенная функция может быть использована только в выражении. (Число)
            Число<<?>>(Лев(Номер,инд)); (Проверка: Толстый клиент (обычное приложение))
34 Rie
 
10.10.13
11:25
(33) И ведь действительно - Число() можно использовать только в выражении. А у Вас оно используется как оператор.
Но вообще-то код несколько загадочный. Зачем такие извращения?  Чуть измените код из (29) - выходите из цикла по первой не-цифре после цифры - и наступит счастье.
35 yavasya
 
10.10.13
11:26
ТекСтрока = "АА0912ББС92";
Длина = СтрДлина(ТекСтрока);
Результат = "";

Для н = 1 По Длина Цикл

    ТекСимвол = Сред(ТекСтрока,н,1);

     Если КодСимвола(ТекСимвол) <= 57 И КодСимвола(ТекСимвол) >= 48 Тогда
        Результат=Результат+ТекСимвол;
    КонецЕсли;    
Конеццикла;
Сообщить(Результат);
36 yavasya
 
10.10.13
11:26
прошу прощения, работает
37 Rie
 
10.10.13
11:26
(35) Здесь Вы получите "091292". Вам надо это? Или "0912"?
38 yavasya
 
10.10.13
11:29
можно применить

результат=0+результат;
39 yavasya
 
10.10.13
11:30
код очень понравился
универсальный
40 Rie
 
10.10.13
11:30
(38) Вопрос в другом. Вам _конечные_ цифры, которые после букв после цифр идут - нужны?
41 yavasya
 
10.10.13
11:33
конечные цифры нужны. спасибо за помощь
42 yavasya
 
10.10.13
11:36
Если КодСимвола(ТекСимвол) <= 57 И КодСимвола(ТекСимвол) >= 48

думаю буду часто использовать
43 Aleksey T
 
10.10.13
11:37
(34) ну присвоить какой нибудь переменной и не будет проблемы)
А вообще я уже здесь просто запутался что хотят в итоге из чего что)
44 1Сергей
 
10.10.13
11:39
(42) проще писать

Если ТекСимвол <= "9" И ТекСимвол >= "0"
45 Rie
 
10.10.13
11:40
(43) А зачем? Это ж жутко неэффективная конструкция по природе своей (я имею в виду подобный способ выделения числа, а не присваивание).
46 yavasya
 
10.10.13
11:51
Тогда какой самый лучший способ выделения числа ?
47 1Сергей
 
10.10.13
11:52
(46) Какого числа ? Первого, последнего, среднего. Задавай правильные вопросы, если хочешь получить правильные ответы
48 yavasya
 
10.10.13
12:01
455ывывыв481вывыв61111 - любого числа
49 Wobland
 
10.10.13
12:06
(48) какого?
50 yavasya
 
10.10.13
12:17
из текста содержащие буквы и числа выбрать числа
51 Rie
 
10.10.13
12:26
(46) У тебя уже есть хороший способ. Используй его.
52 Aleksey T
 
10.10.13
15:53
(50) ну тут уже куча разных методов, выбирай - не хочу.
я вот свой поправил:

Номер= "АА0912ББС92";
Номерок="";
Длина=СтрДлина(Номер)
Для инд=1 по Длина Цикл
  Попытка
   СС=Число(Лев(Номер,1));
   Шаг=Лев(Номер,1);
  Исключение
   Шаг="";
  КонецПопытки;
Номерок=Номерок+Шаг;
Номер=Прав(Номер,СтрДлина(номер)-1);
КонецЦикла;

Номерок=Число(Номерок);

//Вернет число 091292
53 Rie
 
10.10.13
15:58
(52) А зачем использовать Число() в Попытка? Это же долго.
54 Aleksey T
 
10.10.13
16:31
(53) Тогда так:

Номер=БДЕ000056;
Длина= СтрДлина(Номер);
Номерок="";
Для инд=1 по Длина Цикл
Шаг=Лев(номер,1);
Если Шаг<>"0" ИЛИ Шаг<>"1" ИЛИ Шаг<>"2" ИЛИ Шаг<>"3" ИЛИ Шаг<>"4" ИЛИ Шаг<>"5" ИЛИ Шаг<>"6" ИЛИ Шаг<>"7" ИЛИ Шаг<>"8" ИЛИ Шаг<>"9" Тогда Номер=Прав(Номер,СтрДлина(Номер)-1));
Иначе
Номерок=Номерог+Шаг
Номер=Прав(Номер,СтрДлина(Номер)-1)));
КонецЦикла
Номер=Число(номерок);

))))))))))))))))
55 Лефмихалыч
 
10.10.13
16:51
Процедура YoDawg(НомерСтрокой)
    RE = New COMObject("VBScript.RegExp");
    RE.Global        = истина;
    RE.IgnoreCase    = истина;
    RE.Multiline    = истина;
    RE.Pattern = "\d+";

    Для каждого Match Из RE.Execute(НомерСтрокой) Цикл
       Сообщить(Match.Value);
    КонецЦикла;
КонецПроцедуры
AdBlock убивает бесплатный контент. 1Сергей