2016-02-13 3 views
-2

У меня есть массив с именем вопросов массив для String типа, который хранится в вопросах. Я хочу преобразовать questionArray[0] в int. Я использовал для этого следующее утверждение.Как преобразовать строку, содержащую математическое выражение в целое число?

int aa = Integer.parseInt(questionArray[0]); 

Но когда я реализую это заявление и когда я запустить приложение я получаю сообщение об ошибке сказав: invalid int: "10-4". Обратите внимание, что 10-4 может быть любым случайным арифметическим выражением, потому что его случайная игра вопросов. например .: 9+1, 10/5 и т.д.

+0

Если я правильно понял, вопросArray [0] равен «10-4», который представляет собой строку с символами, которые не являются номерами, здесь '- ' персонаж. ParseInt может обрабатывать числа, а не выражения, если я правильно помню. Вам нужно будет написать функцию, которая извлекает кулак и второе число из строки, а затем выполняет математику в соответствии с оператором между –

+0

. Я удалил свой ответ, и теперь я работаю над новым. Удерживайте туго –

+0

, почему этот вопрос имеет такой низкий балл? он следует всем правилам для запроса хорошего вопроса, и это довольно очевидно, что проблема ...? ребята, не просто голосуйте, оставляйте хотя бы комментарий ..! –

ответ

0

Это немного сложнее, чем просто разбор String, поскольку она имеет арифметический знак, и это может быть что угодно. Таким образом, позволяет перейти на шаг за шагом:

//Lets say you have a string like this 
questionArray[0] = "10+4"; 
//Lets find the Arithmetic sign first in the String 
String sign = null; 

Pattern regex = Pattern.compile("[+*/]|(?<=\\s)-"); 
Matcher matcher = regex.matcher(questionArray[0]); 
    while(matcher.find()) { 
     sign = matcher.group().trim(); //Store that Arithmetic sign here.  
    } 

String [] parts = questionArray[0].split("[+*/]|(?<=\\s)-"); //Now break up the string using this regex. 
               //This regex will find whatever Arithmetic sign 
               //there is inside this String and store the result 
               //in parts array. 

int firstNumber = Integer.parseInt(parts[0]); //The first number in the String 
int secondNumber = Integer.parseInt(parts[1]);//The second number in the String 

//a simple if-else statements that will help us find the final answer. 
int result = 0; 
if (sign.equals("+")){ 
    result = firstNumber + secondNumber; 
} else if (sign.equals("-")) { 
    result = firstNumber - secondNumber; 
} else if(sign.equals("*")) {  
    result = firstNumber * secondNumber; 
} else if (sign.equals("/")){ 
    result = firstNumber/secondNumber; 
} else { 
    System.out.println("unknown operation"); 
} 

System.out.println(result); 
+0

OP действительно сказать это. – Hackerdarshi

+0

@FarazDurrani какой если его /, * или +? – Harsh

+0

@Faraz Durrani не нужно грубить! + у вас есть 4 'if' условия, которые являются эксклюзивными друг для друга. но все 4 выполняются. возможно, ваш код принесет пользу некоторым 'else if's. или, может быть, даже «случай переключения»? –

3

Простой ответ, что «10-4» не является простым числом, это вычисление, поэтому разбор его к междунар не даст никаких результатов ..

Вам придется разобрать вашу строку ..

int aa = evaluteQuestion(questionArray[0]); 

И реальное волшебство происходит здесь:

public static int evaluteQuestion(String question){ 
    Scanner sc = new Scanner(question); 

    // get the next number from the scanner 
    int firstValue = Integer.parseInt(sc.findInLine("[0-9]*")); 

    // get everything which follows and is not a number (might contain white spaces) 
    String operator = sc.findInLine("[^0-9]*").trim(); 
    int secondValue = Integer.parseInt(sc.findInLine("[0-9]*")); 
    switch (operator){ 
     case "+": 
      return firstValue + secondValue; 
     case "-": 
      return firstValue - secondValue; 
     case "/": 
      return firstValue/secondValue; 
     case "*": 
      return firstValue * secondValue; 
     case "%": 
      return firstValue % secondValue; 
     // todo: add additional operators as needed.. 
     default: 
      throw new RuntimeException("unknown operator: "+operator); 
    } 
} 

Если у вас есть мо в ваших выражениях, вы можете поставить код выше в цикл. Однако следите за порядком работы. Вещи могут стать немного волосатыми, если вы хотите реализовать правильный парсер для любого выражения

+1

Вам нужно сделать 'int result = 0;'. Else, компилятор покажет ошибку. – Hackerdarshi

+0

там вы, исправили его;) –

+0

@Hackerdarshi Нет, это не обязательно, так как программа не достигнет результата возврата до его инициализации. Исправление по-прежнему стоит того, так как теперь лучше код imho. – Tom

Смежные вопросы