0

任何人都可以解释为什么(如何) xtype: numberfield 值将自动更正(更改),如果我提供超过 16 位的值。例如:

  1. 22222222222222222 改为 22222222222222224
  2. 222222222222222222 改为 222222222222222200
  3. 2222222222222222222 改为 2222222222222222300
  4. 22222222222222222222 改为 22222222222222220000
  5. 222222222222222222222 改为 222222222222222230000
  6. 2222222222222222222222 改为 2.2222222222222222e+21
  7. 22222222222222222222222 改为 2.2222222222222223e+22

当在我的组件jsp页面中获取值时,渲染后会导致我的页面如下所示 NumberFieldTestValue:<%= properties.get("numberfieldname","") %> 结果如下

NumberFieldTestValue: 2.2222222222222223e+22
4

1 回答 1

3

问题

这种行为是由于对话行为是在 JavaScript 中实现的。您遇到问题的数字无法在其中表示。

该语言符合 ECMASCRIPT 5.1 规范。

引用Number 类型说明

所有大小不大于 2^53 的正负整数都可以用 Number 类型表示

以 2 为底的对数2222222222222222222222约为 70,这意味着该数字超过了最大值。因此你的问题。

总而言之,如果您在浏览器的纯 JS 控制台中检查您的示例,将显示相同的行为,因此这不是真正的 CQ 问题。

解决方案 1 - 使用不同的类型

为避免这种情况,您可能会使用xtype="textfield"正则表达式并对其进行验证,以查看它是否仅包含数字。然后,您必须确保使用能够在后端保存此类数字的类型(例如BigInteger)。

该字段可能如下所示:

<numberOfSandGrains
  jcr:primaryType="cq:Widget"
  fieldLabel="Number of grains of sand at the beach"
  name="./grainsCount"
  regex="/\d+/"
  regexText="Please enter a numeric value."
  xtype="textfield"/>

解决方案 2 - 更改规模

另一种选择是更改配置背后的逻辑并在适用时使用一些不同的单位。例如,如果值 2222222222222222222222 是克数(物体/物质的重量),那么以公吨为单位读取它是非常有意义的(至少在许多情况下)。作者可能不用输入如此庞大的数字。

如果你走这条路,你需要格外小心。

于 2013-10-03T15:40:04.287 回答