|
25 | 25 | import java.text.DecimalFormat;
|
26 | 26 | import java.text.DecimalFormatSymbols;
|
27 | 27 | import java.util.Locale;
|
28 |
| -import java.util.regex.Matcher; |
29 |
| -import java.util.regex.Pattern; |
30 | 28 |
|
31 | 29 | /**
|
32 | 30 | * Converts between a double and a String.
|
33 | 31 | */
|
34 | 32 | public class DoubleConverter {
|
35 |
| - private static final Pattern DECIMAL_PATTERN = Pattern.compile("-?\\d*(\\.\\d*)?"); |
36 | 33 | private static final ThreadLocal<DecimalFormat[]> THREAD_DECIMAL_FORMATS = new ThreadLocal<>();
|
37 | 34 |
|
38 | 35 | /**
|
@@ -92,13 +89,25 @@ public static String convert(double d, int padding) {
|
92 | 89 | */
|
93 | 90 | public static double convert(String value) throws FieldConvertError {
|
94 | 91 | try {
|
95 |
| - Matcher matcher = DECIMAL_PATTERN.matcher(value); |
96 |
| - if (!matcher.matches()) { |
97 |
| - throw new NumberFormatException(); |
98 |
| - } |
99 |
| - return Double.parseDouble(value); |
| 92 | + return parseDouble(value); |
100 | 93 | } catch (NumberFormatException e) {
|
101 | 94 | throw new FieldConvertError("invalid double value: " + value);
|
102 | 95 | }
|
103 | 96 | }
|
| 97 | + |
| 98 | + private static double parseDouble(String value) { |
| 99 | + if(value.length() == 0) throw new NumberFormatException(value); |
| 100 | + boolean dot = false; int i = 0; |
| 101 | + char c = value.charAt(i); |
| 102 | + switch (c) { |
| 103 | + case '-': i++; break; |
| 104 | + case '+': throw new NumberFormatException(value); |
| 105 | + } |
| 106 | + for (; i < value.length(); i++) { |
| 107 | + c = value.charAt(i); |
| 108 | + if (!dot && c == '.') dot = true; |
| 109 | + else if (!Character.isDigit(c)) throw new NumberFormatException(value); |
| 110 | + } |
| 111 | + return Double.parseDouble(value); |
| 112 | + } |
104 | 113 | }
|
0 commit comments