OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 16 Июнь, 2025 23:31

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Преобразование REAL в строку
СообщениеДобавлено: Четверг, 12 Июль, 2007 15:47 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Есть ли в Blackbox (или сторонних библиотеках)
функция преобразование REAL в строку по типу дельфийской

string s := FormatFloat('0.#', realValue);
если realValue = 1.5, то s = 1.5, а если realValue = 1.0, то s = '1',

А то RealToStringForm в конце добавляет '.0'.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Пятница, 13 Июль, 2007 14:19 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Таковой не видел.
Вообще, это интересный вопрос. Подобных небольших сервисных функций довольно часто не хватает. По идее, есть смысл накапливать подобный сервис централизованно, например, в подсистеме Mt.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Пятница, 13 Июль, 2007 14:46 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Иван А. Кузьмицкий писал(а):
Таковой не видел.
Вообще, это интересный вопрос. Подобных небольших сервисных функций довольно часто не хватает. По идее, есть смысл накапливать подобный сервис централизованно, например, в подсистеме Mt.


Я поступил вот так
precision - (точность) макс. чило цифр после запятой;
minDigits - мин чило цифр после запятой или менее

если minDigits < precision, то получается аналогично
дельфийской '0.#', '0.0#' и т.д.

если minDigits > precision, то число цифр = precision
если minDigits = precision, то получается аналогично
дельфийской '0.0', '0.00' и т.д.

Вроде как работает.

Код:
PROCEDURE RealToString* (x: REAL; minDigits, precision: INTEGER; OUT s: ARRAY OF CHAR);
      VAR
         n, i, j, p: INTEGER;
        p10: REAL; 
   BEGIN
      ASSERT(precision >= 0, 20);
      ASSERT(minDigits >= 0, 21);
      p := precision;
      IF p = 0 THEN   p := 1 END;
      p10 := Math.IntPower(10.0, p);
      x := Math.Round(p10*x)/p10;
      Strings.RealToStringForm(x, 16, 0, -p, Strings.digitspace, s);
    j := LEN(s$) - 1;
    IF precision = 0 THEN
       IF s[j - 1] = '.' THEN s[j - 1] := 0X END
    ELSE
         n := precision - minDigits;
       WHILE (j >= 0) & (s[j] = '0') & (n > 0) DO s[j] := 0X; DEC(j); DEC(n) END;
         IF (j > 0) & (s[j] = '.') THEN s[j] := 0X END
    END      
   END RealToString;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Суббота, 14 Июль, 2007 11:08 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Штирлиц писал(а):
...А то RealToStringForm в конце добавляет '.0'.
Я думаю, это делается для того, чтобы указать тип числа. При считывании этого числа, например, сканером, мы получим тогда тип REAL, т.е. тот тип, который записывали, а не INTEGER.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Среда, 18 Июль, 2007 14:40 

Зарегистрирован: Пятница, 29 Июнь, 2007 12:16
Сообщения: 98
Вообще, паскалевские (и обероновские) строки - тип доавольно своеобразный, поэтому имеет смыл посвятить им отдельный модуль. Помнится, пришлось мне как-то мучаться, переписывая под С половину бибилиотеки для работы с конечными строками.
Например такие функции, которые возвращают по строке ее длинну, или функция, которая ищет подстроку в строке и возвращает ее положение - все очень простенькие вещи, но каждый раз пререписывать их заново -ушибиться можно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Среда, 18 Июль, 2007 14:44 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Darksnake писал(а):
Вообще, паскалевские (и обероновские) строки - тип доавольно своеобразный...
Очень интересно, какие строки Вы имеете в виду? Если в паскале был особый тип string, то в обероне его уже нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Среда, 18 Июль, 2007 14:59 

Зарегистрирован: Пятница, 29 Июнь, 2007 12:16
Сообщения: 98
Я помню, но аналоги все равно используются. Я имею ввиду строки фиксированного размера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Среда, 18 Июль, 2007 15:10 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Darksnake писал(а):
Помнится, пришлось мне как-то мучаться, переписывая под С половину бибилиотеки для работы с конечными строками.
В Обероне строки организованы как в Си. А глядя на Ваше высказывание, мне кажется, что Вы имеете в виду какие-то другие. Других же в Обероне нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Среда, 18 Июль, 2007 15:15 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Евгений Темиргалеев писал(а):
В Обероне строки организованы как в Си.

С маленьким дополнением - функцией LEN :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Среда, 18 Июль, 2007 15:29 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Ivor писал(а):
Евгений Темиргалеев писал(а):
В Обероне строки организованы как в Си.

С маленьким дополнением - функцией LEN :)
А сложения строк там нет? ... Чего не знаю, того не знаю. :) Если говорить про КП, то самые важные операции (копирование, сложение, длина - в Си они все в стандартной библиотеке) включены в язык. Но способ хранения (что я имел в виду под организацией) - один в один.

Но не будем также забывать, про контроль индексов, передачу открытых массивов в качестве параметров, наконец, сборку мусора. В общем, как кое-кто говорил, "здесь вам не Цы". :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Четверг, 19 Июль, 2007 00:20 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Я тоже имел ввиду способ хранения - обероновсие строки имеют указатель длины, хоть и максимальной. А это дело влияет на построение многих алгоритмов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Четверг, 19 Июль, 2007 08:10 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
А по-моему, указателем длины обладают не строки, а массивы :) В которых не обязательно будет храниться строка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Четверг, 19 Июль, 2007 08:51 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Евгений Темиргалеев писал(а):
А по-моему, указателем длины обладают не строки, а массивы :) В которых не обязательно будет храниться строка.

Один чёрт, в C этого нет. Короче, действительно "здесь Вам не Цы" :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Четверг, 19 Июль, 2007 10:43 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
LEN( s ) -- длина массива
LEN( s$ ) -- длина строки
a+b -- конкатенация строк -- или вопрос был не про то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Четверг, 19 Июль, 2007 10:46 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Вопрос был про то, что LEN(s$) вычисляется (как strlen в Си), а LEN(s) - хранится в тэге типа (и в Си этого нет). :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Преобразование REAL в строку
СообщениеДобавлено: Вторник, 24 Июль, 2007 11:20 

Зарегистрирован: Пятница, 29 Июнь, 2007 12:16
Сообщения: 98
Вопрос был про функции Len, Pos, а также суммирование, вычитание строк и куча всего другого в том числе и для работы с фиксированными строками. В общем, я понял что хотел. В случае чего сам напишу, не так уж это и долго.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB