I have implemented couple of improvements for BigDecimal formatter based on ADF 12.2.1.1. Originally formatter was implemented and described in this post - Handling Format for BigDecimal Numbers in ADF BC. New improvements: option to support trailing zeros and disabling number rounding.
1. Support for trailing zeros
If you type number 3000.10, BigDecimal type attribute will keep it as 3000.10. But in database it will be saved without trailing zero as 3000.1. This would lead to "Another user has changed the row" issue, as there will be mismatch between value in DB and value in ADF BC.
Try to enter 3000.10:
Save, change any other field and try to save again. You will get error:
Double check in DB, value is saved without trailing zero. Thats the reason for the error, data mismatch:
Solution is to parse entered value into BigDecimal without trailing zeros in generic formatter class:
2. Disabling number rounding
By default when you type 2500.209 (and if only 2 digits after dot are allowed):
This will be rounded to 2500.21:
While rounding can be useful, most of the time it will be confusing. There is a way to disable rounding by removing af:convertNumber tag for UI component. Formatting still will be applied through generic formatter class:
If user enters incorrect number, instead of rounding it - formatting error message will be displayed:
Download sample application - ADFFormattingApp_12211.zip.
1. Support for trailing zeros
If you type number 3000.10, BigDecimal type attribute will keep it as 3000.10. But in database it will be saved without trailing zero as 3000.1. This would lead to "Another user has changed the row" issue, as there will be mismatch between value in DB and value in ADF BC.
Try to enter 3000.10:
Save, change any other field and try to save again. You will get error:
Double check in DB, value is saved without trailing zero. Thats the reason for the error, data mismatch:
Solution is to parse entered value into BigDecimal without trailing zeros in generic formatter class:
2. Disabling number rounding
By default when you type 2500.209 (and if only 2 digits after dot are allowed):
This will be rounded to 2500.21:
While rounding can be useful, most of the time it will be confusing. There is a way to disable rounding by removing af:convertNumber tag for UI component. Formatting still will be applied through generic formatter class:
If user enters incorrect number, instead of rounding it - formatting error message will be displayed:
Download sample application - ADFFormattingApp_12211.zip.