Вы можете попробовать:
public static void main(String[] args) {
System.out.println(parse("2.1", 0));
System.out.println(parse("+2.1", 0));
System.out.println(parse("-1", 0));
System.out.println(parse("-1.2", 1));
System.out.println(parse("qwa56sdf", 3));
}
private static Double parse(String string, int index) {
if (string.charAt(index) == '-' || string.charAt(index) == '+') {
return null;
}
try {
return Double.parseDouble(string.substring(index).replaceAll("[^\\d.]", ""));
}
catch (NumberFormatException e) {
return null;
}
}
Мне пришлось убрать концевые нецифровые символы с помощью replace all, поскольку они вызывали исключение NumberFormatException и возвращали значение null для входных данных, подобных тому, который был в вашем последнем примере.
Редактировать: другой вариант работы для случаев, подобных тому, что в комментарии, может состоять в проверке каждого символа
private static Double parse(String string, int index) {
String finalString = "";
boolean foundSeparator = false;
for (char c : string.substring(index).toCharArray()) {
if (c == '.') {
if (foundSeparator) {
break;
}
else {
foundSeparator = true;
}
}
else if (!Character.isDigit(c)) {
break;
}
finalString += c;
}
if (finalString == "") {
return null;
}
return Double.parseDouble(finalString);
}