Merge pull request #1843 from SiboVG/issue-1842

[#1842] More general string conversion to double for fin editor table
This commit is contained in:
Sibo Van Gool 2022-11-18 19:08:46 +01:00 committed by GitHub
commit ab50573f71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 2 deletions

View File

@ -18,6 +18,7 @@ import java.util.regex.Pattern;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.util.StringUtil;
/**
@ -670,8 +671,8 @@ public class UnitGroup {
if (!matcher.matches()) {
throw new NumberFormatException("string did not match required pattern");
}
double value = Double.parseDouble(matcher.group(1));
double value = StringUtil.convertToDouble(matcher.group(1));
String unit = matcher.group(2).trim();
if (unit.equals("")) {

View File

@ -19,5 +19,24 @@ public class StringUtil {
}
return "".equals(s.trim());
}
/**
* Converts a string to a double, but with a more robust locale handling.
* Some systems use a comma as a decimal separator, some a dot. This method
* should work for both cases
* @param input string to convert
* @return double converted from string
* @throws NumberFormatException if the string cannot be parsed.
*/
public static double convertToDouble(String input) {
input = input.replace(',', '.');
int decimalSeparator = input.lastIndexOf('.');
if (decimalSeparator > -1) {
input = input.substring(0, decimalSeparator).replace(".", "") + input.substring(decimalSeparator);
}
return Double.parseDouble(input);
}
}

View File

@ -4,6 +4,7 @@ import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
/**
* A class that tests
@ -22,4 +23,25 @@ public class StringUtilTest {
assertFalse(StringUtil.isEmpty("A"));
assertFalse(StringUtil.isEmpty(" . "));
}
@Test
public void testConvertToDouble() {
assertEquals(0.2, StringUtil.convertToDouble(".2"), MathUtil.EPSILON);
assertEquals(0.2, StringUtil.convertToDouble(",2"), MathUtil.EPSILON);
assertEquals(1, StringUtil.convertToDouble("1,"), MathUtil.EPSILON);
assertEquals(2, StringUtil.convertToDouble("2."), MathUtil.EPSILON);
assertEquals(1, StringUtil.convertToDouble("1"), MathUtil.EPSILON);
assertEquals(1.52, StringUtil.convertToDouble("1.52"), MathUtil.EPSILON);
assertEquals(1.52, StringUtil.convertToDouble("1,52"), MathUtil.EPSILON);
assertEquals(1.5, StringUtil.convertToDouble("1.500"), MathUtil.EPSILON);
assertEquals(1.5, StringUtil.convertToDouble("1,500"), MathUtil.EPSILON);
assertEquals(1500.61, StringUtil.convertToDouble("1.500,61"), MathUtil.EPSILON);
assertEquals(1500.61, StringUtil.convertToDouble("1,500.61"), MathUtil.EPSILON);
assertEquals(1500.2, StringUtil.convertToDouble("1,500,200"), MathUtil.EPSILON);
assertEquals(1500.2, StringUtil.convertToDouble("1.500.200"), MathUtil.EPSILON);
assertEquals(1500200.23, StringUtil.convertToDouble("1500200.23"), MathUtil.EPSILON);
assertEquals(1500200.23, StringUtil.convertToDouble("1500200,23"), MathUtil.EPSILON);
assertEquals(1500200.23, StringUtil.convertToDouble("1,500,200.23"), MathUtil.EPSILON);
assertEquals(1500200.23, StringUtil.convertToDouble("1.500.200,23"), MathUtil.EPSILON);
}
}