我的XForm中有几个控件,我们只需将它们称为x和y。
x的值是8; y的值是8.000 我将约束设置为: $ x = $ y
显然,无论数据类型是双精度数还是十进制数,XForms都不认为这些值是相等的。
一种解决方案是: $ x - $ y = 0
但XForms会出现舍入错误吗? 所以现在它需要像: abs($ x - $ y)< 0.00001
是否有绝对值函数?
这对于应该简单的事情来说似乎很混乱。有没有更简单的方法让XForm考虑8 = 8.000?
答案 0 :(得分:1)
我不知道那种语言,但是在伪代码中:
设置一些非常小的$ epsilon:=。00001
然后检查$ x - $ y< $小量
这显然不会捕获所有舍入错误,但只要你的应用程序没有做任何太重要的事情(如果你不应该使用浮点数),这应该考虑8和8.000相同。 / p>
编辑:我注意到你已经提出了这个答案,所以忽略这个:)
答案 1 :(得分:1)
在比较之前,您需要先输出值。
<xforms:input
ref="foo"
xxforms:format="format-number(xs:integer(.), '###,##0')"/>
有关详细信息,请参阅this link。
答案 2 :(得分:0)
number()解决了问题,也不需要定义数据类型。请参阅以下简单代码。
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
xmlns:xforms="http://www.w3.org/2002/xforms">
<xhtml:head>
<xhtml:title>Xforms</xhtml:title>
<xforms:model>
<xforms:instance id="main-instance">
<form>
<nodes>
<x>8</x>
<y>8.00</y>
</nodes>
</form>
</xforms:instance>
<xforms:bind id="x" nodeset="instance('main-instance')/nodes/x" />
<xforms:bind id="y" nodeset="instance('main-instance')/nodes/y" />
</xforms:model>
</xhtml:head>
<xhtml:body>
<table>
<tr>
<td>
X is
<xforms:output bind="x">
<xforms:alert>Invalid</xforms:alert>
</xforms:output>
</td>
</tr>
<tr>
<td>
Y is
<xforms:output bind="y">
<xforms:alert>Invalid</xforms:alert>
</xforms:output>
</td>
</tr>
<tr>
<td>
<strong>X = Y ? </strong>
<xforms:output value="instance('main-instance')/nodes/x = instance('main-instance')/nodes/y">
<xforms:alert>Invalid</xforms:alert>
</xforms:output>
</td>
</tr>
<tr>
<td>
<strong>(using number function) X = Y ? </strong>
<xforms:output value="number(instance('main-instance')/nodes/x) = number(instance('main-instance')/nodes/y)">
<xforms:alert>Invalid</xforms:alert>
</xforms:output>
</td>
</tr>
</table>
</xhtml:body>
</xhtml:html>
但是当我们给两个节点提供xforms:decimal数据类型而不使用数字函数时,它将无效(条件返回false)。