计算器中的小数点 android
Decimal points in calculator android
我正在 android 中创建一个计算器应用程序。问题是如何检查单个数值中是否存在两位小数。目前我的计算器允许输入 1.2.3
这样的输入是非法的。如果使用了运算符,它必须允许小数。例如 1.1+2.2
是合法的,但 1.1.1+2.2
不是。
这是我的小数处理代码:
public class TrialCalculator extends AppCompatActivity implements Button.OnClickListener {
Button btn1, btn2, btnBack, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn0, btnPlus, btnMinus, btnMul, btnDiv, btnEquals, btnClear, btnDecimal, btnPercent;
EditText calcResult;
double number = 0;
private char opcode = '1';
private void handleDecimal() {
if (opcode == 0) clear();
if (calcResult.getText() == null) {
calcResult.setText("0.");
calcResult.setSelection(2);
} else {
String txt = calcResult.getText().toString();
if (txt.lastIndexOf(".")<txt.length()-1) {
calcResult.append(".");
}
}
}
}
我正在从 onClick
方法中调用 buttonDot
。
lastIndexOf
returns -1 如果在字符串中找不到该字符。所以你的条件 txt.lastIndexOf(".")<txt.length()-1
总是 true
。您可以将其更改为
txt.lastIndexOf(".") == -1
您可以将正则表达式与 matches
函数一起使用
\d*
表示匹配零个或多个数字
(\.\d+)?
匹配 .
后跟一个或多个数字,?
表示给定组
的零次或一次匹配
Regex Demo : 注意 java 中的 matches
函数,我们不需要 ^
开始和 $
结束锚
代码
if (txt.matches("\d*(\.\d+)?")) {
// number has one decimal
}
else{
// number has more than one decimal
}
注意: 如果您不想允许像 .5
这样的值,则使用 \d+
而不是 \d*
as
\d+(\.\d+)?
如@Code-Apprentice 所建议,如果您想接受 4343.
等值
你可以使用
\d*(\.\d*)?
使用文本观察器
calcResult.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {
boolean flag = s.toString().matches("\d*(\.\d*)?");
if(!flag){
// calcResult.setError...
// you display a toast
}
}
});
更新:要用运算符匹配多个值,可以使用
(\d*(\.\d*)?([+\-*%\]|$))*
测试用例
String pat="(\d*(\.\d*)?([+\-*%\]|$))*";
System.out.println("4.5-3.3+3.4".matches(pat));
System.out.println(".5".matches(pat));
System.out.println("4".matches(pat));
System.out.println("4.5.5-4.4".matches(pat));
System.out.println("4.44.5+4.4.4".matches(pat));
System.out.println("4.".matches(pat));
输出:
true
true
true
false
false
true
一个解决方案是有一个跟踪小数点的标志:
class MyCalculator {
private hasDecimal = false;
// ...
}
在用户第一次键入小数时将此标志设置为 true
。然后检查标志以查看之前是否键入了小数。
当然,这仅在您直接响应每个按键而不是在用户键入整个数字后从 EditText
获取整个输入时才有效。
检查单个数字中是否存在两位小数,然后按小数点拆分字符串。
例如,
String txt = calcResult.getText().toString();
String[] decimals = txt.split("\.");
if(decimals.length > 2) {
// txt contains more than 1 decimal.
// Your logic ..
}
我正在 android 中创建一个计算器应用程序。问题是如何检查单个数值中是否存在两位小数。目前我的计算器允许输入 1.2.3
这样的输入是非法的。如果使用了运算符,它必须允许小数。例如 1.1+2.2
是合法的,但 1.1.1+2.2
不是。
这是我的小数处理代码:
public class TrialCalculator extends AppCompatActivity implements Button.OnClickListener {
Button btn1, btn2, btnBack, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn0, btnPlus, btnMinus, btnMul, btnDiv, btnEquals, btnClear, btnDecimal, btnPercent;
EditText calcResult;
double number = 0;
private char opcode = '1';
private void handleDecimal() {
if (opcode == 0) clear();
if (calcResult.getText() == null) {
calcResult.setText("0.");
calcResult.setSelection(2);
} else {
String txt = calcResult.getText().toString();
if (txt.lastIndexOf(".")<txt.length()-1) {
calcResult.append(".");
}
}
}
}
我正在从 onClick
方法中调用 buttonDot
。
lastIndexOf
returns -1 如果在字符串中找不到该字符。所以你的条件 txt.lastIndexOf(".")<txt.length()-1
总是 true
。您可以将其更改为
txt.lastIndexOf(".") == -1
您可以将正则表达式与 matches
函数一起使用
\d*
表示匹配零个或多个数字
(\.\d+)?
匹配 .
后跟一个或多个数字,?
表示给定组
Regex Demo : 注意 java 中的 matches
函数,我们不需要 ^
开始和 $
结束锚
代码
if (txt.matches("\d*(\.\d+)?")) {
// number has one decimal
}
else{
// number has more than one decimal
}
注意: 如果您不想允许像 .5
这样的值,则使用 \d+
而不是 \d*
as
\d+(\.\d+)?
如@Code-Apprentice 所建议,如果您想接受 4343.
等值
你可以使用
\d*(\.\d*)?
使用文本观察器
calcResult.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {
boolean flag = s.toString().matches("\d*(\.\d*)?");
if(!flag){
// calcResult.setError...
// you display a toast
}
}
});
更新:要用运算符匹配多个值,可以使用
(\d*(\.\d*)?([+\-*%\]|$))*
测试用例
String pat="(\d*(\.\d*)?([+\-*%\]|$))*";
System.out.println("4.5-3.3+3.4".matches(pat));
System.out.println(".5".matches(pat));
System.out.println("4".matches(pat));
System.out.println("4.5.5-4.4".matches(pat));
System.out.println("4.44.5+4.4.4".matches(pat));
System.out.println("4.".matches(pat));
输出:
true
true
true
false
false
true
一个解决方案是有一个跟踪小数点的标志:
class MyCalculator {
private hasDecimal = false;
// ...
}
在用户第一次键入小数时将此标志设置为 true
。然后检查标志以查看之前是否键入了小数。
当然,这仅在您直接响应每个按键而不是在用户键入整个数字后从 EditText
获取整个输入时才有效。
检查单个数字中是否存在两位小数,然后按小数点拆分字符串。
例如,
String txt = calcResult.getText().toString();
String[] decimals = txt.split("\.");
if(decimals.length > 2) {
// txt contains more than 1 decimal.
// Your logic ..
}