Java 如何在编辑文本中仅允许正数

Java 如何在编辑文本中仅允许正数,java,android,textwatcher,Java,Android,Textwatcher,我有一个TextWatcher,当所有EditText length()都为0现在我想添加一个功能,以确保数字为正。我尝试在另一个if()中放入一个新的if(),以检查if>0,但由于某些原因,它不起作用 所以我需要的是确保所有EditText都不是空的,并且输入了正数,然后启用该数字 这就是我所拥有的 public TextWatcher localWatcher = new TextWatcher() { @Override public void beforeTex

我有一个TextWatcher,当所有EditText length()都为0现在我想添加一个功能,以确保数字为正。我尝试在另一个if()中放入一个新的if(),以检查if>0,但由于某些原因,它不起作用

所以我需要的是确保所有EditText都不是空的,并且输入了正数,然后启用该数字

这就是我所拥有的

    public TextWatcher localWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
    }

    // When the text is edited, I want to check if all textViews are filled
    @Override
    public void afterTextChanged(Editable s) {

        // Check if any of the TextViews are == 0, if so the button remains disabled
        if      (et1local.getText().toString().length() == 0
                || et2local.getText().toString().length() == 0
                || et3local.getText().toString().length() == 0
                || et4local.getText().toString().length() == 0
                || et5local.getText().toString().length() == 0
                || et6local.getText().toString().length() == 0
                || et7local.getText().toString().length() == 0
                || et8local.getText().toString().length() == 0
                || et9local.getText().toString().length() == 0) {

            if(et1local){




        localCalculateButton.setEnabled(false);
            }

        }

        // When all are filled enable the button
        else {
            localCalculateButton.setEnabled(true);
        }
    }
};

这很好,但如何检查数字是否为正数,任何帮助都将非常感谢。

对于每个
EditText
,您必须执行以下操作:

if (Integer.parseInt(et1local.getText().toString()) > 0)
执行一个函数以确保它是一个数字

private boolean isPositive(EditText et)
{
    try
    {
        return Integer.parseInt(et.getText().toString()) > 0;
    }
    catch (Exception e)
    {
        return false;
    }
}
这样使用:

if (et1local.getText().toString().length() == 0 || !isPositive(et1local)
 || et2local.getText().toString().length() == 0 || !isPositive(et2local)
// [...]

您应该使用EditText的属性:

android:digits="0123456789."
android:inputType="number"

所以用户只能输入不带减号的数字

更新: 类似于此,要防止第一个符号为0:

    editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void afterTextChanged(Editable edt) {
            if (edt.length() == 1 && edt.toString().equals("0"))
                editText.setText("");
        }

        // ...
    });

这比ToYonos的回答有点冗长,但可能有助于理解这些原则。它还稍微简化了if块

private boolean isEditTextEmptyOrNegative(EditText editText) {
    // check if editText is empty
    if (editText.getText().toString().length() == 0)
        return true;

    // get text from editText
    String text = editText.getText().toString();

    try {
        // try to parse text to int
        int textInt = Integer.valueOf(text);

        // if int is > 0, return false (not empty or negative), else return true (int is negative)
        if (textInt > 0)
            return false;
        else
            return true;
    } catch (NumberFormatException nfe) {
        // catch NumberFormatException, text entered is not a valid int, treat it as empty (you may want to handle differently)
        return true;
    }
}
你的if块是这样的:

if (isEditTextEmptyOrNegative(et1local) || isEditTextEmptyOrNegative(et2local) || ... )

只需删除
onTextChanged
中的减号即可

public void onTextChanged(CharSequence s, int start, int before,
        int count) {

      et1Local.setText(et1local.getText().toString().replace"-",""));
      .....
      et9Local.setText(et9local.getText().toString().replace("-".""));
}

对我来说,只需设置
android:inputType=“number”
(没有
android:digits
部分)就可以了。

我在前导零转换为负数方面没有任何问题,正如您所看到的那样(我使用
Integer.valueOf(binding.myEditText.getEditableText().toString())
)。

用“-”替换“-”怎么样?您好,我已经实现了这个,但是我不想在第一个数字空间中加0,因为这是负数。@Getek99如果你同时设置了
android:digits=“0123456789.”android:inputType=“numberDecimal”
,那么它也应该只接受格式化的数字,(并去掉前导的0)。你是否尝试过用android:inputType=“numberDecimal”执行末日骑士的建议?如果android:inputType=“numberDecimal”没有帮助,那么您必须在TextWatcher中处理它。如果我的答案对你有帮助,请接受=)是的,我试过安卓:digits=“0123456789。”安卓:inputType=“numberDecimal”