Имя: Пароль:
1C
1С v8
Преобразование строки в число
, ,
0 BubbleGumm
 
24.12.14
13:19
Подскажите, каким образом БЫСТРО преобразовать число в строку.
Нужно выделить только цифры, разделитель дробной части может быть как точка, так и запятая. Может есть компонента какая нибудь?
1 Fish
 
24.12.14
13:20
Строка() ?
2 BubbleGumm
 
24.12.14
13:22
Тьфу. Наоборот строку в число)
3 vicof
 
24.12.14
13:22
Число()? :)
4 BubbleGumm
 
24.12.14
13:23
)
5 разработчик 1с
 
24.12.14
13:23
Пока истина цикл
кодсимвола()
6 BubbleGumm
 
24.12.14
13:24
Строка может содержать символы, пробелы, неразрывные пробелы
7 BubbleGumm
 
24.12.14
13:24
(5)
Нужно БЫСТРО. Это критично
8 Drac0
 
24.12.14
13:27
(7) Насколько быстро? Что долгого в варианте (5) ?
9 hhhh
 
24.12.14
13:27
(7) если нужно БЫСТРО, сделайте там числовое поле и не парьте нам мозг. Преобразование Число-Число делается очень быстро, практически мгновенно.
10 Euguln
 
24.12.14
13:28
Попытка
А = Число(Строка);
Исключение
//пичалька
КонецПопытки
11 Homer
 
24.12.14
13:29
(9) а еще быстрее можно?
12 Фокусник
 
24.12.14
13:29
(6) "Строка может содержать символы, пробелы, неразрывные пробелы"

Задача не ясная. Например что должно получиться на выходе из строки:
"в5вл валм88044.4449 ваалсс 94940" ? :)
13 Эмбеддер
 
24.12.14
13:30
(9) да и строка в число с такой же мгновенной скоростью преобразуется)))
14 DexterMorgan
 
24.12.14
13:31
(11) АЦЦ быстрее
15 Ненавижу 1С
 
гуру
24.12.14
13:31
откуда строка то берется?
16 ejiki
 
24.12.14
13:32
Число()
17 BubbleGumm
 
24.12.14
13:38
Короче это прайс. Идет цена с разделителями разрядов (это про пробелы), затем валюта. Валюта может быть - рубли, USD, EUR, после валюты может быть точка (или нет).
18 Enterprise
 
24.12.14
13:40
regexp!
19 BubbleGumm
 
24.12.14
13:42
(18) Ну вот разве. Нет примеров для моего случая, вникать честно говоря неохота)
20 ejiki
 
24.12.14
13:43
(17) ты приведи пример строчки. Описание уже увидели. Просто сюда забей какое строковое значение ты пытаешься обработать.
21 Бубка Гоп
 
24.12.14
13:44
123 000 руб. надо преобразовать в 123000 ?
22 BubbleGumm
 
24.12.14
13:45
(17) Все возможные варианты? )
Ну вот для примера: 1 450 руб.
1 450 руб
1450 руб
1450руб
1450руб.
и т.д. с другими валютами
23 shuhard
 
24.12.14
13:47
(22) зевая и это всё ?
24 ejiki
 
24.12.14
13:47
(22) Ну тогда написать процедурку или функцию, сначала отрезаешь незначащие символы, затем убираешь пробелы. ну а дальше Число()
25 BubbleGumm
 
24.12.14
13:49
(24) Я же указал, что важно СКОРОСТЬ
26 Enterprise
 
24.12.14
13:50
(25) ты не заметишь потерю в скорости если как в (24) сделать
27 Aleksey
 
24.12.14
13:52
(25) в типовых юзается такая функция

Функция ПолучитьЧислоИзСтроки(Знач НомерДок)
    
    Если ПустаяСтрока(НомерДок) Тогда
        Возврат 0;
    КонецЕсли;
    
    ТолькоЦифры = Истина;
    ДлинаНомера = СтрДлина(НомерДок);
    Для инд = 1 По ДлинаНомера Цикл
        // поиск ведем с конца номера, до первого не цифрового символа
        ПозицияНеЦифровойСимвол = ДлинаНомера - инд + 1;
        
        Код = КодСимвола(НомерДок, ПозицияНеЦифровойСимвол);
        
        Если Код < 48 ИЛИ Код > 57 Тогда
            ТолькоЦифры = Ложь;
            Прервать;
        КонецЕсли;
        
    КонецЦикла;
    
    Если ТолькоЦифры Тогда
        Номер = НомерДок;
    ИначеЕсли ПозицияНеЦифровойСимвол < ДлинаНомера Тогда
        Номер = Сред(НомерДок, ПозицияНеЦифровойСимвол + 1);
    ИначеЕсли ПозицияНеЦифровойСимвол = ДлинаНомера Тогда
        Возврат НомерДок;
    КонецЕсли;
    
    Возврат Число(Номер);
    
КонецФункции
28 BubbleGumm
 
24.12.14
14:03
Да не проблема же никакая функцию нацарапать. Прайсов будет дофига, грузить нужно чем быстрее тем лучше.
29 Бубка Гоп
 
24.12.14
14:03
адаптируя (27) к задаче
ДлинаНомера = СтрДлина(Строка);
    ТоЧтоБудетЧислом = "";
    Для инд = 1 По ДлинаНомера Цикл

        
        Код = КодСимвола(Строка, инд);
        
        Если Код < 48 ИЛИ Код > 57 Тогда
            продолжить;
        КонецЕсли;
        
        ТоЧтоБудетЧислом = ТоЧтоБудетЧислом + сред(Строка,инд,1);
        
    КонецЦикла;
    число=ТоЧтоБудетЧислом;
30 BubbleGumm
 
24.12.14
14:04
Да нехочется 1с циклов нифига
31 Fragster
 
гуру
24.12.14
14:05
проще договориться с поставщиком о нормальных прайсах
32 BubbleGumm
 
24.12.14
14:06
Поставщиков много. Кто гарантирует, что хоть один не заартачится?
33 Бубка Гоп
 
24.12.14
14:07
(32) гарантирует поле типа число, например. через что идет обмен то?
34 BubbleGumm
 
24.12.14
14:09
(33) Через ексель файлы
35 Fragster
 
гуру
24.12.14
14:10
(34) а там точно "строка"? может быть там "число с форматом"?
36 BubbleGumm
 
24.12.14
14:11
(35) строка
37 BubbleGumm
 
24.12.14
14:12
(35) Я же говорю, поставщики разные и возможно будут новые, кто как сделает неизвестно
38 Бубка Гоп
 
24.12.14
14:12
(34) Через ексель файлы

это и есть проблема
39 hhhh
 
24.12.14
14:12
(32) а какой смысл в огромной скорости при загрузке прайсов? Ну съэкономите вы максимум 10-12 наносекунд, вам премию что ли дадут? Скорость нужна при обслуживании клиента. А это потом.
40 Fragster
 
гуру
24.12.14
14:13
(37) универсально все равно не напишешь, придется полууниверсально под каждого все равно допиливать. проще договориться о формате
41 Fragster
 
гуру
24.12.14
14:14
(40)+ и впихнуть пункт в договор с XSD схемой :)
42 BubbleGumm
 
24.12.14
14:14
(39) Объемы прайсов большие, их много.
А вообще вопрос в том, что есть ли простые, известные может быть, решения. Если нет, то нет, загрузить конечно всяко можно.
43 13_Mult
 
24.12.14
14:15
44 su_mai
 
24.12.14
14:16
(0) Используй Int32.TryParce(<Строка>);
45 olegves
 
24.12.14
14:17
(32) кто платит денег, тот и заказывает музыку - заартачился - ищи нового клиента
46 BubbleGumm
 
24.12.14
14:18
(45) Есть задача и ее можно либо решать, либо нет. Мне нужно решить.
47 Мыш
 
24.12.14
14:18
ТолькоЦифры="";
РазделительНеНайден=Истина;
Для х=1 По СтрДлина(ИсходнаяСтрока) Цикл
Симв = Сред(ИсходнаяСтрока,х,1);
Если Найти(Симв,"0123456789")<>0 Тогда
ТолькоЦифры=ТолькоЦифры+Симв;
КонецЕсли;
Если РазделительНеНайден И Найти(Симв,".,;=-")<>0 Тогда
ТолькоЦифры=ТолькоЦифры+",";
РазделительНеНайден=Ложь;
КонецЕсли;
КонецЦикла;
ИскомоеЧисло=Число(ТолькоЦифры);
48 olegves
 
24.12.14
14:19
(42) а вообще, де много поставщиков, прайсы грузят отдельно от накладных (можно ночью), обрабатывая спец ящики поставщиков.
49 olegves
 
24.12.14
14:21
(47) а в (27) будет побыстрее, чем Найти()
50 BubbleGumm
 
24.12.14
14:26
(49) Ну да. Но хотелось бы внешний вызов, компонента может есть, циклы 1с по каждой позиции грустно выглядят. Там прайсы довольно объемные.
51 hhhh
 
24.12.14
14:28
(50) вызов компоненты в 100 раз медленнее, бери решения (24),(27) или (29), они имеют огромную скорость по сравнению с чтением файла Excel.
52 Enterprise
 
24.12.14
14:29
(50) Прайсы терабайтные что ли у тебя?
53 BubbleGumm
 
24.12.14
14:30
(52) Вообще вопрос безотносительно размеров. Можно ли ускорить загрузку, просто УСКОРИТЬ. А какие там прайсы дело десятое.
54 vicof
 
24.12.14
14:32
(53) Можно ли ускорить станок, чтобы он больше деталей выдавал? Просто ускорить, неважно какой станок.
55 hhhh
 
24.12.14
14:33
(53) ускорить - это значит ускорить чтения файлов excel, например куда-нибудь их на быстрый диск помести.
56 Мыш
 
24.12.14
14:33
(53) Уверен, что нужно ускорять именно преобразование в число? Замер то делал?
57 BubbleGumm
 
24.12.14
14:34
(55) Загрузка цен происходит уже из 1с таблицы, которая предварительно обработана.
58 BubbleGumm
 
24.12.14
14:34
(56) Ускорять нужно то, что можно ускорить.
59 Бубка Гоп
 
24.12.14
14:34
(56) или xml например юзать. или тот же dbf, где у поля будет тип число и никак туда всякая шняга не попадет. вот это добавит скорости
60 Мыш
 
24.12.14
14:35
(58) Однако, логично! Значит нужно покупать новый комп, а не компоненты искать )
61 BubbleGumm
 
24.12.14
14:35
(59) Или сразу документ установка цен материализовать из воздкуха, вот здорово то
62 BubbleGumm
 
24.12.14
14:36
(60) Это одно из мест, что можно ускорить. ОДНО ИЗ
63 hhhh
 
24.12.14
14:36
(57) блин, так в предварительной обработке и перепишите. Что-то вы совсем фигней страдаете.
64 Мыш
 
24.12.14
14:37
(61) Дано: Excel. Решение: ускорить преобразование в число. Причина: преобразование можно ускорить.

Другие вероятные причины за бортом? )
65 Бубка Гоп
 
24.12.14
14:38
(61) уж лучше напрямую из типизированного файла чем посредством таблицы, где контроль типа вообще никак не осуществляется. хочется скороссти - апгрейдить железо или менять алгоритм
66 Мыш
 
24.12.14
14:39
(62) Дык понятно. Но скорее всего данные преобразования будут занимать процентов 5 от общего времени. В работе с экселем основной затык на чтении обычно.
67 Cap_1977
 
24.12.14
14:40
(0) А как данные с ячейки листа получаешь ?
68 BubbleGumm
 
24.12.14
14:42
(67) Через ADODB.Recordset
69 BubbleGumm
 
24.12.14
14:43
(64) Про другие причины у меня вопросов нет. Вопрос по ЭТОЙ проблеме.
70 Fish
 
24.12.14
14:43
(69) А в этом нет никакой проблемы.
71 BubbleGumm
 
24.12.14
14:44
(70) Приблемы нет, да. И?
72 Cap_1977
 
24.12.14
14:44
(68) Покаж код
73 BubbleGumm
 
24.12.14
14:45
(72) Какой? И зачем?
74 Мыш
 
24.12.14
14:46
(69) Лучший вариант - под формат числа каждого поставщика написать отдельную, наиболее быструю в конкретном случае функцию.
75 BubbleGumm
 
24.12.14
14:46
(74) Может и так. Но преобразовывать в любом случае придется.
76 Enterprise
 
24.12.14
14:47
(71) И вопросов уже тоже не осталось)
77 BubbleGumm
 
24.12.14
14:48
(76) Остался, остался.
78 Куро
 
24.12.14
14:51
регулярные выражения юзай
79 BubbleGumm
 
24.12.14
14:52
(78) Да, пока к такому же мнению пришел. Разбираться честно говоря в облом. Нет готового шаблона?
80 Enterprise
 
24.12.14
14:56
(79) ну не факт что regexp будет быстрее. Тут уже надо тестить
81 BubbleGumm
 
24.12.14
14:59
(80) Ну потестить не проблема.
82 Jaap Vduul
 
24.12.14
14:59
(80)Факт, что будет медленнее.
83 BubbleGumm
 
24.12.14
15:00
(82) Проверял?
84 kosts
 
24.12.14
15:07
(0) Если это Excel, то прямо в Excel сделать в колонке цены все возможные замены, запятые на точки, пробелы и неразрывные пробелы удалить. различные варианты руб удалить.

Далее


Попытка
    А = Число(Строка);
Исключение
    //пичалька
    // не предусмотренные варианты
    А = ХитроПолучитьЧислоИзСтроки(Строка);
КонецПопытки;
85 kosts
 
24.12.14
15:08
(84)+ Как вариант, для проверки, может так еще и медленнее получится...
86 Drac0
 
24.12.14
15:10
Напиши макрос, прицепи его к файлу Ексель, запусти и после этого грузи данные.
87 BubbleGumm
 
24.12.14
15:10
(84) Ну тоже вариант. Но пользователи вряд ли будут заморачиваться. Я же говорю, вопрос не то чтобы очень критичный, но если можно ускорить этот момент, то хорошо, если нет вариантов, ну значит нет.
88 BubbleGumm
 
24.12.14
15:11
(86) Ну тоже вариант) Но см. (87)
89 Drac0
 
24.12.14
15:12
(88) А при чем тут пользователи? Делай это все программно.
90 BubbleGumm
 
24.12.14
15:14
(89) Да, попробую.
Ладно, всем спасибо, я поехал с работы)
91 AlexITGround
 
24.12.14
15:14
Где Маня, потенциальный покупатель уходит.
92 kosts
 
24.12.14
15:17
Попробовать обойтись без присвоений, все в одной строке.


Попытка
    А = Число(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(нрег(Строка),"руб.", ""),"руб", ""),",", ".")," ", ""),НеразрывныйПробел, ""));
Исключение
КонецПопытки;
93 pessok
 
24.12.14
15:28
(91) у мани сейчас скидки, ему невыгодно продавать :)
я бы сделал как в (27) только шел с конца
94 Fish
 
24.12.14
15:29
(92) Не взлетит.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой