2011-04-12 31 views
0

HI全部 我是單元測試我的貨幣字段,我發現這個問題可以被視爲一個錯誤。在四捨五入之前完成貨幣字段約束檢查

<xforms:bind id="amount" nodeset="instance('form')/data/amount" 
constraint="if(.!='') then number(.) >0 and string-length(.)&lt;20 else ."/> 
... 
<fr:currency bind="amount" xxforms:maxlength="50" incremental="true"> 
    <xforms:alert>Value should be below $ 9,999,999,999,999,999,999.99</xforms:alert> 
</fr:currency> 

我試圖在上述情況下,實現爲條件,把一個最大值檢查<「9999999,999999999.99」這19個字符總數。 (我曾嘗試過約束=「if(。='')然後是true()else number(。)< 10000000000000000」而不是長度檢查,但稍後看到該數字檢查中的一些錯誤切換到此字符串長度檢查)

現在在這種情況下字符串長度的問題是 如果我輸入「9,999,999,999,999,999.991」發生以下情況 1.執行約束檢查。它返回'假'爲「9999999999999999.991」= 20長度 2.貨幣金額四捨五入。

所以我的約束檢查失敗。但是,如果我點擊該字段並在字段外單擊,約束檢查返回true

任何人都可以提出一個更好的方法來做到這一點或如何解決上述問題。

回答

0

有幾件事情需要注意:

xxforms:maxlength不上fr:currency或任何其他fr:控制

數字是對其他數字評估爲double-precision 64-bit floating point type工作。在對數字進行評估時考慮到這一點。基本上這意味着大量的數字會變成四捨五入。大量評估所遇到的問題可能不是一個錯誤,而只是數學。

  • 例如,9999999999999998976.00和10000000000000001023.99所有的數字計算爲1.0E19
+1

我們已經找到一種複雜的方式使用約束=「比賽(做驗證,「(^ $)。| (^(\ d){0,16}(\。\ d \ d?)?$)')「這似乎驗證正確 – 2011-05-13 11:38:37