Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 17

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

  1. #1

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

    Необходимо чтобы при преобразовании REAL_TO_STRING, значение переменной
    округлялось до второго знака после запятой. Т.е. REAL_TO_STRING(XXX) при значении "X",
    например 1.111111, значение STRING было бы 1.11, а не 1.111111. Как это осуществить?

  2. #2

    Exclamation

    Цитата Сообщение от capzap Посмотреть сообщение
    попробуйте так
    Спасибо, помогло! А как быть если foo=0.111111? Выдаёт в STRING ".11", а хотелось чтобы было "0.11"?

  3. #3

    Exclamation

    Цитата Сообщение от capzap Посмотреть сообщение
    проверяйте, если точка занимает первое знакоместо то добавляете ноль в начало строки, это Вам в качестве домашнего задания
    Не хотелось бы это в ручную делать, в зависимости от значения переменной (1.111111 или 0.111111), хотелось бы чтобы результат был всегда 1.11 или 0.11, без ручного добавления "0" в начало строки, как Вы пишите...
    Это возможно сделать?

  4. #4
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Код:
    PROGRAM PLC_PRG
    VAR
    	pi: REAL := 3.141592;
    	str: STRING;
    END_VAR
    
    str := REAL_TO_STRING(REAL_TO_INT(pi * 100) / REAL#100);
    Но если для визуализации, то там всё проще. См. справку.

  5. #5

    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"...

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

    По умолчанию

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

  7. #7

    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;
    Никогда бы не подумал, что такая простая задача решается таким кодом. Но всё равно спасибо!

  8. #8
    Пользователь Аватар для 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

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

    По умолчанию

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

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

  10. #10
    Пользователь
    Регистрация
    09.08.2013
    Адрес
    Башкортостан
    Сообщений
    236

    По умолчанию

    Потребовалось округление до 1 знака после запятой. Алгоритм должен быть наименее ресурсоемкий.
    На Ваш суд:

    Код:
    FUNCTION REAL_TO_STRINGF : STRING[20]
    VAR_INPUT
    	Real_X:	REAL;
    END_VAR
    VAR
    	pt_in:  	POINTER TO BYTE;
    	pt_out:	POINTER TO BYTE;
    	instr:		STRING[20];
    	strlen, i:	INT;
    END_VAR
    
    IF ABS( Real_X ) < 0.1 THEN
    	REAL_TO_STRINGF := '0.0';
    	RETURN;
    END_IF;
    instr := REAL_TO_STRING( Real_X );
    strlen := LEN(instr);
    pt_in := ADR(instr);
    pt_out := ADR( REAL_TO_STRINGF );
    i:= 1;
    WHILE i <= strlen DO
    	IF pt_in^ = 46 THEN
    		pt_out^ := pt_in^;
    		IF i = strlen THEN
    			pt_out := pt_out + 1;
    			pt_out^ := 48;
    		ELSE
    			pt_in := pt_in + 1;
    			pt_out := pt_out + 1;
    			pt_out^ := pt_in^;
    		END_IF;
    		EXIT;
    	END_IF;
    	pt_out^ := pt_in^;
    	pt_in := pt_in + 1;
    	pt_out := pt_out + 1;
    	i := i +1;
    END_WHILE
    pt_out := pt_out + 1;
    pt_out^ := 0;

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  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

Ваши права

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