2015-04-22 42 views
0

下面是對於計算器Android應用其中我提出的代碼:乘法計算器Android應用投擲的Alpha-Beta在輸出

package com.example.calculator; 

import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.util.Iterator; 
import java.util.Stack; 
import java.lang.Math; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.AdapterView; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.GridView; 
import android.view.View; 
import android.view.View.OnClickListener; 

public class main extends Activity { 
    GridView mKeypadGrid; 
    TextView userInputText; 
    TextView memoryStatText; 

    Stack<String> mInputStack; 
    Stack<String> mOperationStack; 

    KeypadAdapter mKeypadAdapter; 
    TextView mStackText; 
    boolean resetInput = false; 
    boolean hasFinalResult = false; 

    String mDecimalSeperator; 
    double memoryValue = Double.NaN; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     DecimalFormat currencyFormatter = (DecimalFormat) NumberFormat 
       .getInstance(); 
     char decimalSeperator = currencyFormatter.getDecimalFormatSymbols() 
       .getDecimalSeparator(); 
     mDecimalSeperator = Character.toString(decimalSeperator); 

     setContentView(R.layout.main); 

     // Create the stack 
     mInputStack = new Stack<String>(); 
     mOperationStack = new Stack<String>(); 

     // Get reference to the keypad button GridView 
     mKeypadGrid = (GridView) findViewById(R.id.grdButtons); 

     // Get reference to the user input TextView 
     userInputText = (TextView) findViewById(R.id.txtInput); 
     userInputText.setText("0"); 

     memoryStatText = (TextView) findViewById(R.id.txtMemory); 
     memoryStatText.setText(""); 

     mStackText = (TextView) findViewById(R.id.txtStack); 

     // Create Keypad Adapter 
     mKeypadAdapter = new KeypadAdapter(this); 

     // Set adapter of the keypad grid 
     mKeypadGrid.setAdapter(mKeypadAdapter); 

     // Set button click listener of the keypad adapter 
     mKeypadAdapter.setOnButtonClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Button btn = (Button) v; 
       // Get the KeypadButton value which is used to identify the 
       // keypad button from the Button's tag 
       KeypadButton keypadButton = (KeypadButton) btn.getTag(); 

       // Process keypad button 
       ProcessKeypadInput(keypadButton); 
      } 
     }); 

     mKeypadGrid.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, 
        int position, long id) { 

      } 
     }); 

    } 

    private void ProcessKeypadInput(KeypadButton keypadButton) { 
     //Toast.makeText(this, keypadButton.getText(), Toast.LENGTH_SHORT).show(); 
     String text = keypadButton.getText().toString(); 
     String currentInput = userInputText.getText().toString(); 

     int currentInputLen = currentInput.length(); 
     String evalResult = null; 
     double userInputValue = Double.NaN; 

     switch (keypadButton) { 
     case BACKSPACE: // Handle backspace 
      // If has operand skip backspace 
      if (resetInput) 
       return; 

      int endIndex = currentInputLen - 1; 

      // There is one character at input so reset input to 0 
      if (endIndex < 1) { 
       userInputText.setText("0"); 
      } 
      // Trim last character of the input text 
      else { 
       userInputText.setText(currentInput.subSequence(0, endIndex)); 
      } 
      break; 
     case SIGN: // Handle -/+ sign 
      // input has text and is different than initial value 0 
      if (currentInputLen > 0 && currentInput != "0") { 
       // Already has (-) sign. Remove that sign 
       if (currentInput.charAt(0) == '-') { 
        userInputText.setText(currentInput.subSequence(1, 
          currentInputLen)); 
       } 
       // Prepend (-) sign 
       else { 
        userInputText.setText("-" + currentInput.toString()); 
       } 
      } 
      break; 
     case CE: // Handle clear input 
      userInputText.setText("0"); 
      break; 
     case C: // Handle clear input and stack 
      userInputText.setText("0"); 
      clearStacks(); 
      break; 
     case DECIMAL_SEP: // Handle decimal separator 
      if (hasFinalResult || resetInput) { 
       userInputText.setText("0" + mDecimalSeperator); 
       hasFinalResult = false; 
       resetInput = false; 
      } else if (currentInput.contains(".")) 
       return; 
      else 
       userInputText.append(mDecimalSeperator); 
      break; 
     case DIV: 
     case PLUS: 
     case MINUS: 
     case MULTIPLY: 
      if (resetInput) { 
       mInputStack.pop(); 
       mOperationStack.pop(); 
      } else { 
       if (currentInput.charAt(0) == '-') { 
        mInputStack.add("(" + currentInput + ")"); 
       } else { 
        mInputStack.add(currentInput); 
       } 
       mOperationStack.add(currentInput); 
      } 

      mInputStack.add(text); 
      mOperationStack.add(text); 

      dumpInputStack(); 
      evalResult = evaluateResult(false); 
      if (evalResult != null) 
       userInputText.setText(evalResult); 

      resetInput = true; 
      break; 
     case CALCULATE: 
      if (mOperationStack.size() == 0) 
       break; 

      mOperationStack.add(currentInput); 
      evalResult = evaluateResult(true); 
      if (evalResult != null) { 
       clearStacks(); 
       userInputText.setText(evalResult); 
       resetInput = false; 
       hasFinalResult = true; 
      } 
      break; 
     case M_ADD: // Add user input value to memory buffer 
      userInputValue = tryParseUserInput(); 
      if (Double.isNaN(userInputValue)) 
       return; 
      if (Double.isNaN(memoryValue)) 
       memoryValue = 0; 
      memoryValue += userInputValue; 
      displayMemoryStat(); 

      hasFinalResult = true; 

      break; 
     case M_REMOVE: // Subtract user input value to memory buffer 
      userInputValue = tryParseUserInput(); 
      if (Double.isNaN(userInputValue)) 
       return; 
      if (Double.isNaN(memoryValue)) 
       memoryValue = 0; 
      memoryValue -= userInputValue; 
      displayMemoryStat(); 
      hasFinalResult = true; 
      break; 
     case MC: // Reset memory buffer to 0 
      memoryValue = Double.NaN; 
      displayMemoryStat(); 
      break; 
     case MR: // Read memoryBuffer value 
      if (Double.isNaN(memoryValue)) 
       return; 
      userInputText.setText(doubleToString(memoryValue)); 
      displayMemoryStat(); 
      break; 
     case MS: // Set memoryBuffer value to user input 
      userInputValue = tryParseUserInput(); 
      if (Double.isNaN(userInputValue)) 
       return; 
      memoryValue = userInputValue; 
      displayMemoryStat(); 
      hasFinalResult = true; 
      break; 
     default: 
      if (Character.isDigit(text.charAt(0))) { 
       if (currentInput.equals("0") || resetInput || hasFinalResult) { 
        userInputText.setText(text); 
        resetInput = false; 
        hasFinalResult = false; 
       } else { 
        userInputText.append(text); 
        resetInput = false; 
       } 

      } 
      break; 

     } 

    } 

    private void clearStacks() { 
     mInputStack.clear(); 
     mOperationStack.clear(); 
     mStackText.setText(""); 
    } 

    private void dumpInputStack() { 
     Iterator<String> it = mInputStack.iterator(); 
     StringBuilder sb = new StringBuilder(); 

     while (it.hasNext()) { 
      CharSequence iValue = it.next(); 
      sb.append(iValue); 

     } 

     mStackText.setText(sb.toString()); 
    } 

    private String evaluateResult(boolean requestedByUser) { 
     if ((!requestedByUser && mOperationStack.size() != 4) 
       || (requestedByUser && mOperationStack.size() != 3)) 
      return null; 

     String left = mOperationStack.get(0); 
     String operator = mOperationStack.get(1); 
     String right = mOperationStack.get(2); 
     String tmp = null; 
     if (!requestedByUser) 
      tmp = mOperationStack.get(3); 

     double leftVal = Double.parseDouble(left.toString()); 
     double rightVal = Double.parseDouble(right.toString()); 
     double result = Double.NaN; 

     if (operator.equals(KeypadButton.DIV.getText())) { 
      result = leftVal/rightVal; 
     } else if (operator.equals(KeypadButton.MULTIPLY.getText())) { 
      result = leftVal * rightVal; 
     } else if (operator.equals(KeypadButton.PLUS.getText())) { 
      result = leftVal + rightVal; 
     } else if (operator.equals(KeypadButton.MINUS.getText())) { 
      result = leftVal - rightVal; 
     } 

     String resultStr = doubleToString(result); 
     if (resultStr == null) 
      return null; 

     mOperationStack.clear(); 
     if (!requestedByUser) { 
      mOperationStack.add(resultStr); 
      mOperationStack.add(tmp); 
     } 

     return resultStr; 
    } 

    private String doubleToString(double value) { 
     if (Double.isNaN(value)) 
      return null; 

     long longVal = (long) value; 
     if (longVal == value) 
      return Long.toString(longVal); 
     else 
      return Double.toString(value); 

    } 

    private double tryParseUserInput() { 
     String inputStr = userInputText.getText().toString(); 
     double result = Double.NaN; 
     try { 
      result = Double.parseDouble(inputStr); 
     } catch (NumberFormatException nfe) { 
     } 

     return result; 

    } 

    private void displayMemoryStat() { 
     if (Double.isNaN(memoryValue)) { 
      memoryStatText.setText(""); 
     } else { 
      memoryStatText.setText("M = " + doubleToString(memoryValue)); 
     } 
    } 

} 

當我請輸入作爲45454545454545 * 54545454545454,輸出被示爲2.479338842975157E27 。我在輸出中得到一些字母E.

乘法代碼:

if (operator.equals(KeypadButton.MULTIPLY.getText())) { 
      result = leftVal * rightVal; 
    } 

而是電子商務,我想說明的結果爲_______ * 10^x的。 任何人都可以幫我解決這個問題嗎?提前致謝。

+1

的E顯示它是指數 - 它是正常,你瞄準什麼? –

+0

@DaveGordon而不是E,我想顯示結果爲_______ * 10^x,那麼如何解決它? –

回答

1

你說的是如何顯示的數字..所以你可以使用NumberFormat指定數量應如何顯示,如:

NumberFormat formatter = new DecimalFormat("#0.00"); 

欲瞭解更多信息:

  1. http://developer.android.com/reference/java/text/NumberFormat.html
  2. http://developer.android.com/reference/java/text/DecimalFormat.html

這裏是一個很好的例子:http://www.coderzheaven.com/2012/10/14/numberformat-class-android-rounding-number-android-formatting-decimal-values-android/

如果你想保持它,因爲它是,只是想更換指數E^,爲什麼不嘗試:

string.replace("E", "^") 
0

猜想它就像每個計算器!

的E代表「爲次十的力量」

所以這是10^27 * yourresult,所以它不是一個錯誤!

+0

所以如果我想將結果顯示爲_______ * 10^27,那麼如何解決? –

+0

https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html使用您需要的模式。如果它不是以這種方式工作的話,只需將你的值轉換爲字符串,在'E'處刪除點,在結果中計算數字並根據子字符串的數字添加零。 – PKAP