Добрый день.
Недавно столкнулся с проблемой отображения вещественных чисел. Дело в том что прога, в которой была замечена проблема работает с финансами, поэтому точность отображения играет ключевую роль, дабы не привести к инфаркту будущих пользователей - финансистов.
Искажение отображения происходило следующим образом:
Есть исходное число: 1 400 940.05 - в таком виде оно хранилось в базе.
1 400 940 - в таком виде оно отображалось в DBGrid.
Вероятнее всего искажения происходили потому, что по умолчанию, DBGrid в совокупности с датасетом от Zeos отображает один символ после зщапятой. Т.е. число 123.4 - отобразится корректно, а число 123.04 - без дробной части.
Для обхода такого неприятного ограничения я написал процедуру:
Это ее первая версия, т.к. при обнаружении глюков буду расширять пока еще одновариантный CASE.
Процедура выполняется всегда после открытия датасета.
Если кто-то знает более оптимальный способ, просьба указать правильный путь. Спасибо :)
Недавно столкнулся с проблемой отображения вещественных чисел. Дело в том что прога, в которой была замечена проблема работает с финансами, поэтому точность отображения играет ключевую роль, дабы не привести к инфаркту будущих пользователей - финансистов.
Искажение отображения происходило следующим образом:
Есть исходное число: 1 400 940.05 - в таком виде оно хранилось в базе.
1 400 940 - в таком виде оно отображалось в DBGrid.
Вероятнее всего искажения происходили потому, что по умолчанию, DBGrid в совокупности с датасетом от Zeos отображает один символ после зщапятой. Т.е. число 123.4 - отобразится корректно, а число 123.04 - без дробной части.
Для обхода такого неприятного ограничения я написал процедуру:
procedure TZPostgresQuery.SetDisplayFormat;
var
i:integer;
fCount:integer;
begin
i:=0;
fCount:=0;
if FQuery.Active then
begin
fCount:=FQuery.FieldCount;
for i:=0 to fCount-1 do
case FQuery.Fields[i].DataType of
ftFloat:TFloatField(FQuery.Fields[i]).DisplayFormat := '#0.##';
{ TODO -odrmiller : Если формат указать как ",#.##", то числа будут отображаться с разделением по три,
но на винде вместо разделителя пробела ставится символ "?". }
end;
end;
end;
Это ее первая версия, т.к. при обнаружении глюков буду расширять пока еще одновариантный CASE.
Процедура выполняется всегда после открытия датасета.
Если кто-то знает более оптимальный способ, просьба указать правильный путь. Спасибо :)
Комментариев нет:
Отправить комментарий