Я intendando, не используя try-catch (он не позволяется мне в этом случае), знать, - ли String subceptible в parsearse в double, но он не принимает мне стоимость, как например 1.80. Это метод:
private boolean alturaCorrecta() {
boolean check = true;
Character c;
int control = 0;
String cadena = TFAltura.getText();
for (int i = 1; i < (TFAltura.getText().length()+1); i++) {
c = cadena.charAt(i);
if (!Character.isDigit(c)) {
if (c.equals('.') && control == 0) {
control++;
} else if (control == 1) {
check = false;
break;
}
check = false;
break;
}
}
if(check){
double valor=parseDouble(cadena);
if (valor>1.50 && valor < 2.50){
check=true;
}else{
check = false;
TAmensajes.setText("La altura debe estar comprendida entre 1.50 y 2.50");
}
}
return check;
}
Твоя деталь находится в цикле for, чтобы проверять цепь, тестирует таким образом
for (int i = 0; i < (TFAltura.getText().length()); i++) {
c = cadena.charAt(i);
if (!Character.isDigit(c)) {
if (c.equals('.') && control == 0) {
control++;
} else {
check = false;
break;
}
}
}
Ответ @juandej18 функционирует хорошо, и исправляет твою немедленную проблему определения правильно, что цепь "1.80"
могут parsear в один double
.
Но, трудность несмотря на то, что она пишет нашу собственную логику для этого типа проблемы, состоит в том, что он крайне трудный для того, чтобы это сделать правильно для всех случаев. Например: ты предвосхитил, как манипулировать отрицательными числами?
Так что, концентрируясь на самом общем и интересном вопросе твоего титула: как возможно проверять, если цепь String
могут parsear в один double
?
Очевидно, все знаем, что возможно делать с одним try-catch
таким образом:
public static void main(String args[])
{
System.out.println(isValidDouble("1.80")); // true
System.out.println(isValidDouble("-1.80")); // true
System.out.println(isValidDouble("Infinity")); // true
System.out.println(isValidDouble("NaN")); // true
System.out.println(isValidDouble("abc")); // false
System.out.println(isValidDouble("23.45.67")); // false
}
private static boolean isValidDouble(String s) {
boolean isValid = true;
try {
Double.parseDouble(s);
} catch(NumberFormatException nfe) {
isValid = false;
}
return isValid;
}
Но ты говоришь, что ты не можешь использовать один try-catch
. И, действительно, того, чтобы быть возможным, всегда лучше избегать использовать исключения для нормальных ситуаций. А следовательно я не могу думать, что Java еще не включает официальный метод, что было возможно бы призывать делать эту проверку без того, чтобы ты lanze исключение. C#, например, включи метод TryParse
чтобы манипулировать этой ситуацией.
Но interesantemente, если ты смотришь в документации для Double.valueOf(s)
, ты заметишь секцию, которую он говорит (переведенный):
Чтобы избегать называть этот метод с недействительной цепью, и которая ты lanze один
NumberFormatException
, возможно использовать регулярное следующее выражение, чтобы проверять цепь заранее:
... и потом он обеспечивает тебя длинным регулярным выражением, которое ты можешь использовать.
Так что, так как рекомендация находится в официальной документации: почему не использовать ее? Страховки оно будет функционировать лучше, что писать логику из-за нашего счета.
Здесь у тебя есть пример, как использования ее:
public static void main(String args[])
{
System.out.println(isValidDouble("1.80")); // true
System.out.println(isValidDouble("-1.80")); // true
System.out.println(isValidDouble("Infinity")); // true
System.out.println(isValidDouble("NaN")); // true
System.out.println(isValidDouble("abc")); // false
System.out.println(isValidDouble("23.45.67")); // false
}
private static boolean isValidDouble(String s) {
final String Digits = "(\\p{Digit}+)";
final String HexDigits = "(\\p{XDigit}+)";
// an exponent is 'e' or 'E' followed by an optionally
// signed decimal integer.
final String Exp = "[eE][+-]?"+Digits;
final String fpRegex =
("[\\x00-\\x20]*"+ // Optional leading "whitespace"
"[+-]?(" + // Optional sign character
"NaN|" + // "NaN" string
"Infinity|" + // "Infinity" string
// A decimal floating-point string representing a finite positive
// number without a leading sign has at most five basic pieces:
// Digits . Digits ExponentPart FloatTypeSuffix
//
// Since this method allows integer-only strings as input
// in addition to strings of floating-point literals, the
// two sub-patterns below are simplifications of the grammar
// productions from section 3.10.2 of
// The Java Language Specification.
// Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
"((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+
// . Digits ExponentPart_opt FloatTypeSuffix_opt
"(\\.("+Digits+")("+Exp+")?)|"+
// Hexadecimal strings
"((" +
// 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
"(0[xX]" + HexDigits + "(\\.)?)|" +
// 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
"(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +
")[pP][+-]?" + Digits + "))" +
"[fFdD]?))" +
"[\\x00-\\x20]*");// Optional trailing "whitespace"
return Pattern.matches(fpRegex, s);
}
Хорошей, estarГ - в добро, которое ты определял немного более каков, - ошибка, которая дает тебе, прикрепляя например сообщение исключения в случае, если это будет.
С другой стороны, for (int i = 1; i < (TFAltura.getText().length()+1); i++) {
очень вероятный, что ты lanze один IndexOutOfBoundsException
, так как ты всегда будешь пробовать искать еще одно положение tamaГ±o максимум, который у него был бы.
Пытается помещать for (int i = 0; i < TFAltura.getText().length(); i++) {
Из всех форм, как я сказал тебе, пробует определять pco ams ошибку, которая дает тебе.
Приветствие!
Твоя логика хорошо. Ошибка, которая тебе должна быть давая, как они говорят, что наверху принадлежит Аррайоутбоунд Индекс
String cadena = TFAltura.getText();
for (int i = 1; i < (TFAltura.getText().length()+1); i++) {
c = cadena.charAt(i);
if (!Character.isDigit(c)) {
if (c.equals('.') && control == 0) {
control++;
} else if (control == 1) {
check = false;
break;
}
check = false;
break;
}
}
Vamos из-за шагов одна, наш array тебе кажется определенным, поместив
for (int i = 1; i < (TFAltura.getText () .length () +1); i ++)
мы говорим, что пошло еще одно место, и я очень уверен, что он должен бросать ошибку, мы это оставим этой формы
for (int i = 1; i < (TFAltura.getText () .length ()); i ++)
Так мы получаем весь String без того, чтобы нас производила эта ошибка. Мы идем во второй шаг. Если он состоит в том, что мы находимся в последней цифре и не находим запятую или точку в твоем случае, тогда мы знаем, что он не является десятичным
int last = 0;
for (int i = 1; i < (TFAltura.getText().length()); i++) {
last = i + 1;
if(last == TFAltura.getText().length()+1)
{
check = false;
break;
}
}
, Уже у нас есть утверждение. Сейчас в следующее утверждение, которое происходит, если тебя перемещают число с
123.123.123
Тогда, это означает, что только может быть точка, а уже он не был бы действительным номером
for (int i = 1; i < (TFAltura.getText().length()); i++) {
last = i + 1;
if(last == TFAltura.getText().length()+1)
{
check = false;
break;
}
if (!Character.isDigit(c)) {
if (c.equals('.')) {
control++;
}
else{ // Si no es un punto entonces es una Letra y ya no es un numero
check = false;
break;
}
}
}
очень довольно сейчас мы знаем, что, если
контроль> 1 тогда у числа есть более двух запятых или точек
, мы В конце концов возвращаем наши переменные, если он фальшивый
for (int i = 1; i < (TFAltura.getText().length()); i++) {
last = i + 1;
if(last == TFAltura.getText().length()+1)
{
check = false;
break;
}
if (!Character.isDigit(c)) {
if (c.equals('.')) {
control++;
}
else{ // Si no es un punto entonces es una Letra y ya no es un numero
check = false;
break;
}
}
}
if (check == false){
return check;
}
else if (control > 1){
return check;
}
else if(control == 1 && check == true)
{
double valor=parseDouble(cadena);
if (valor>1.50 && valor < 2.50){
check=true;
}else{
check = false;
TAmensajes.setText("La altura debe estar comprendida entre 1.50 y 2.50");
}
}
return check;
Надеялся смочь вести тебя тебе в небольшом количестве привета.