diff --git a/quickfixj-core/src/main/java/quickfix/field/converter/DoubleConverter.java b/quickfixj-core/src/main/java/quickfix/field/converter/DoubleConverter.java index fa9bdecd26..ee8c05a88d 100644 --- a/quickfixj-core/src/main/java/quickfix/field/converter/DoubleConverter.java +++ b/quickfixj-core/src/main/java/quickfix/field/converter/DoubleConverter.java @@ -25,14 +25,11 @@ import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * Converts between a double and a String. */ public class DoubleConverter { - private static final Pattern DECIMAL_PATTERN = Pattern.compile("-?\\d*(\\.\\d*)?"); private static final ThreadLocal THREAD_DECIMAL_FORMATS = new ThreadLocal<>(); /** @@ -92,13 +89,25 @@ public static String convert(double d, int padding) { */ public static double convert(String value) throws FieldConvertError { try { - Matcher matcher = DECIMAL_PATTERN.matcher(value); - if (!matcher.matches()) { - throw new NumberFormatException(); - } - return Double.parseDouble(value); + return parseDouble(value); } catch (NumberFormatException e) { throw new FieldConvertError("invalid double value: " + value); } } + + private static double parseDouble(String value) { + if(value.length() == 0) throw new NumberFormatException(value); + boolean dot = false; int i = 0; + char c = value.charAt(i); + switch (c) { + case '-': i++; break; + case '+': throw new NumberFormatException(value); + } + for (; i < value.length(); i++) { + c = value.charAt(i); + if (!dot && c == '.') dot = true; + else if (c < '0' || c > '9') throw new NumberFormatException(value); + } + return Double.parseDouble(value); + } } diff --git a/quickfixj-core/src/test/java/quickfix/FieldConvertersTest.java b/quickfixj-core/src/test/java/quickfix/FieldConvertersTest.java index a245bace79..b98ce32a38 100644 --- a/quickfixj-core/src/test/java/quickfix/FieldConvertersTest.java +++ b/quickfixj-core/src/test/java/quickfix/FieldConvertersTest.java @@ -59,6 +59,15 @@ public void testIntegerConversion() throws Exception { } catch (FieldConvertError e) { // expected } + + try { + //Sequence of digits without commas or decimals and optional sign character (ASCII characters "-" and "0" - "9" ). + //FIXME + IntConverter.convert("100"); + fail(); + } catch (FieldConvertError e) { + // expected + } } public void testDoubleConversion() throws Exception {