OberonCore https://forum.oberoncore.ru/ |
|
Преобразование REAL в строку https://forum.oberoncore.ru/viewtopic.php?f=23&t=568 |
Страница 1 из 1 |
Автор: | Штирлиц [ Четверг, 12 Июль, 2007 15:47 ] |
Заголовок сообщения: | Преобразование REAL в строку |
Есть ли в Blackbox (или сторонних библиотеках) функция преобразование REAL в строку по типу дельфийской string s := FormatFloat('0.#', realValue); если realValue = 1.5, то s = 1.5, а если realValue = 1.0, то s = '1', А то RealToStringForm в конце добавляет '.0'. |
Автор: | Иван Кузьмицкий [ Пятница, 13 Июль, 2007 14:19 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Таковой не видел. Вообще, это интересный вопрос. Подобных небольших сервисных функций довольно часто не хватает. По идее, есть смысл накапливать подобный сервис централизованно, например, в подсистеме Mt. |
Автор: | Штирлиц [ Пятница, 13 Июль, 2007 14:46 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Иван А. Кузьмицкий писал(а): Таковой не видел.
Вообще, это интересный вопрос. Подобных небольших сервисных функций довольно часто не хватает. По идее, есть смысл накапливать подобный сервис централизованно, например, в подсистеме 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; |
Автор: | Евгений Темиргалеев [ Суббота, 14 Июль, 2007 11:08 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Штирлиц писал(а): ...А то RealToStringForm в конце добавляет '.0'. Я думаю, это делается для того, чтобы указать тип числа. При считывании этого числа, например, сканером, мы получим тогда тип REAL, т.е. тот тип, который записывали, а не INTEGER.
|
Автор: | Darksnake [ Среда, 18 Июль, 2007 14:40 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Вообще, паскалевские (и обероновские) строки - тип доавольно своеобразный, поэтому имеет смыл посвятить им отдельный модуль. Помнится, пришлось мне как-то мучаться, переписывая под С половину бибилиотеки для работы с конечными строками. Например такие функции, которые возвращают по строке ее длинну, или функция, которая ищет подстроку в строке и возвращает ее положение - все очень простенькие вещи, но каждый раз пререписывать их заново -ушибиться можно. |
Автор: | Евгений Темиргалеев [ Среда, 18 Июль, 2007 14:44 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Darksnake писал(а): Вообще, паскалевские (и обероновские) строки - тип доавольно своеобразный... Очень интересно, какие строки Вы имеете в виду? Если в паскале был особый тип string, то в обероне его уже нет.
|
Автор: | Darksnake [ Среда, 18 Июль, 2007 14:59 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Я помню, но аналоги все равно используются. Я имею ввиду строки фиксированного размера. |
Автор: | Евгений Темиргалеев [ Среда, 18 Июль, 2007 15:10 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Darksnake писал(а): Помнится, пришлось мне как-то мучаться, переписывая под С половину бибилиотеки для работы с конечными строками. В Обероне строки организованы как в Си. А глядя на Ваше высказывание, мне кажется, что Вы имеете в виду какие-то другие. Других же в Обероне нет.
|
Автор: | Иван Горячев [ Среда, 18 Июль, 2007 15:15 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Евгений Темиргалеев писал(а): В Обероне строки организованы как в Си. С маленьким дополнением - функцией LEN ![]() |
Автор: | Евгений Темиргалеев [ Среда, 18 Июль, 2007 15:29 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Ivor писал(а): Евгений Темиргалеев писал(а): В Обероне строки организованы как в Си. С маленьким дополнением - функцией LEN ![]() ![]() Но не будем также забывать, про контроль индексов, передачу открытых массивов в качестве параметров, наконец, сборку мусора. В общем, как кое-кто говорил, "здесь вам не Цы". ![]() |
Автор: | Иван Горячев [ Четверг, 19 Июль, 2007 00:20 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Я тоже имел ввиду способ хранения - обероновсие строки имеют указатель длины, хоть и максимальной. А это дело влияет на построение многих алгоритмов. |
Автор: | Евгений Темиргалеев [ Четверг, 19 Июль, 2007 08:10 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
А по-моему, указателем длины обладают не строки, а массивы ![]() |
Автор: | Иван Горячев [ Четверг, 19 Июль, 2007 08:51 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Евгений Темиргалеев писал(а): А по-моему, указателем длины обладают не строки, а массивы ![]() Один чёрт, в C этого нет. Короче, действительно "здесь Вам не Цы" ![]() |
Автор: | Info21 [ Четверг, 19 Июль, 2007 10:43 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
LEN( s ) -- длина массива LEN( s$ ) -- длина строки a+b -- конкатенация строк -- или вопрос был не про то? |
Автор: | Евгений Темиргалеев [ Четверг, 19 Июль, 2007 10:46 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Вопрос был про то, что LEN(s$) вычисляется (как strlen в Си), а LEN(s) - хранится в тэге типа (и в Си этого нет). ![]() |
Автор: | Darksnake [ Вторник, 24 Июль, 2007 11:20 ] |
Заголовок сообщения: | Re: Преобразование REAL в строку |
Вопрос был про функции Len, Pos, а также суммирование, вычитание строк и куча всего другого в том числе и для работы с фиксированными строками. В общем, я понял что хотел. В случае чего сам напишу, не так уж это и долго. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |