当前位置: 首页 > 面试题库 >

Android-如何只允许一定数量的小数位

方谦
2023-03-14
问题内容

您是否知道确保用户只能输入最大小数位数的数字的任何方法。我不确定如何解决这个问题。在MS
SQL数据库中,我将从应用程序中发送数据,我得到了具有这种类型的列。decimal(8,3)
现在考虑最终要存储要在Android中验证的值的列的数据类型,我已经考虑了这些两种情况:

  1. 如果用户输入不带小数的数字,则最大位数必须为8
  2. 如果用户输入带小数的数字,则最大位数必须为8(包括小数点右边的数字)

现在,我可以确定第一种情况,而对于第二种情况则不是那么确定。 保持最大位数固定(例如,始终为8)是否正确?
还是我应该考虑允许小数点左边最多8位,小数点右边最多3位?

无论哪种方式,这都是我在Android中一直尝试的方法:

mQuantityEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {
                String str = mQuantityEditText.getText().toString();
                DecimalFormat format = (DecimalFormat) DecimalFormat
                        .getInstance();
                DecimalFormatSymbols symbols = format.getDecimalFormatSymbols();
                char sep = symbols.getDecimalSeparator();

                int indexOFdec = str.indexOf(sep);

                if (indexOFdec >= 0) {
                    if (str.substring(indexOFdec, str.length() - 1).length() > 3) {                     
                        s.replace(0, s.length(),
                                str.substring(0, str.length() - 1));                        
                    }
                }
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {

            }

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

            }
        });

即使上面的代码处理最大的小数位数。它不限制EditText中允许的总位数。

您是否认为可以帮助我改善代码,使其同时处理最大小数位数和EditText中允许的总位数(考虑小数点左侧和右侧的两个数字)

好吧,现在我正在尝试JoãoSousa的建议,这是我已经尝试的方法:

1)我定义了一个实现InputFilter的类

public class NumberInputFilter implements InputFilter {
    private Pattern mPattern;

    public NumberInputFilter(int precision, int scale) {        
        String pattern="^\\-?(\\d{0," + (precision-scale) + "}|\\d{0," + (precision-scale) + "}\\.\\d{0," + scale + "})$";
        this.mPattern=Pattern.compile(pattern);

    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned destination, int destinationStart, int destinationEnd) {
         if (end > start) {
             // adding: filter   
             // build the resulting text
             String destinationString = destination.toString();
             String resultingTxt = destinationString.substring(0, destinationStart) + source.subSequence(start, end) + destinationString.substring(destinationEnd);
             // return null to accept the input or empty to reject it
             return resultingTxt.matches(this.mPattern.toString()) ? null : "";
         }
         // removing: always accept
         return null;
    }

}

2)尝试使用这样的类:

mQuantityEditText.setFilters(new InputFilter[] { new NumberInputFilter(8,3)} );

问题答案:

我会使用正则表达式的功能在编辑文本本身中进行过滤。首先是正则表达式

^\-?(\d{0,5}|\d{0,5}\.\d{0,3})$

也许有多种方法可以改善这种表达方式,但这确实可以解决问题。

现在,只需在edittext中设置输入过滤器,如下所示:

final String regex = "^\-?(\d{0,5}|\d{0,5}\.\d{0,3})$";
((EditText)rootView.findViewById(R.id.editText1)).setFilters(new InputFilter[] {
    new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned destination, int destinationStart, int destinationEnd) {
            if (end > start) {
                // adding: filter   
                // build the resulting text
                String destinationString = destination.toString();
                String resultingTxt = destinationString.substring(0, destinationStart) + source.subSequence(start, end) + destinationString.substring(destinationEnd);
                // return null to accept the input or empty to reject it
                return resultingTxt.matches(regex) ? null : "";
            }
            // removing: always accept
            return null;
        }
    }
});

顺便说一句,我刚刚测试了这段代码,它的作用是:

  1. 用户最多可以输入8位数字。
  2. 用户输入“。”后,允许的最大十进制数字为8。

我是否正确理解您描述的问题?

-编辑

好吧,我快到了。据我了解,decimal(8,3)表示最多8位数字,包括小数点左边或右边的数字,范围从-99999.99999999.999。我至少从这句话中了解到这一点Standard SQL requires that DECIMAL(5,2) be able to store any value with five digits and two decimals, so values that can be stored in the salary column range from -999.99 to 999.99。即使来自MySQL文档,MSSQL文档似乎也可以做到这一点。



 类似资料:
  • 问题内容: 我是angularjs的新手。我想知道什么是只允许在文本框中键入有效数字的方法。例如,用户可以键入“ 1.25”,但不能键入“ 1.a”或“ 1 ..”。当用户尝试输入下一个将使它成为无效数字的字符时,他将无法输入。 提前致谢。 问题答案: 您可以尝试使用此指令来阻止将任何无效字符输入到输入字段中。( 更新 :这依赖于对模型具有明确知识的指令,这对于可重用性而言并不理想,请参见下面的可

  • 问题内容: 我有一个,我想将用户的输入限制为纯数字或带小数的数字(最多2个小数位)。 基本上,我要输入价格。 我想避免做正则表达式。有办法吗? 问题答案: 代替允许使用小数位数的,而使用允许最多两位的小数。

  • 我有一个EditText,供用户输入电话号码,稍后会保存到sharedpreferences。但如果第一个数字是0,EditText似乎会删除它,我不希望这样。如何允许第一个数字为0?我尝试过使用android:digits=“0123456789”、android:inputType=“phone”和android:inputType=“number”。XML: Java:

  • 我有一个,我希望将用户的输入限制为纯粹的数字或小数点后2位以下的数字。 基本上,我要求一个价格输入。 我想避免做regex。有办法做吗?

  • 本文向大家介绍jQuery实现只允许输入数字和小数点的方法,包括了jQuery实现只允许输入数字和小数点的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery实现只允许输入数字和小数点的方法。分享给大家供大家参考,具体如下: 更多关于jQuery相关内容感兴趣的读者可查看本站专题:《jQuery拖拽特效与技巧总结》、《jQuery扩展技巧总结》、《jQuery常见经典特效汇总》