Показано с 1 по 10 из 17

Тема: Как округлить значение в STRING?

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Exclamation

    Цитата Сообщение от Yegor Посмотреть сообщение
    Код:
    PROGRAM PLC_PRG
    VAR
    	pi: REAL := 3.141592;
    	str: STRING;
    END_VAR
    
    str := REAL_TO_STRING(REAL_TO_INT(pi * 100) / REAL#100);
    Но если для визуализации, то там всё проще. См. справку.
    Нет, не для визуализации. Для SysLibFile нужно. Ваш пример выдаёт
    '6.5e-1' при 0.6462781, а надо "0.64"...

  2. #2
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,150

    По умолчанию

    Цитата Сообщение от lava_02 Посмотреть сообщение
    0.6462781, а надо "0.64"...
    Строго говоря это не округление
    электронщик до мозга костей и не только

  3. #3

    Exclamation

    Цитата Сообщение от capzap Посмотреть сообщение
    соглашусь, тогда так
    Код:
    bar := INT_TO_STRING(REAL_TO_INT(foo*100));
    bar := INSERT( bar,'.',LEN(bar)-2);
    IF FIND(bar,'.')=1 THEN
    	bar := INSERT( bar,'0',0);
    ELSIF bar = '0' THEN
    	bar := '0.00';
    END_IF;
    Никогда бы не подумал, что такая простая задача решается таким кодом. Но всё равно спасибо!

  4. #4
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    4,108

    По умолчанию

    Когда-то для ПЛК73 сам сталкивался с подобным вопросом.
    Все уже придумано до нас. В библиотеке Oscat есть функция REAL_TO_STRF
    Если не хотите подключать эту библиотеку целиком, то вот ее код.
    Код:
    FUNCTION REAL_TO_STRF : STRING(20)
    VAR_INPUT
    IN : REAL;
    N : INT;
    END_VAR
    VAR
    O: REAL;
    i: INT;
    END_VAR
    
    (* LIMIT N to 0 .. 7 *)
    N := LIMIT(0,N,7);
    (* round the input to N digits and convert to string *)
    O := ABS(in) * EXP(N* 2.30258509299405);
    REAL_TO_STRF := DINT_TO_STRING(REAL_TO_DINT(O));
    (* add zeroes in front to make sure sting is at least 8 digits long *)
    FOR i := LEN(REAL_TO_STRF) TO N DO REAL_TO_STRF := CONCAT('0', REAL_TO_STRF); END_FOR;
    (* add a dot if n > 0 *)
    IF n > 0 THEN REAL_TO_STRF := INSERT(REAL_TO_STRF, '.', LEN(REAL_TO_STRF) - N); END_IF;
    (* add a minus sign if in is negative *)
    IF in < 0 THEN REAL_TO_STRF := CONCAT('-', REAL_TO_STRF); END_IF;
    Здесь и выбор кол. знаков после запятой и работает округление для отброшенных знаков.
    ЗЫ. Вариант предложенный capzap
    Код:
    bar := INT_TO_STRING(REAL_TO_INT(foo*100));
    bar := INSERT( bar,'.',LEN(bar)-2);
    IF FIND(bar,'.')=1 THEN
    	bar := INSERT( bar,'0',0);
    ELSIF bar = '0' THEN
    	bar := '0.00';
    END_IF;
    для значения переменной <0, например (-0.6462781) выдает строку "-.65", т.е без ведущего 0.
    Последний раз редактировалось petera; 05.05.2013 в 01:23.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  5. #5
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,054

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Когда-то для ПЛК73 сам сталкивался с подобным вопросом.Все уже придумано до нас..
    На ПЛК63/73 флеша нет, а на экран проще вывести через ShowReal. Формат более свободный : "Темп-ра %4.1f *С"

    Цитата Сообщение от capzap Посмотреть сообщение
    Вот если бы Вы подвергли мой код временному анализу и доказали что оскатовский код выполняется гораздо быстрее, тогда другое дело
    Путем различных ухищрений можно сделать аналог REAL_TO_STRING примерно в 3-4 раза быстрее. Но это оптимизация по скорости кода capzap'а. Ну и неплохо бы учесть варианты входа типа 0.02

Похожие темы

  1. Длинный STRING
    от Nazar в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 08.03.2011, 13:04
  2. Ответов: 1
    Последнее сообщение: 28.01.2011, 16:42
  3. Преобразование из string
    от Dima_31 в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 07.05.2010, 19:35
  4. String переменные в архиваторе
    от Антон в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 25.12.2007, 10:53

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •