从 android 中的自定义零按钮中删除编辑文本中的前导零

Remove leading zero in edittext from a custom zero button in android

我已经使用 addTextChangedListener(new TextWatcher() 删除前导零,但它只适用于 android 软键盘 numpad 而不是我的自定义 numpadn0 是归零按钮。基本上每当我按下归零按钮时,我的应用程序就会崩溃。


    //自定义归零按钮
            n0.setOnClickListener(新View.OnClickListener() {
                @覆盖
                public void onClick(View v) {
                        input1.append("0");
                        操作A();
                }
            });

我只需要这样的代码,即零按钮在单击时不会 return 任何值以避免前导零。下面是 addTextChangedListener(new TextWatcher()


    input1.addTextChangedListener(新的 TextWatcher() {
            @覆盖
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

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

            }

            @覆盖
            public void afterTextChanged(Editable s) {
                如果 (s.toString().length() == 1 && s.toString().startsWith("0")) {
                    s.clear();
                }
            }
        });

出现这些错误:


    AndroidRuntime:致命异常:主要
        进程:上下文,PID:12408
        java.lang.NumberFormatException: 空字符串
            在 java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1071)
            在 java.lang.Double.valueOf(Double.java:511)
            在 context.operationA(MainActivity.java:478)
            在上下文$17.onClick(MainActivity.java:383)
            在 android.view.View.performClick(View.java:5610)
            在 android.view.View$PerformClick.run(View.java:22265)
            在 android.os.Handler.handleCallback(Handler.java:751)
            在 android.os.Handler.dispatchMessage(Handler.java:95)
            在 android.os.Looper.loop(Looper.java:154)
            在 android.app.ActivityThread.main(ActivityThread.java:6077)
            在 java.lang.reflect.Method.invoke(本机方法)
            在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
            在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

当您尝试在 operationA 方法中将字符串解析为 double 但字符串为空时发生错误,请在转换前检查字符串是否为空

我遇到了同样的问题。我通过在下面编写一个函数来解决它:

private String trimLeadingZeros(String string)
{
    boolean startsWithZero = true;
    while (startsWithZero)
    {
        if(string.startsWith("0") && string.length()>=2 && !string.substring(1,2).equalsIgnoreCase("."))
        {string = string.substring(1);}
        else
        {startsWithZero = false;}
    }
    return  string;
}

此函数还可以防止从 00000.123 等字符串中删除所有零(它将 return 0.123 而不是无用的 .123)。

要删除 EditText 中的前导零,您可以使用 TextWatcher 检测第一个 typed-in 零并将其清除

TextWatcher watcher = 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) {
        if (s.toString().equals("0")) {
            editText.removeTextChangedListener(this);
            editText.setText("");
            editText.addTextChangedListener(this);
        }

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

editText.addTextChangedListener(watcher);