[TEEDA-377] @NumberLengthにてDecimal型のチェックが行われない Created: 2007-09-18 Updated: 2007-09-19 Resolved: 2007-09-19 |
|
Status: | Resolved |
Project: | Teeda |
Component/s: | Teeda Extension |
Affects Version/s: | None |
Fix Version/s: | 1.0.11 |
Type: | Bug | Priority: | Major |
Reporter: | Shinichi Yanagisawa | Assignee: | shot |
Resolution: | Fixed | Votes: | 0 |
Labels: | None | ||
Environment: |
Windows Vista / jdk1.6.0_02 |
Description |
Decimal型のフィールド(小数点あり)に対しNumberLengthValidatorにてチェックを行おうとしたところ、チェックが行われない。 |
Comments |
Comment by koichik [ 2007-09-19 ] |
To: Yanagisawa さん
|
Comment by shot [ 2007-09-19 ] |
Rev.3594にて修正しました. Double型のプロパティでTNumberLengthValidatorを指定している場合、 |
Comment by shot [ 2007-09-19 ] |
NumberConverterというか、DecimalFormatSymbols/DecimalFormatを使ったとしても というわけで、サンプルが適切でないのは修正しておきます. TNumberLengthValidatorでDoubleが指定されているときは例外飛ばすようにしておきます. |
Comment by Shinichi Yanagisawa [ 2007-09-19 ] |
実は意図してDoubleを使った訳ではありません。 |
Comment by koichik [ 2007-09-19 ] |
Double に NumberLengthValidator? そもそも Double (double) の長さとは? それよりは,以下のようにした方がいいのでは? public class HogePage { @NumberLength(...) public BigDecimal foo; public Double getFooAsDouble() { return foo == null ? null ? foo.doubleValue(); } } |
Comment by Shinichi Yanagisawa [ 2007-09-18 ] |
すみません。Double型の間違いでした。 |
Comment by koichik [ 2007-09-18 ] |
BigDecimal ではない Decimal とは? FQN で書いてください. |
Comment by Anonymous [ 2007-09-18 ] |
value が Decimal型(BigDecimalではない) の場合、getDigitsメソッドにて判定をしていない( value instanceof Decimalの条件文がない)ため、digitsのintegral, fractionの値がゼロのままリターンしてしまう。結果、TNumberLengthValidator.validateメソッドでチェックエラーとならない。 |
Comment by shot [ 2007-09-18 ] |
TNumberLengthValidator.getDigits()で下記のように対応しています. protected Digits getDigits(final FacesContext context, final Object value) { final Digits digits = new Digits(); if (value instanceof Integer) { final Integer num = (Integer) value; final int abs = Math.abs(num.intValue()); digits.setIntegral(String.valueOf(abs).length()); } else if (value instanceof Long) { final Long num = (Long) value; final long abs = Math.abs(num.longValue()); digits.setIntegral(String.valueOf(abs).length()); } else if (value instanceof BigDecimal) { BigDecimal num = (BigDecimal) value; if (num.compareTo(ZERO) < 0) { num = num.negate(); } final String s = num.toString(); final Locale locale = context.getViewRoot().getLocale(); final String decimalSeparator = NumberConversionUtil .findDecimalSeparator(locale); final int pos = s.indexOf(decimalSeparator); if (-1 < pos) { digits.setIntegral(s.substring(0, pos).length()); digits.setFraction(s.substring(pos + 1).length()); } else { digits.setIntegral(s.length()); } } return digits; } |