2014-11-10 2 views
0

Я работаю над проектом калькулятора. Я использую метод для разделения символов и числовых значений. , но я получаю проблему, когда у меня есть десятичное значение, потому что результат показан 0, когда выполняется десятичное значение. вот код.проверить десятичную или точку Java

List<Double> numbers = new ArrayList<>(); 
 
List<Character> operators = new ArrayList<>(); 
 
.................. 
 

 
void testing() { 
 

 
    String userInput = "234+234+234"; 
 
    /* ignore the line above its just for understanding */ 
 
    /*the above works fine but if we change it to below its dont work.*/ 
 
    String userInput = "234+2.3+4.2"; 
 
    /* The both lines above are just for understanding actually i am getting text from edittext*/ 
 
    String userInput = currentcalc.getText().toString(); 
 
    for (char c : userInput.toCharArray()) { 
 
    \t if (!Character.isDigit(c)) { 
 
      s1 = Double.parseDouble(s2); 
 
      numbers.add(s1); 
 
      operators.add(c); 
 
      handler++; 
 
      s2 = ""; 
 
      s1 = 0; 
 
    \t } else { 
 
      s = Character.toString(c); 
 
      s2 += s; 
 
     } 
 
    } 
 
    result(); 
 
}

результат = 0.0

с и с2 являются строками, а s1 является двойным. и в моем коде, если c не является цифрой, он сохраняет значение оператора, например, +, - etc, а также сохраняет значение цифр и других вещей. я хочу знать, почему ». не сохраняется с помощью этого кода и почему результат показывает 0,0

результат(); код здесь ниже

void result() { 
 

 
\t \t double total4 = 0; 
 
\t \t s1 = Double.parseDouble(s2); 
 
\t \t numbers.add(s1); 
 
\t \t if (handler < 1) { 
 
\t \t \t total4 = Double.parseDouble(currentcalc.getText().toString()); 
 
\t \t } else { 
 
\t \t \t int i = 0; 
 
\t \t \t for (i = 0; i < handler; i++) { 
 

 
\t \t \t \t switch (operators.get(i)) { 
 
\t \t \t \t case '/': 
 

 
\t \t \t \t \t total3 = numbers.get(i)/numbers.get(i + 1); 
 
\t \t \t \t \t total4 = total3; 
 
\t \t \t \t \t numbers.remove(i + 1); 
 
\t \t \t \t \t numbers.set(i, total4); 
 
\t \t \t \t \t operators.remove(i); 
 
\t \t \t \t \t handler--; 
 
\t \t \t \t \t i--; 
 
\t \t \t \t \t break; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t for (i = 0; i < handler; i++) { 
 
\t \t \t \t switch (operators.get(i)) { 
 
\t \t \t \t case '*': 
 

 
\t \t \t \t \t total3 = numbers.get(i) * numbers.get(i + 1); 
 
\t \t \t \t \t total4 = total3; 
 
\t \t \t \t \t numbers.remove(i + 1); 
 
\t \t \t \t \t numbers.set(i, total4); 
 
\t \t \t \t \t operators.remove(i); 
 
\t \t \t \t \t handler--; 
 
\t \t \t \t \t i--; 
 
\t \t \t \t \t break; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t for (i = 0; i < handler; i++) { 
 
\t \t \t \t switch (operators.get(i)) { 
 
\t \t \t \t case '+': 
 

 
\t \t \t \t \t total3 = numbers.get(i) + numbers.get(i + 1); 
 
\t \t \t \t \t total4 = total3; 
 
\t \t \t \t \t numbers.remove(i + 1); 
 
\t \t \t \t \t numbers.set(i, total4); 
 
\t \t \t \t \t operators.remove(i); 
 
\t \t \t \t \t break; 
 
\t \t \t \t case '-': 
 

 
\t \t \t \t \t total3 = numbers.get(i) - numbers.get(i + 1); 
 
\t \t \t \t \t total4 = total3; 
 
\t \t \t \t \t numbers.remove(i + 1); 
 
\t \t \t \t \t numbers.set(i, total4); 
 
\t \t \t \t \t operators.remove(i); 
 

 
\t \t \t \t \t break; 
 
\t \t \t \t } 
 
\t \t \t \t handler--; 
 
\t \t \t \t i--; 
 
\t \t \t } 
 
\t \t } 
 
\t \t et1.setText(Double.toString(total4)); 
 
\t \t resettext = 1; 
 
\t }

+0

Что делает ваш код, когда он пытается выполнить «.». operatator? На данный момент вы лечите "." как оператор, так же, как «+». –

+0

Использовать механизм javascript, доступный в Java, для выражения выражения. – Wajahat

+0

s и s2 - это строки, а s1 - двойные. и в моем коде, если c не является цифрой, он сохраняет значение оператора, например, +, - etc, а также сохраняет значение цифр и других вещей. я хочу знать, почему ». не сохраняется через этот код и почему результат показывается 0.0 – Andriopak

ответ

1

После вашего метода result(), total4 устанавливается в 0.0 в начале, и ни один код никогда не меняет его, когда «.» оператор встречается.

Ошибка в том, что вы лечите "." как оператор. Имейте специальный код в своем синтаксическом цикле, чтобы рассматривать его как часть числа. Вам нужно изменить строку if (!Character.isDigit(c)) { и обработать логику математики.

0

Если не требуется для реализации какого-либо конкретного алгоритма, то вы можете использовать:

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("js");   
Object result = engine.eval("3+4"); 

В противном случае вы можете захотеть взглянуть на следующее: Shunting Yard Algorithm

+0

wajahat bro я действительно не понимаю ваш вышеприведенный код, вы можете объяснить простым способом? – Andriopak

+0

Функция eval в JS может вычислять строки, которые являются математическими выражениями. Java может загружать JS-движок и использовать функцию eval. – Wajahat

+1

Он говорит, не переустанавливайте калькулятор, так как он есть в движке JavaScript. Это действительно, но я думаю, что это не полезно, поскольку вы изучаете Java, а не просто пытаетесь использовать JS. –

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