📄 numberconverter.java
字号:
* <i>Converter</i>.
* <p>
* This method handles conversion to the following types:
* <ul>
* <li><code>java.lang.Byte</code></li>
* <li><code>java.lang.Short</code></li>
* <li><code>java.lang.Integer</code></li>
* <li><code>java.lang.Long</code></li>
* <li><code>java.lang.Float</code></li>
* <li><code>java.lang.Double</code></li>
* <li><code>java.math.BigDecimal</code></li>
* <li><code>java.math.BigInteger</code></li>
* </ul>
* @param sourceType The type being converted from
* @param targetType The Number type to convert to
* @param value The Number to convert.
*
* @return The converted value.
*/
private Number toNumber(Class sourceType, Class targetType, Number value) {
// Correct Number type already
if (targetType.equals(value.getClass())) {
return value;
}
// Byte
if (targetType.equals(Byte.class)) {
long longValue = value.longValue();
if (longValue > Byte.MAX_VALUE) {
throw new ConversionException(toString(sourceType) + " value '" + value
+ "' is too large for " + toString(targetType));
}
if (longValue < Byte.MIN_VALUE) {
throw new ConversionException(toString(sourceType) + " value '" + value
+ "' is too small " + toString(targetType));
}
return new Byte(value.byteValue());
}
// Short
if (targetType.equals(Short.class)) {
long longValue = value.longValue();
if (longValue > Short.MAX_VALUE) {
throw new ConversionException(toString(sourceType) + " value '" + value
+ "' is too large for " + toString(targetType));
}
if (longValue < Short.MIN_VALUE) {
throw new ConversionException(toString(sourceType) + " value '" + value
+ "' is too small " + toString(targetType));
}
return new Short(value.shortValue());
}
// Integer
if (targetType.equals(Integer.class)) {
long longValue = value.longValue();
if (longValue > Integer.MAX_VALUE) {
throw new ConversionException(toString(sourceType) + " value '" + value
+ "' is too large for " + toString(targetType));
}
if (longValue < Integer.MIN_VALUE) {
throw new ConversionException(toString(sourceType) + " value '" + value
+ "' is too small " + toString(targetType));
}
return new Integer(value.intValue());
}
// Long
if (targetType.equals(Long.class)) {
return new Long(value.longValue());
}
// Float
if (targetType.equals(Float.class)) {
if (value.doubleValue() > Float.MAX_VALUE) {
throw new ConversionException(toString(sourceType) + " value '" + value
+ "' is too large for " + toString(targetType));
}
return new Float(value.floatValue());
}
// Double
if (targetType.equals(Double.class)) {
return new Double(value.doubleValue());
}
// BigDecimal
if (targetType.equals(BigDecimal.class)) {
if (value instanceof Float || value instanceof Double) {
return new BigDecimal(value.toString());
} else if (value instanceof BigInteger) {
return new BigDecimal((BigInteger)value);
} else {
return BigDecimal.valueOf(value.longValue());
}
}
// BigInteger
if (targetType.equals(BigInteger.class)) {
if (value instanceof BigDecimal) {
return ((BigDecimal)value).toBigInteger();
} else {
return BigInteger.valueOf(value.longValue());
}
}
String msg = toString(getClass()) + " cannot handle conversion to '"
+ toString(targetType) + "'";
if (log().isWarnEnabled()) {
log().warn(" " + msg);
}
throw new ConversionException(msg);
}
/**
* Default String to Number conversion.
* <p>
* This method handles conversion from a String to the following types:
* <ul>
* <li><code>java.lang.Byte</code></li>
* <li><code>java.lang.Short</code></li>
* <li><code>java.lang.Integer</code></li>
* <li><code>java.lang.Long</code></li>
* <li><code>java.lang.Float</code></li>
* <li><code>java.lang.Double</code></li>
* <li><code>java.math.BigDecimal</code></li>
* <li><code>java.math.BigInteger</code></li>
* </ul>
* @param sourceType The type being converted from
* @param targetType The Number type to convert to
* @param value The String value to convert.
*
* @return The converted Number value.
*/
private Number toNumber(Class sourceType, Class targetType, String value) {
// Byte
if (targetType.equals(Byte.class)) {
return new Byte(value);
}
// Short
if (targetType.equals(Short.class)) {
return new Short(value);
}
// Integer
if (targetType.equals(Integer.class)) {
return new Integer(value);
}
// Long
if (targetType.equals(Long.class)) {
return new Long(value);
}
// Float
if (targetType.equals(Float.class)) {
return new Float(value);
}
// Double
if (targetType.equals(Double.class)) {
return new Double(value);
}
// BigDecimal
if (targetType.equals(BigDecimal.class)) {
return new BigDecimal(value);
}
// BigInteger
if (targetType.equals(BigInteger.class)) {
return new BigInteger(value);
}
String msg = toString(getClass()) + " cannot handle conversion from '" +
toString(sourceType) + "' to '" + toString(targetType) + "'";
if (log().isWarnEnabled()) {
log().warn(" " + msg);
}
throw new ConversionException(msg);
}
/**
* Provide a String representation of this number converter.
*
* @return A String representation of this number converter
*/
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append(toString(getClass()));
buffer.append("[UseDefault=");
buffer.append(isUseDefault());
buffer.append(", UseLocaleFormat=");
buffer.append(useLocaleFormat);
if (pattern != null) {
buffer.append(", Pattern=");
buffer.append(pattern);
}
if (locale != null) {
buffer.append(", Locale=");
buffer.append(locale);
}
buffer.append(']');
return buffer.toString();
}
/**
* Return a NumberFormat to use for Conversion.
*
* @return The NumberFormat.
*/
private NumberFormat getFormat() {
NumberFormat format = null;
if (pattern != null) {
if (locale == null) {
if (log().isDebugEnabled()) {
log().debug(" Using pattern '" + pattern + "'");
}
format = new DecimalFormat(pattern);
} else {
if (log().isDebugEnabled()) {
log().debug(" Using pattern '" + pattern + "'" +
" with Locale[" + locale + "]");
}
DecimalFormatSymbols symbols = new DecimalFormatSymbols(locale);
format = new DecimalFormat(pattern, symbols);
}
} else {
if (locale == null) {
if (log().isDebugEnabled()) {
log().debug(" Using default Locale format");
}
format = NumberFormat.getInstance();
} else {
if (log().isDebugEnabled()) {
log().debug(" Using Locale[" + locale + "] format");
}
format = NumberFormat.getInstance(locale);
}
}
if (!allowDecimals) {
format.setParseIntegerOnly(true);
}
return format;
}
/**
* Convert a String into a <code>Number</code> object.
* @param sourceType TODO
* @param targetType The type to convert the value to
* @param value The String date value.
* @param format The NumberFormat to parse the String value.
*
* @return The converted Number object.
* @throws ConversionException if the String cannot be converted.
*/
private Number parse(Class sourceType, Class targetType, String value, NumberFormat format) {
ParsePosition pos = new ParsePosition(0);
Number parsedNumber = (Number)format.parse(value, pos);
if (pos.getErrorIndex() >= 0 || pos.getIndex() != value.length() || parsedNumber == null) {
String msg = "Error converting from '" + toString(sourceType) + "' to '" + toString(targetType) + "'";
if (format instanceof DecimalFormat) {
msg += " using pattern '" + ((DecimalFormat)format).toPattern() + "'";
}
if (locale != null) {
msg += " for locale=[" + locale + "]";
}
if (log().isDebugEnabled()) {
log().debug(" " + msg);
}
throw new ConversionException(msg);
}
return parsedNumber;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -