Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему FormatFloat игнорирует заданный формат вывода? / 15 сообщений из 15, страница 1 из 1
02.10.2017, 14:02:11
    #39529391
FormatFloat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
День добрый уважаемые.
Ищу способ нестандартного форматирования числа, но напоролся на проблему преобразования через StrToFloat и FormatFloat .
-Очень сильно страдает точность (особенно в Single теряется разряд в целой части что недопустимо).
-Игнорирует пользовательский формат разделителя тысяч, и всегда выводит одинаковый результат

Проверяю на Delphi 10.2 Tokyo, Win10x64
Может подскажете какую альтернативу искать?
Мне нужно преобразовать число с нужным мне (пользовательским) форматированием
Если ли способы из коробки, или придется заморачиваться с велосипедом и собственноручно расталкивать разряды?
Заранее благодарствую.

Пример:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
procedure TForm1.Button1Click(Sender: TObject);
var
  vSingle: Single;
  vDouble: Double;
  vExtended: Extended;
  S: string;
  FS: TFormatSettings;
begin
  FS := TFormatSettings.Create;
  FS.ThousandSeparator := '`';
  FS.DecimalSeparator := ',';
  S := '123456789012345,54321';
  vSingle := StrToFloat(S, FS);
  vDouble := StrToFloat(S, FS);
  vExtended := StrToFloat(S, FS);
  Memo1.Lines.Add(S + ' :String');
  Memo1.Lines.Add(vSingle.ToString + ' :Single');
  Memo1.Lines.Add(vDouble.ToString + ' :Double');
  Memo1.Lines.Add(vExtended.ToString + ' :Extended');
  Memo1.Lines.Add('--Single---');
  S := FormatFloat('#,##0.0000', vSingle, FS);
  Memo1.Lines.Add(S);
  S := FormatFloat('##,##,##,##0.0000;-##,##,##,##0.0000;0.0000', vSingle, FS);
  Memo1.Lines.Add(S);
  Memo1.Lines.Add('--Double---');
  S := FormatFloat('#,##0.0000', vDouble, FS);
  Memo1.Lines.Add(S);
  S := FormatFloat('##,##,##,##0.0000;-##,##,##,##0.0000;0.0000', vDouble, FS);
  Memo1.Lines.Add(S);
  Memo1.Lines.Add('--Extended---');
  S := FormatFloat('#,##0.0000', vExtended, FS);
  Memo1.Lines.Add(S);
  S := FormatFloat('##,##,##,##0.0000;-##,##,##,##0.0000;0.0000', vExtended, FS);
  Memo1.Lines.Add(S);
end;



на выходе получаем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
123456789012345,54321 :String
123456788103168 :Single
123456789012346 :Double
123456789012346 :Extended
--Single---
123`456`788`103`168,0000
123`456`788`103`168,0000
--Double---
123`456`789`012`345,5470
123`456`789`012`345,5470
--Extended---
123`456`789`012`345,5430
123`456`789`012`345,5430
...
Рейтинг: 0 / 0
02.10.2017, 14:27:04
    #39529399
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
FormatFloat,

Почитайте про представление вещественных чисел в двоичном коде, про вещественные типы данных, тогда, возможно, часть вопросов отпадёт сама собой.
...
Рейтинг: 0 / 0
02.10.2017, 14:40:50
    #39529408
Guest2013
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
goldmi45,

Я ее читал, она рассказывает про хранение чисел в памяти, и что сопроцессор для обработки все числа приводит к Extended, но это не не про преобразование из строки в число и наоборот.
И с каких пор Single - теряет точность в середине целой части при преобразовании из строки???!!!
я бы понял если бы это была дробная часть, но это уже как-то...
Код: plaintext
1.
2.
123456789012345,54321 :String
123456788103168 :Single
...
Рейтинг: 0 / 0
02.10.2017, 15:03:08
    #39529430
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
Guest2013...
И с каких пор Single - теряет точность в середине целой части при преобразовании из строки???!!!
я бы понял если бы это была дробная часть, но это уже как-то...
Код: plaintext
1.
2.
123456789012345,54321 :String
123456788103168 :Single

Если читали, то может заметили, что мантисса у Single - 23 бита. Плюс еще 1 из-за формата хранения - как написано тут http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=374 , неформально говоря, к этому добавляется слева двоичное "1." получается 24 бита. 2 в 24 степени = 16777216. Вот у вас примерно 8 знаков точности. Так у вас и получилось - 8 знаков точно, а дальше уже погрешность.
...
Рейтинг: 0 / 0
02.10.2017, 15:11:45
    #39529436
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
Guest2013goldmi45,

Я ее читал, она рассказывает про хранение чисел в памяти, и что сопроцессор для обработки все числа приводит к Extended, но это не не про преобразование из строки в число и наоборот.
И с каких пор Single - теряет точность в середине целой части при преобразовании из строки???!!!
я бы понял если бы это была дробная часть, но это уже как-то...
Код: plaintext
1.
2.
123456789012345,54321 :String
123456788103168 :Single

Нет никакой "целой" и "дробной" части. Иди, снова читай.
...
...Няшик, снова ты отжигаешь?
...
Рейтинг: 0 / 0
02.10.2017, 15:16:16
    #39529441
Guest2013
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
s62,

Я Вас понимаю, но "точность" - относится к дробной части числа.
А тут на ровном месте - 9 миллионов. (на мой взгяд, тут явно просматривается ошибка в функции преобразования строки в число).
...
Рейтинг: 0 / 0
02.10.2017, 15:22:00
    #39529444
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
Guest2013s62,

Я Вас понимаю, но "точность" - относится к дробной части числа.
...Неправильно.
Вот представьте, у вас есть байт и нужно с его помощью работать с числом 12345. Точно не получится, хотя 12345 - не дробное, а целое число. Почему? Размерчик (байта) маловат, нужно больше байтjd, чтобы точно сохранить 12345. Аналогично и в вашей ситуации с Single.
...
Рейтинг: 0 / 0
02.10.2017, 15:22:45
    #39529446
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
s62,
*байтов
...
Рейтинг: 0 / 0
02.10.2017, 15:24:10
    #39529451
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
Guest2013...Я Вас понимаю, но "точность" - относится к дробной части числа...
Понедельник - день тяжёлый.
...
Рейтинг: 0 / 0
02.10.2017, 15:29:45
    #39529461
Guest2013
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
s62,

согласен, тут целая часть вмещается в 6 байт а, не в 4 (виноват проглядел)
остается 2-я часть вопроса, произвольный формат числа (есть мысли?)
...
Рейтинг: 0 / 0
02.10.2017, 16:46:51
    #39529540
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
FormatFloat-Игнорирует пользовательский формат разделителя тысячГде?
FormatFloat
Код: pascal
1.
FS.ThousandSeparator := '`';


FormatFloat123`456`788`103`168,0000
...
Рейтинг: 0 / 0
02.10.2017, 16:58:38
    #39529545
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
чччД...Няшик, снова ты отжигаешь?

Нет, за то не стух 😉😉😉😉
...
Рейтинг: 0 / 0
02.10.2017, 17:52:49
    #39529593
Guest2013
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
_Vasilisk_,

я предполагал что FormatFloat такое умеет (но оказалось что нет):
Код: plaintext
1.
2.
3.
12`34`56`78`90`12`345,54321 - '##,##,##,##,##,##,##0.0000'
12`345`678`901`2345,54321 - '###,###,###,###,###0,0000'
12345678901`2345,54321 - '############,###0,0000'
...
Рейтинг: 0 / 0
02.10.2017, 19:10:36
    #39529647
Граур Станислав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
Guest2013я предполагал что FormatFloat такое умеет (но оказалось что нет):
Код: plaintext
1.
2.
3.
12`34`56`78`90`12`345,54321 - '##,##,##,##,##,##,##0.0000'
12`345`678`901`2345,54321 - '###,###,###,###,###0,0000'
12345678901`2345,54321 - '############,###0,0000'


Тебе точно исходное значение нужно во float хранить, а не в varchar/string ?
...
Рейтинг: 0 / 0
02.10.2017, 20:19:34
    #39529666
Guest2013
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему FormatFloat игнорирует заданный формат вывода?
Граур Станислав,

Сохраняются все значения.
упрощенно:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
TMyObject = class
private
  FFS: TFormatSettings;
  FValue: Extended; //число
  FText: string;  //текст
  FDisplayText: string; //отображение
  {...}
end;


- меняется число -> меняется текст и отображение
- меняется текст -> меняется число и отображение
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему FormatFloat игнорирует заданный формат вывода? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]