gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:40:16 25 4
gpt4 key购买 nike

您是否知道有什么方法可以确保用户只能输入具有最大小数位数的数字。我不确定如何解决这个问题。在 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ão Sousa 的建议,这是我尝试过的:

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})$

也许有多种方法可以改进这个表达式,但这确实有技巧。

现在只需在编辑文本中设置一个输入过滤器,如下所示:

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。至少那是我从这句话中理解的 标准 SQL 要求 DECIMAL(5,2) 能够存储任何具有五位数字和两位小数的值,因此可以存储在薪水列中的值范围从 -999.99 到999.99。即使它来自 MySQL 文档,MSSQL 文档似乎也是如此。

关于java - Android - 如何只允许一定数量的小数位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27077507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com