Как проверить тип перед приведением в java

Я привожу свои строковые переменные к целому и двойному числу. Я хочу проверить, содержит ли переменная String допустимое значение Integer или Double во время выполнения.

Я использую следующий код, но он не работает для меня.

String var1="5.5";
String var2="6";
Object o1=var1;
Object o2=var2;
if (o1 instanceof Integer)
{
    qt += Integer.parseInt( var1);// Qty
}
if (o2 instanceof Double)
{
    wt += Double.parseDouble(var2);// Wt
}

person Syed Muhammad Mubashir    schedule 27.11.2012    source источник
comment
o1 и o2 определенно не являются экземплярами Integer, поскольку они оба ссылаются на объект String.   -  person giorashc    schedule 27.11.2012
comment
Вы преобразуете строку в объект, и, следовательно, o1 instanceOf Integer никогда не будет истинным.   -  person appbootup    schedule 27.11.2012


Ответы (5)


Попробуйте проанализировать int и поймать исключение, если оно не работает:

String var1="5.5";

try {
 qt += Integer.parseInt( var1);
}    
catch (NumberFormatException nfe) {
// wasn't an int
}
person blank    schedule 27.11.2012
comment
Я знаю эту технику, но я хочу избежать возникновения эксцессов - person Syed Muhammad Mubashir; 27.11.2012
comment
@SyedMuhammadMubashir .. Это то, что мы называем предотвращением возникновения исключений. Мы должны справиться с ними. И возникает ли исключение или нет, полностью зависит от того, какую строку вы пытаетесь преобразовать. Конечно, вы не можете конвертировать "". - person Rohit Jain; 27.11.2012
comment
Вы можете посмотреть на stackoverflow.com/questions/9619603/no- tryparsedouble-in-java или вопрос, который является дубликатом. - person TheBlastOne; 27.11.2012

Вы можете использовать шаблоны, чтобы определить, является ли строка целым числом или нет:

  Pattern pattern = Pattern.compile("^[-+]?\\d+(\\.\\d+)?$");
  Matcher matcher = pattern.matcher(var1);
  if (matcher.find()){
      // Your string is a number  
  } else {
      // Your string is not a number
  }

Вам нужно будет найти правильный шаблон (я не использовал их некоторое время), иначе кто-то может отредактировать мой ответ с правильным шаблоном.

*EDIT** : нашел шаблон для вас. отредактировал код. Я не тестировал его, но он взят с сайта java2s, который также предлагает еще более элегантный подход (скопировано с сайта):

 public static boolean isNumeric(String string) {
      return string.matches("^[-+]?\\d+(\\.\\d+)?$");
  }
person giorashc    schedule 27.11.2012
comment
Вам не нужно использовать anchors в случае String.matches. Это неявно. - person Rohit Jain; 27.11.2012
comment
Ну вот - +1 за честность, которую вы скопировали. :) - person Rohit Jain; 27.11.2012

Прежде всего, ваше условие if определенно не будет выполнено, потому что ссылка object на самом деле указывает на объект String. Таким образом, они не являются экземплярами каких-либо integer или double.

Чтобы проверить, можно ли преобразовать строку в integer или double, вы можете либо следовать подходу в ответе @Bedwyr, либо, если вы не хотите использовать try-catch, как я предполагаю из ваших комментариев (на самом деле, я не понимаю почему вы не хотите их использовать), вы можете использовать немного pattern matching: -

String str = "6.6";
String str2 = "6";

// If only digits are there, then it is integer
if (str2.matches("[+-]?\\d+")) {  
    int val = Integer.parseInt(str2);
    qt += val;
}

// digits followed by a `.` followed by digits
if (str.matches("[+-]?\\d+\\.\\d+")) {  
    double val = Double.parseDouble(str);
    wt += val;
}

Но поймите, что Integer.parseInt и Double.parseDouble — правильный способ сделать это. Это всего лишь альтернативный подход.

person Rohit Jain    schedule 27.11.2012

Возможно, регулярные выражения могут удовлетворить ваши потребности:

public static boolean isInteger(String s) {
    return s.matches("[-+]?[0-9]+");
}

public static boolean isDouble(String s) {
    return s.matches("[-+]?([0-9]+\\.([0-9]+)?|\\.[0-9]+)");
}

public static void main(String[] args) throws Exception {
    String s1 = "5.5";
    String s2 = "6";
    System.out.println(isInteger(s1));
    System.out.println(isDouble(s1));
    System.out.println(isInteger(s2));
    System.out.println(isDouble(s2));
}

Отпечатки:

false
true
true
false
person sp00m    schedule 27.11.2012
comment
@SyedMuhammadMubashir Ты имеешь дело с репутацией?! Я не буду голосовать за ваш вопрос, но вы можете не голосовать за мой;) - person sp00m; 27.11.2012
comment
@SyedMuhammadMubashir .. Я предполагаю, что вы задаете вопросы о SO, чтобы что-то узнать, а не покупать репутацию. Если вы делаете это на потом, то скорее отвечайте на вопросы здесь. И давайте очень хорошие ответы, если вы их знаете. Не призывайте людей голосовать за ваши посты. - person Rohit Jain; 27.11.2012

Integer.parseInt и Double.parseDouble возвращают целочисленное/двойное значение String. Если String не является допустимым числом, метод выдаст NumberFormatException.

String var1 = "5.5";

try {
    int number = Integer.parseInt(var1); // Will fail, var1 has wrong format
    qt += number;
} catch (NumberFormatException e) {
    // Do your thing if the check fails
}

try {
    double number = Double.parseDouble(var1); // Will succeed
    wt += number;
} catch (NumberFormatException e) {
    // Do your thing if the check fails
}
person Thorkil Holm-Jacobsen    schedule 27.11.2012