我已经制作了一个Android计算器,最近我添加了+/-按钮。我面临的问题是,首先当我使用它时,按下相等的按钮,应用程序崩溃。此外,只要单击+/-按钮,数字就会变为浮点值,当我键入任何数字时,数字值会在小数点后继续。示例:我有200,我按+/-数字变为200.0,当我键入任何数字时,它变为200.01。我该如何克服这个问题?有人可以告诉我代码中需要进行哪些更改?这里是。 谢谢。 :)
public class MainActivity extends Activity {
Typeface font1, font2;
TextView tv1;
private EditText Scr; //textbox screen
private float NumberBf; //Save screen before pressing button operation;
private String Operation;
private ButtonClickListener btnClick;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
font1=Typeface.createFromAsset(getAssets(), "digits.ttf");
Scr=(EditText)findViewById(R.id.editText);
Scr.setTypeface(font1);
font2=Typeface.createFromAsset(getAssets(), "alexbrush.TTF");
tv1=(TextView)findViewById(R.id.textView1);
tv1.setTypeface(font2);
Scr = (EditText) findViewById(R.id.editText);
Scr.setEnabled(false);
btnClick = new ButtonClickListener();
int idList[] = {R.id.button0,R.id.button7, R.id.button1, R.id.button8,R.id.button9,R.id.button4,
R.id.button5,R.id.button6,R.id.button,R.id.button2,R.id.button3,R.id.buttonDot,
R.id.buttonMul,R.id.buttonDiv,R.id.buttonAdd,R.id.buttonSub,R.id.buttonC,
R.id.buttonEq, R.id.buttonSqrt, R.id.buttonsquare, R.id.buttonNp
};
for(int id:idList){
View v = (View) findViewById(id);
v.setOnClickListener(btnClick);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void mMath(String str){
NumberBf = Float.parseFloat(Scr.getText().toString()); //save the screen
Operation = str; //save operation
Scr.setText("0"); //Clear screen
}
public void getKeyboard(String str){
String ScrCurrent = Scr.getText().toString();
if(ScrCurrent.equals("0"))
ScrCurrent = "";
ScrCurrent += str;
Scr.setText(ScrCurrent);
}
public void mResult(){
float NumAf = Float.parseFloat(Scr.getText().toString());
float result = 0;
if(Operation.equals("+")){
result = NumAf + NumberBf;
}
if(Operation.equals("-")){
result = NumberBf - NumAf;
}
if(Operation.equals("*")){
result = NumAf * NumberBf;
}
if(Operation.equals("/")){
result = NumberBf / NumAf;
}
Scr.setText(String.format("%10d", result));
}
public void fnSqrt(){
double Number = Double.parseDouble(Scr.getText().toString());
Number = Math.sqrt(Number);
Scr.setText(String.valueOf(Number));
}
public void fnSquare(){
float Number1 = Float.parseFloat(Scr.getText().toString());
Number1 = pow(Number1, 2);
Scr.setText(String.valueOf(Number1));
}
public void fnNp(){
float Number = Float.parseFloat(Scr.getText().toString());
Number = Number*(-1);
Scr.setText(String.valueOf(Number));
}
private float pow(float number1, int i) {
return number1*number1;
}
private class ButtonClickListener implements OnClickListener{
public void onClick(View v){
switch (v.getId()){
case R.id.buttonC: //Clear screen
Scr.setText("0");
NumberBf = 0;
Operation = "";
break;
case R.id.buttonAdd: //function Add
mMath("+");
break;
case R.id.buttonSub:
mMath("-");
break;
case R.id.buttonMul:
mMath("*");
break;
case R.id.buttonDiv:
mMath("/");
break;
case R.id.buttonEq:
mResult();
break;
case R.id.buttonSqrt:
fnSqrt();
break;
case R.id.buttonNp:
fnNp();
break;
case R.id.buttonsquare:
fnSquare();
break;
default:
String numb = ((Button) v).getText().toString();
getKeyboard(numb);
break;
}
}
}
}
答案 0 :(得分:0)
关于你的第一个问题:你得到一个nullpointer异常吗?
public void mResult(){
float NumAf = Float.parseFloat(Scr.getText().toString());
不会阻止你的语句尝试将一个空字符串变成一个浮点数,这显然会让你的应用程序崩溃。因此,请包含一种在之前捕获空值的机制。
case R.id.buttonEq:
if (Scr.getText() != null)
mResult();
break;
我认为这是阻止mResult()
获取空值的最简单方法。
对于你的第二个问题:因为你做了
,它变成了浮动float Number = Float.parseFloat(Scr.getText().toString());`
当您将200投射到浮动中时,它变为200.00,将作为字符串返回。
编辑:我意识到你也有一个dotButton(你的代码非常混乱)。当然,建议的替代方法不适用于十进制数,因为它总是会转换您的number
值。为了防止这种行为,你可以实现一个简单的if / else语句。
public void fnNp() {
if (Scr.getText().toString().contains(".")) {
float Number = Float.parseFloat(Scr.getText().toString());
Number = Number*(-1);
Scr.setText(String.valueOf(Number));
} else {
int number = Integer.parseInt(Scr.getText().toString());
Number = Number*(-1);
Scr.setText(String.valueOf(Number));
}
}
答案 1 :(得分:0)
你需要在mResult中做一个if语句来检查float是否与float的int的float有一个绝对差值,小于Float.MIN_VALUE,然后得到float的int的toString相反,如果是。
在函数setScreenTextWithNumber(Number n)中包含调用Scr.setText(Float f) 并在那里检查。
如果您只是检查小数点,那么2.0000 / 2 = 1.000,如果这是你想要的。 否则,检查显着差异会产生一个调用,即与最接近的整数没有显着差异的数字是整数。