Проверка ограничения валютного поля выполнена перед округлением - PullRequest
0 голосов
/ 12 апреля 2011

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" также вместо проверки длины, но позже увидел некоторую ошибку в этой проверке номера, переключенную на эту проверку длины строки) </p>

теперь проблема в этом случае длины строки заключается в том, что если я ввожу «9,999,999,999,999,999,9991», то происходит следующее 1. Проверка ограничения выполнена.который возвращает «ложь» как «9999999999999999,991» = 20 длины 2. сумма валюты округляется.

, поэтому моя проверка ограничений не проходит.Но если я щелкаю поле и щелкаю за пределами поля, проверка ограничений возвращает значение true

. Кто-нибудь может предложить лучший способ сделать это или решить вышеуказанную проблему.

1 Ответ

0 голосов
/ 12 апреля 2011

Несколько замечаний:

xxforms:maxlength не работает на fr:currency или любом другом fr: элементе управления

Числа сравниваются с другими числами как 64-битный тип с плавающей запятой двойной точности . Учитывайте это при оценке чисел. В основном это означает, что большие числа округляются. Вполне возможно, что проблемы, с которыми вы сталкиваетесь при оценке большого числа, - это не ошибка, а просто математика.

  • Например, числа между 9999999999999998976,00 и 10000000000000001023,99 все оцениваются как 1,0E19
...