首页 > 解决方案 > 如何限制 ftFloat 字段的小数位数?

问题描述

我需要限制用户可以键入作为ftFloat字段值的小数位数。

var
  Dst : TClientDataSet;
  Dsc : TDataSource;
  Fld : TNumericField;
  Edt : TDBEdit;
begin
  //dataset
  Dst := TClientDataSet.Create(Self);
  Dst.FieldDefs.Add('TEST', ftFloat);
  Dst.CreateDataSet();
  Dst.Active := True;
  Fld := Dst.Fields[0] as TNumericField;
  Dst.Append();
  Fld.AsFloat := 1234.56;
  Dst.Post();

  //field
  Fld.DisplayFormat := '0,.##'; //2 optional decimals, with thousands separator
  Fld.EditFormat := '0.##'; //2 optional decimals, withhout thousands separator

  //datasource
  Dsc := TDataSource.Create(Self);
  Dsc.DataSet := Dst;

  //control
  Edt := TDBEdit.Create(Self);
  Edt.DataSource := Dsc;
  Edt.DataField := Fld.FieldName;
  Edt.Top := 5;
  Edt.Left := 5;
  Edt.Parent := Self;
end;

在示例中,键入 后1234,5678TDBEdit控件显示1234,56,但字段的值为1234,5678

正如此答案中所建议的,我尝试使用该EditMask属性。

Fld.EditMask := '9' + DecimalSeparator + '99;1; ';

不幸的是,这种方法引入了几个问题:

  1. 我无法为整数部分设置可变位数(例如,无法输入诸如12, ... 之类的值)123
  2. 我无法设置负值(例如-1-12无法输入的值)
  3. 小数点分隔符在编辑时始终可见。

    在此处输入图像描述

如何避免用户在小数部分键入超过 N 位(不添加任何其他类型的限制)?

标签: delphidelphi-2007masking

解决方案


除了避免在字段中输入额外的数字之外,您还可以在将数字发布到数据集之前将其剥离。

去除 TDataset.OnBeforePost 事件上的“额外”数字,或者最好使用 TDatasource 的 OnDataChange 事件。(伪代码,未经测试)

procedure TSomeClass.OnDataChange(aField:TField)
begin
  if Assigned(aField) and (aField.FieldName='TEST') and not aField.IsNull then
    aField.AsFloat:=round(aField.AsFloat*100)/100.0;    
end;

推荐阅读