DLGCreateRealField中的格式和宽度代表什么

What does the format and width stand for in DLGCreateRealField

formatwidthDLGCreateRealField(number value, number width, number format)对话框功能中代表什么?文档对此没有任何说明。

TL;DR / 大多数情况

width是输入框在对话框中的显示宽度

format表示总共显示多少位小数点后至少保留一位。输入仅在初始状态 和 return 值 上格式化,但仅当输入更改时(还有一些例外情况,请参见下文)。用户可以键入 she/he 想要的任意数量的数字。该值是四舍五入的。 示例: 对于 format=3,值 1.234 显示为 1.23;值 123.456 显示为 123.4.

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


意外行为摘要

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

详情

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

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

用户可以输入 she/he 想要的数字。 (只允许数字、e、减号和点。第二个点之后的所有字符都将被忽略。)

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

请注意,在某些时候,数字会转换为指数表示法。也在输入字段中!这意味着值 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");
}