7.7 Строковые пременные

Тема в разделе "Обмен данными в "1С:Предприятие 7.7"", создана пользователем BeardRED, 29 авг 2010.

Статус темы:
Закрыта.
  1. TopicStarter Overlay
    BeardRED
    Offline

    BeardRED

    Регистрация:
    29 авг 2010
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    вопрос программистам 1с. Как в 1с из середины текстовой строки вырезать числа?

    Как в 1с из текстовой строки, представляющей произвольный набор чисел разделённые произвольным количеством пробелов и табуляций, вычеленить эти числа?
    - стандарная операция "число", вроде даёт возможность добраться только до первого. Можно конечно обрезать каждый раз строку с права на определённое количество позиций, но к сожалению этот номер не проходит - числа разной длины и разного представления (целые, действительные, с плавающей точкой)
  2. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    В цикле.
    Найти() - находите позицию пробела.
    Лев() - вырезаете часть строки и преодразуете ее в число
    Обрезаете строку слева на найденное количество символов и т.д.
  3. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Как-то так:
    Код:
    ИсходнаяСтрока = "1  232    342   12.83 31321";
    
    СтрокаИсточник = СокрЛ(СтрЗаменить(ИсходнаяСтрока, СимволТабуляции, " ")) + " ";
    НадоЗаменитьПробелы = СтрЧислоВхождений(СтрокаИсточник, "  ");
    Пока НадоЗаменитьПробелы > 0 Цикл
    СтрокаИсточник = СтрЗаменить(СтрокаИсточник, "  ", " ");
    НадоЗаменитьПробелы = СтрЧислоВхождений(СтрокаИсточник, "  ");
    КонецЦикла;
    
    ПозицияПробела = Найти(СтрокаИсточник, " ");
    Пока ПозицияПробела > 1 Цикл
    СтрокаЧисло = Лев(СтрокаИсточник, ПозицияПробела - 1);
    Сообщить("" + Число(СтрокаЧисло)); //<-Наше число
    СтрокаИсточник = Прав(СтрокаИсточник, СтрДлина(СтрокаИсточник) - ПозицияПробела);
    ПозицияПробела = Найти(СтрокаИсточник, " ");
    КонецЦикла;
    
    
  4. TopicStarter Overlay
    BeardRED
    Offline

    BeardRED

    Регистрация:
    29 авг 2010
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    Спасибо... идею я понял
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    учтена.
    Код:
    НадоЗаменитьПробелы = СтрЧислоВхождений(СтрокаИсточник, "  ");
    Пока НадоЗаменитьПробелы > 0 Цикл
    СтрокаИсточник = СтрЗаменить(СтрокаИсточник, "  ", " ");
    НадоЗаменитьПробелы = СтрЧислоВхождений(СтрокаИсточник, "  ");
    КонецЦикла;
    
    
    между числами останется по 1 пробелу.
  6. TopicStarter Overlay
    BeardRED
    Offline

    BeardRED

    Регистрация:
    29 авг 2010
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    ага.. разобрался ... даже раньше Вашего ответа
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Так короче:
    Код:
    Пока Найти(СтрокаИсточник,"  ") > 0 Цикл        
    СтрокаИсточник = СтрЗаменить(СтрокаИсточник, "  ", " ");           
    КонецЦикла;
    
    
    
  8. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Делал для наглядности, а так, да, согласен. Кроме того замена на функцию "Найти()" на длинных строках, скорее всего на какие-то доли секунды будет быстрее.
  9. TopicStarter Overlay
    BeardRED
    Offline

    BeardRED

    Регистрация:
    29 авг 2010
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    вот нашёл глючёк... причём всей системы 1С... ну не понимает она переменных с плавной точкой... запись с мантиссой и экспонентой (типа 1.2345e+003 = 1234.5) повергают функцию Число() в шок... точнее она просто не обращает внимания на экспоненту... вот доработал процедурку... её конечно можно и нужно оптимизировать - для наглядности всё сделано... а так от половины временных переменных можно отказаться...
    Код:
     //////////////////////////////////////////////////////// 
    
    Процедура  ГлОчисловкаСтроки(стр,Колонки[]) Экспорт  
    СтрокаИсточник = СокрЛ(СтрЗаменить(стр, СимволТабуляции, " ")) + " ";
    НадоЗаменитьПробелы = СтрЧислоВхождений(СтрокаИсточник, "  ");
    while НадоЗаменитьПробелы > 0 do
    СтрокаИсточник = СтрЗаменить(СтрокаИсточник, "  ", " ");
    НадоЗаменитьПробелы = СтрЧислоВхождений(СтрокаИсточник, "  ");
    enddo;
    ПозицияПробела = Найти(СтрокаИсточник, " ");  колонка=1;
    while ПозицияПробела > 1 do
    СтрокаЧисло = Лев(СтрокаИсточник, ПозицияПробела - 1);
    Колонки[колонка]=Число(СтрокаЧисло); ПозицияЭкспоненты=0; 
    if (Найти(СтрокаЧисло, "E")>0) then
    ПозицияЭкспоненты=Найти(СтрокаЧисло, "E"); else
    if (Найти(СтрокаЧисло, "e")>0) then
    ПозицияЭкспоненты=Найти(СтрокаЧисло, "e"); endif; endif;
    if ПозицияЭкспоненты>0 then
    СтрокаЭкспонента=Прав(СтрокаЧисло,СтрДлина(СтрокаЧисло)-ПозицияЭкспоненты);	
    Экспонента=Число(СтрокаЭкспонента); if Экспонента>0 then
    for степень=1 to  Экспонента do Колонки[колонка]=Колонки[колонка]*10; enddo; else
    for степень=1 to -Экспонента do Колонки[колонка]=Колонки[колонка]/10; enddo; endif;
    endif; 
    СтрокаИсточник = Прав(СтрокаИсточник, СтрДлина(СтрокаИсточник) - ПозицияПробела);
    ПозицияПробела = Найти(СтрокаИсточник, " ");   колонка=колонка+1;
    enddo;
    КонецПроцедуры
    
    /////////////////////////////////////////////////////////////
    
  10. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Ну если уважаемый BeardRED обратит внимание, то 1С не может выполнить даже элементарных математических действий, таких как вычисление корня.
    От сюда закономерный вопрос: а оно надо?
    Для решение прямых задач, для которых предназначена 1С - НЕТ!

    А если необходимо выполнять какие-то сложные инженерные расчеты - то они делаются во внешних приложениях (компонентах).
  11. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Вы бы еще бедную 1с приспособили для бифуркации нелинейных диференциальных уравнений третьего порядка. Для этой цели существует Fortran. А у 1с другие задачи.
  12. TopicStarter Overlay
    BeardRED
    Offline

    BeardRED

    Регистрация:
    29 авг 2010
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    Непонятно... чего развеселились то.... нафиг мне корень... если понадобится - сделаю.... а искуственно ограничивать сферу применения - это совсем не по коммерчески - тем более - исходная задача общими силами решена-ж... (см. первый пост)

    что до возникновения таковой задачи - другой вопрос - кто выдал данный с плавающей точкой (экспонентой т.е.) тот выдал, нужды особливой в том нет, но в формате каких-то отчётов такое вылезло... можно поднять бучу, потребовать ограничений в выходящих данных у чужаков (и быть обоснованно посланным в задумчивую даль).... а можно самому извернуться и всё съесть универсально.
  13. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Безусловно - и за это ва м только плюс. В 1с можно сделать все что угодно. Только вот хаить функционал ради частного случая - не нужно.
Статус темы:
Закрыта.

Поделиться этой страницей