【问题标题】:How to validate values that must be integer, non negative, non decimal and not a string? (Or an alphabetic word) from an InputQuery?如何验证必须是整数、非负数、非小数且不是字符串的值? (或字母词)来自 InputQuery?
【发布时间】:2021-06-08 20:14:02
【问题描述】:

我使用 InputQuery 从用户那里获取一个值,但它只能是整数 (from 1 to 9999999...),不能是小数,也不能是字符串(不是 ABCDEF)或不是字母数字(A1B2C3)而不是特殊字符 (Hi!,)。在 delphi `RAD STUDIO 2010 中。

范围是捕获值,然后显示一条消息,告诉用户他必须只输入有效值。

我怎样才能做到这一点?

【问题讨论】:

  • 请注意,您对输入格式的描述可以大大简化:确实,如果s 是一个标准格式整数的字符串,那么它不是“十进制”而不是 。 .. 一些非整数字符串(包括英语、希腊语或俄语单词)。还要注意 1, 2, 3, ... 是 positive 整数,-1, -2, -3, ... negative 整数,0 是既不积极也不消极。 0, 1, 2, 3, ... 称为非负整数。
  • 您使用什么组件让用户输入值?如果是 TEdit,那么您可以设置其属性 NumbersOnly 以防止他们首先在编辑控件中输入除数字以外的任何其他字符。它甚至显示有关尝试在编辑框中输入不受支持的字符的默认操作系统消息。因此,您只需检查 EditBox 是否为空或不包含 0,因为当 NumbersOnly 属性设置为 true 时,用户甚至无法输入负号。
  • @SilverWarior:OP 说他们正在使用InputQuery 函数,所以它是标准的TEdit。当然,在 Delphi 10.4.2 中,您也可以使用新的TNumberBox 控件(或我的multi input box)。

标签: delphi delphi-2010


【解决方案1】:

这很简单:

var
  s: string;
  i: Integer;
begin

  if InputQuery(Caption, 'Please enter a positive integer:', s) then
    if TryStrToInt(s, i) and (i > 0) then
      ShowMessage('An excellent choice, sir!')
    else
      ShowMessage('That''s not a positive integer, is it?')

如果用户取消它(这是预期的),这将显示提示并且不执行任何操作。另一方面,如果用户确实输入了一个值,则会使用TryStrToInt 和一个简单的符号测试对其进行验证。

请注意,由于布尔短路评估,第二个合取 (i > 0) 只会在第一个合取 (TryStrToInt(s, i)) 评估为 True 时评估,因此我们永远不会测试未初始化的变量 @987654329 @(不过在这种情况下并不重要)。

您可能还想使用a more sophisticated input box 自动验证对话框中的输入(免责声明:我的网站)。


或者,您可以使用InputQuery 函数自己的验证功能,当用户单击确定时,它将验证输入:

var
  s: array of string;
  i: Integer;
begin
  SetLength(s, 1);
  if InputQuery(Caption, ['Please enter a positive integer:'], s,
    function(const Values: array of string): Boolean
    begin
      Result := (Length(Values) = 1) and TryStrToInt(Values[0], i) and (i > 0);
      if not Result then
        ShowMessage('That''s not a positive integer, is it?')
    end)
  then
    ShowMessageFmt('You chose %d. That''s an excellent choice, sir!', [i]);

【讨论】:

  • 感谢您的回复,所以在这种情况下,变量 i 无关紧要,仅用于填充 TryStrToInt 方法的第二个参数?
  • @BaldwinIV:您阅读过TryStrToInt 函数的文档吗?您应该始终阅读以任何编程语言使用的每个新功能的文档。 TryStrToInt(s, i) 返回 True iff s 可以解析为整数。如果是这样,i 会收到此解析值。所以你可能想使用i——否则你不会向用户询问整数!
  • 我明白了,您正在使用转换后的 String 来评估下一个条件并保持所需的正确整数值,非常感谢!我会看到你的输入框
  • 只是一个小改进,因为你永远不会使用负值。您可以使用 StrToUInt 和 i:Cardinal(或 LongWord) - 然后您不需要检查 i>0 并且您可以接受从 0 到 4bill 而不是 0 到 2bill(大约)的值。
  • @HeartWare:OP 说他们只需要 Q 正文中的 正数 数(“从 1 到 9999999 ...”)和 Q 中的“非负数”标题。这些是相互矛盾的。假设 OP 确实只需要 1、2、3、...(正数),您仍然需要 i > 0 检查来处理 0,这是一个完全有效的 Cardinal
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2019-10-15
  • 2011-12-20
  • 2017-11-15
相关资源
最近更新 更多