package org.radargun.utils;
import java.lang.reflect.Type;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.radargun.config.Converter;
/**
* Converts numbers to instance of correct type (according to the prefix).
*
* @author Radim Vansa <rvansa@redhat.com>
*/
public class NumberConverter implements Converter<Number> {
private static final Pattern INT_PATTERN = Pattern.compile("int (.*)");
private static final Pattern LONG_PATTERN = Pattern.compile("long (.*)");
private static final Pattern FLOAT_PATTERN = Pattern.compile("float (.*)");
private static final Pattern DOUBLE_PATTERN = Pattern.compile("double (.*)");
@Override
public Number convert(String string, Type type) {
Number n = toNumber(string);
if (n != null) return n;
throw new IllegalArgumentException("Cannot parse " + string);
}
public Number toNumber(String string) {
Matcher m;
if ((m = INT_PATTERN.matcher(string)).matches()) {
return Integer.parseInt(m.group(1));
} else if ((m = LONG_PATTERN.matcher(string)).matches()) {
return Long.parseLong(m.group(1));
} else if ((m = FLOAT_PATTERN.matcher(string)).matches()) {
return Float.parseFloat(m.group(1));
} else if ((m = DOUBLE_PATTERN.matcher(string)).matches()) {
return Double.parseDouble(m.group(1));
}
try {
long l = Long.parseLong(string);
if (l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) {
return (int) l;
}
} catch (NumberFormatException e) {
// ok
}
try {
return Double.parseDouble(string);
} catch (NumberFormatException e) {
// ok
}
return null;
}
@Override
public String convertToString(Number value) {
return String.valueOf(value);
}
@Override
public String allowedPattern(Type type) {
return "(int |long |float |double )?(\\+|-)?[0-9.]*";
}
}