Страницы

19 марта 2012 г.

Lazarus. TDBGrid + ZeosLib 7. Отображение дробных чисел.

Добрый день.
 
       Недавно столкнулся с проблемой отображения вещественных чисел. Дело в том что прога, в которой была замечена проблема работает с финансами, поэтому точность отображения играет ключевую роль, дабы не привести к инфаркту будущих пользователей - финансистов.
       Искажение отображения происходило следующим образом:
Есть исходное число: 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.
Процедура выполняется всегда после открытия датасета.

       Если кто-то знает более оптимальный способ, просьба указать правильный путь. Спасибо :)

Комментариев нет:

Отправить комментарий