首页 > 解决方案 > DLGCreateRealField 中的格式和宽度代表什么

问题描述

对话功能中的formatwidth代表什么?DLGCreateRealField(number value, number width, number format)该文档没有说明任何内容。

标签: dialogdm-script

解决方案


TL;DR / 大多数情况

width是对话框中输入字段的显示宽度。

告诉总共format多少位显示在小数点分隔符后至少保留一位数字。输入仅在初始状态和返回值上格式化,但仅在输入更改时才格式化(还有一些例外,见下文)。用户可以键入任意数量的数字。该值已四舍五入。示例: 对于值显示为; 该值显示为。format=31.2341.23123.456123.4

请注意,下面提到了一些奇怪的极端情况。


意外行为总结

  1. 仅在触摸输入时返回值正确格式化/舍入(否则为 6 位)
  2. 如果输入在小数点分隔符前正好有 6 位,则返回值不四舍五入(无论哪种格式)
  3. 1.2e8如果值大于 100 000 000(无论哪种格式),显示的值将转换为指数表示法(例如)

细节

示例对话框

该图显示了使用以下代码创建的示例对话框。前三个输入有width8 个,后三个输入有width16 个。这很容易理解。

现在format: 每个输入都format等于它的标签。第一个输入format是 2,最后一个输入format是 9。在创建时,输入显示与指定一样多的数字,但小数分隔符后至少显示一个数字。对于第一个输入,总共是两位数。但因为 12 已经包含两位数,所以保留小数分隔符后的第一位。所有其他输入都显示此行为,因为总数字永远不会超过指定的数字。正如您在7上看到的那样,数字是四舍五入的,而不仅仅是截断的。

用户可以输入任意数量的数字。(只e允许数字、、减号和点。第二个点之后的所有字符都被忽略。)

如果用户没有更改任何内容并按下OK,则返回值将按照上述规则四舍五入到 6 位。一旦触摸输入(也输入一位数字然后立即删除就足够了),输入将在format...上四舍五入,除非输入中的值在小数点分隔符前正好有 6 位数字。然后它作为一个整数返回,初始值的格式仍然正确。呸...

请注意,在某些时候,数字会转换为指数符号。也在输入字段中!这意味着该值123456789显示为1.23456789e+8。指数符号format再次遵循规则(不计算指数数字)。这意味着在第一个输入字段中format=2,值显示为1.2e+8

以下代码用于创建屏幕截图。

TagGroup DLG, DLGItems;

DLG = DLGCreateDialog( "Please enter values", DLGItems);

TagGroup val2tg, val3tg, val4tg, val5tg, val7tg, val9tg;

DLGitems.DLGAddElement(DLGCreateRealField("Two:  ", val2tg, 12.123456789123, 8, 2));
DLGitems.DLGAddElement(DLGCreateRealField("Three:", val3tg, 12.123456789123, 8, 3));
DLGitems.DLGAddElement(DLGCreateRealField("Four: ", val4tg, 12.123456789123, 8, 4));
DLGitems.DLGAddElement(DLGCreateRealField("Five: ", val5tg, 12.123456789123, 16, 5));
DLGitems.DLGAddElement(DLGCreateRealField("Seven:", val7tg, 12.123456789123, 16, 7));
DLGitems.DLGAddElement(DLGCreateRealField("Nine: ", val9tg, 12.123456789123, 16, 9));

object dialog = alloc(UIFrame).init(DLG);
if(dialog.pose()){
    Result("\n= = =\n");
    Result("Two:   " + val2tg.DLGGetValue() + "\n");
    Result("Three: " + val3tg.DLGGetValue() + "\n");
    Result("Four:  " + val4tg.DLGGetValue() + "\n");
    Result("Five:  " + val5tg.DLGGetValue() + "\n");
    Result("Seven: " + val7tg.DLGGetValue() + "\n");
    Result("Nine:  " + val9tg.DLGGetValue() + "\n");
}

推荐阅读