delphi - 如何限制 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,5678
,TDBEdit
控件显示1234,56
,但字段的值为1234,5678
。
Fld.EditMask := '9' + DecimalSeparator + '99;1; ';
不幸的是,这种方法引入了几个问题:
如何避免用户在小数部分键入超过 N 位(不添加任何其他类型的限制)?
解决方案
除了避免在字段中输入额外的数字之外,您还可以在将数字发布到数据集之前将其剥离。
去除 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;
推荐阅读
- javascript - Javascript Fetch 很慢(60ms vs 3ms)
- python - 错误:请求设置 INSTALLED_APPS,但未配置设置..?
- c++ - 为什么这段代码在 C++ 的第一个循环中省略了第二个单词
- python - 引发 MultiValueDictKeyError(key) django.utils.datastructures.MultiValueDictKeyError: 'image'
- python - 在一个 For 循环中获取 2 个数字
- sql - SQL - 显示查询
- javascript - 用特定字符串替换所有左边的空格
- php - 函数结果周围的 PHP Echo HTML 标记(Wordpress)
- c++ - 平衡括号问题(输出总是好的)
- c - 如何在 C 中实现多管道?