001 package org.springframework.binding.format.support; 002 003 import java.text.AttributedCharacterIterator; 004 import java.text.FieldPosition; 005 import java.text.NumberFormat; 006 import java.text.ParseException; 007 import java.text.ParsePosition; 008 import java.util.Currency; 009 010 /** 011 * This is a decorator class for NumberFormat to ensure an exact number parsing. 012 * The {@link NumberFormat} class allows parsing of numbers in strings like 013 * '2abc' but at the richclient end we don't want this to be a valid parsing. 014 * Therefor a specific NumberFormat that doesn't allow any other input than a 015 * number. 016 * 017 * @author Yudhi Widyatama 018 * @author Jan Hoskens 019 * 020 */ 021 public class StrictNumberFormat extends NumberFormat { 022 NumberFormat inner; 023 024 public StrictNumberFormat(NumberFormat instance) { 025 inner = instance; 026 } 027 028 public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { 029 return inner.format(number, toAppendTo, pos); 030 } 031 032 public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) { 033 return inner.format(number, toAppendTo, pos); 034 } 035 036 public StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) { 037 return inner.format(number, toAppendTo, pos); 038 } 039 040 public AttributedCharacterIterator formatToCharacterIterator(Object obj) { 041 return inner.formatToCharacterIterator(obj); 042 } 043 044 public Currency getCurrency() { 045 return inner.getCurrency(); 046 } 047 048 public int getMaximumFractionDigits() { 049 return inner.getMaximumFractionDigits(); 050 } 051 052 public int getMaximumIntegerDigits() { 053 return inner.getMaximumIntegerDigits(); 054 } 055 056 public int getMinimumFractionDigits() { 057 return inner.getMinimumFractionDigits(); 058 } 059 060 public int getMinimumIntegerDigits() { 061 return inner.getMinimumIntegerDigits(); 062 } 063 064 public int hashCode() { 065 return inner.hashCode(); 066 } 067 068 public boolean isGroupingUsed() { 069 return inner.isGroupingUsed(); 070 } 071 072 public boolean isParseIntegerOnly() { 073 return inner.isParseIntegerOnly(); 074 } 075 076 public Number parse(String source, ParsePosition parsePosition) { 077 return inner.parse(source, parsePosition); 078 } 079 080 public Number parse(String source) throws ParseException { 081 // idea taken from 082 // org.apache.commons.validator.routines.AbstractFormatValidator 083 ParsePosition parsePosition = new ParsePosition(0); 084 Number result = inner.parse(source, parsePosition); 085 if (parsePosition.getErrorIndex() > -1) 086 throw new ParseException("Invalid format", parsePosition.getIndex()); 087 if (parsePosition.getIndex() < source.length()) 088 throw new ParseException("Invalid format[ii]", parsePosition.getIndex()); 089 return result; 090 } 091 092 public Object parseObject(String source) throws ParseException { 093 return inner.parseObject(source); 094 } 095 096 public void setCurrency(Currency currency) { 097 inner.setCurrency(currency); 098 } 099 100 public void setGroupingUsed(boolean newValue) { 101 inner.setGroupingUsed(newValue); 102 } 103 104 public void setMaximumFractionDigits(int newValue) { 105 inner.setMaximumFractionDigits(newValue); 106 } 107 108 public void setMaximumIntegerDigits(int newValue) { 109 inner.setMaximumIntegerDigits(newValue); 110 } 111 112 public void setMinimumFractionDigits(int newValue) { 113 inner.setMinimumFractionDigits(newValue); 114 } 115 116 public void setMinimumIntegerDigits(int newValue) { 117 inner.setMinimumIntegerDigits(newValue); 118 } 119 120 public void setParseIntegerOnly(boolean value) { 121 inner.setParseIntegerOnly(value); 122 } 123 }