0

こんにちは、通貨フィールドの単体テストを行っていたところ、バグと見なすことができるこの問題が見つかりました。

<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 文字があります。(constraint="if(.='') then true() else number(.)<10000000000000000" も長さチェックの代わりに試しましたが、後でその数値チェックのバグがこの文字列長チェックに切り替わったのを見ました)

この場合の文字列の長さの問題は、「9,999,999,999,999,999.991」と入力すると、次のようになることです。1. 制約チェックが実行されます。これは、「9999999999999999.991」= 20 長さ 2 として「false」を返します。通貨額は四捨五入されます。

私の制約チェックは失敗します。しかし、フィールドをクリックしてフィールドの外側をクリックすると、制約チェックは true を返します

誰かがそれを行うためのより良い方法や上記の問題を解決する方法を提案できますか?

4

1 に答える 1

0

注意すべき点がいくつかあります。

xxforms:maxlengthfr:currencyまたは他のfr:コントロールでは機能しません

数値は、倍精度の 64 ビット浮動小数点型として他の数値に対して評価されます。数値が評価されるときは、これを考慮してください。基本的にこれが意味することは、大きな数が丸められることです。多数の評価で発生する問題は、バグではなく単なる数学である可能性があります。

  • たとえば、9999999999999998976.00 から 1000000000000001023.99 までの数値はすべて 1.0E19 と評価されます。
于 2011-04-12T18:03:27.807 に答える