powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему FormatFloat игнорирует заданный формат вывода?
15 сообщений из 15, страница 1 из 1
Почему FormatFloat игнорирует заданный формат вывода?
    #39529391
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
Почему FormatFloat игнорирует заданный формат вывода?
    #39529399
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FormatFloat,

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

Я ее читал, она рассказывает про хранение чисел в памяти, и что сопроцессор для обработки все числа приводит к Extended, но это не не про преобразование из строки в число и наоборот.
И с каких пор Single - теряет точность в середине целой части при преобразовании из строки???!!!
я бы понял если бы это была дробная часть, но это уже как-то...
Код: plaintext
1.
2.
123456789012345,54321 :String
123456788103168 :Single
...
Рейтинг: 0 / 0
Почему FormatFloat игнорирует заданный формат вывода?
    #39529430
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Почему FormatFloat игнорирует заданный формат вывода?
    #39529436
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest2013goldmi45,

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

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

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

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

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


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

Нет, за то не стух 😉😉😉😉
...
Рейтинг: 0 / 0
Почему FormatFloat игнорирует заданный формат вывода?
    #39529593
Guest2013
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Почему FormatFloat игнорирует заданный формат вывода?
    #39529647
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Почему FormatFloat игнорирует заданный формат вывода?
    #39529666
Guest2013
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Граур Станислав,

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


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


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