我目前正在尝试制作一个自动在其中保留两位小数的计算器,然后按一个编号的Button
将其添加到TextView
中显示的值中,同时保持两位小数。例如,如果按下1,则该值应为0.01。但是似乎我发现String
的行为很奇怪,我不确定我目前正在做什么。
这是我的相关代码
public void keyPressed(View v){
String btnTxtVal = ((Button) v).getText().toString();
String lblTxtVal = lblInput.getText().toString();
inputTxt.append(btnTxtVal);
temp = Double.parseDouble(inputTxt.toString()) / 100;
lblInput.setText(decimalFormat.format(temp));
Log.d(TAG, "btn: "+btnTxtVal+" temp: "+temp);
Log.d(TAG, "formattedTemp: "+decimalFormat.format(temp));
}
上面的代码通过DataBinding调用,因为它位于Fragment
中。
问题在于,当我按下数字Button
之后按下数字Button
时,由于某种原因,数字前面会添加一个额外的零。
这就是我的日志。
pressedBtn: 1 temp: 0.01
formattedTemp: 0.01
pressedBtn: 2 temp: 0.12
formattedTemp: 0.12
pressedBtn: 3 temp: 1.23
formattedTemp: 1.23
pressedBtn: 4 temp: 12.34
formattedTemp: 12.34
pressedBtn: 00 temp: 1234.0
formattedTemp: 1,234
pressedBtn: 0 temp: 12340.0
formattedTemp: 12,340
pressedBtn: 3 temp: 123400.03
formattedTemp: 123,400.03
这是我当前正在使用的代码。
public class KeypadFragment extends Fragment {
private View rootView;
private Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn0, btn00, btnDelete, btnPlus;
private TextView lblInput;
private Double firstInput = 0.00, secondInput = 0.00, temp = 0.00, currentSum = 0.00;
private DecimalFormat decimalFormat = new DecimalFormat("#,###.##");
private StringBuilder inputTxt = new StringBuilder();
String TAG = "sharePOS";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_keypad, container, false);
btn1 = rootView.findViewById(R.id.btnKeypad1);
btn2 = rootView.findViewById(R.id.btnKeypad2);
btn3 = rootView.findViewById(R.id.btnKeypad3);
btn4 = rootView.findViewById(R.id.btnKeypad4);
btn5 = rootView.findViewById(R.id.btnKeypad5);
btn6 = rootView.findViewById(R.id.btnKeypad6);
btn7 = rootView.findViewById(R.id.btnKeypad7);
btn8 = rootView.findViewById(R.id.btnKeypad8);
btn9 = rootView.findViewById(R.id.btnKeypad9);
btn0 = rootView.findViewById(R.id.btnKeypad0);
btn00 = rootView.findViewById(R.id.btnKeypad00);
btnDelete = rootView.findViewById(R.id.btnKeypadDelete);
btnPlus = rootView.findViewById(R.id.btnKeypadAdd);
lblInput = rootView.findViewById(R.id.lblKeypadInput);
FragmentKeypadBinding binding = DataBindingUtil.bind(rootView);
binding.setFragment(this);
btnPlus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
lblInput.setText("0.00");
inputTxt = new StringBuilder();
if(firstInput == 0.00){
firstInput = Double.parseDouble(lblInput.getText().toString());
}else if(secondInput == 0.00){
secondInput = Double.parseDouble(lblInput.getText().toString());
firstInput += secondInput;
secondInput = 0.00;
}
}
});
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
lblInput.setText("0.00");
inputTxt = new StringBuilder();
firstInput = 0.00;
secondInput = 0.00;
}
});
return rootView;
}
public void keyPressed(View v){
String btnTxtVal = ((Button) v).getText().toString();
String lblTxtVal = lblInput.getText().toString();
inputTxt.append(btnTxtVal);
temp = Double.parseDouble(inputTxt.toString()) / 100;
lblInput.setText(decimalFormat.format(temp));
Log.d(TAG, "btn: "+btnTxtVal+" temp: "+temp);
Log.d(TAG, "formattedTemp: "+decimalFormat.format(temp));
}
}
我的布局有单独的0
和00
Button
。
答案 0 :(得分:0)
您显示的所有代码似乎都可以正常工作。这里有一个基于您的代码的微型示例项目,证明它可以正常工作:
class Main{
public static void main(String[] a){
String lblTextVal = "0.00";
String inputText = "";
System.out.println("Starting with: lblTextVal: "+lblTextVal + " inputText: \""+inputText+"\"");
System.out.println();
java.text.NumberFormat decimalFormat = new java.text.DecimalFormat("#,##0.00");
for(String btnPress : new String[]{"1","2","3","4","0","0","3"}){
inputText += btnPress; // inputTxt.append(btnTxtVal);
Double temp = Double.parseDouble(inputText.toString()) / 100;
lblTextVal = decimalFormat.format(temp); // lblInput.setText(decimalFormat.format(temp));
System.out.println("pressedBtn: "+btnPress+" temp: "+temp);
System.out.println("formattedTemp: "+decimalFormat.format(temp));
System.out.println();
}
}
}
日志中的怪异部分是最后三个部分:
pressedBtn: 00 temp: 1234.0
formattedTemp: 1,234
pressedBtn: 0 temp: 12340.0
formattedTemp: 12,340
pressedBtn: 3 temp: 123400.03
formattedTemp: 123,400.03
应该是哪个:
pressedBtn: 0 temp: 123.4
formattedTemp: 123.40
pressedBtn: 0 temp: 1234.0
formattedTemp: 1,234.00
pressedBtn: 3 temp: 12340.03
formattedTemp: 12,340.03
根据您的代码,我只看到三个可能的原因之一:
decimalFormat
不正确。00
,该按钮一次附加了两个00
,而不是一个0
。inputTxt
附加在两者之间的其他位置。最可能的原因可能是您的日志似乎反映的选项2。尽管选项1也绝对是不正确的,但由于formattedTemp
在倒数第二个和倒数第三个部分(上面我复制的三个中的前两个)中缺少十进制值。