我有一个editText,可以代表美元金额。当我试图让editText的功能符合我的要求时,我遇到了很多问题。让我先告诉你我的设置,然后我将解释我的问题。这是我在xml中为editText做的事情
<EditText
android:id="@+id/edittxtbill"
android:layout_width="fill_parent"
android:layout_height="38dp"
android:textColor="@color/black"
android:textSize="@dimen/font_mediumlarge"
android:hint="@string/txt_hint"
android:textColorHint="@color/black"
android:gravity="right"
android:maxLines="1"
android:maxLength="10"
android:singleLine="true"
android:inputType="numberDecimal"
android:digits="0123456789." >
有几点需要指出。我只允许{0-9和。输入。我还将长度最大值设置为10.并且(尽管可能是多余的)我将行限制为1。
接下来,我的代码。这就是问题发生的地方:
1)如果输入一个句号,没有任何其他输入,则会导致崩溃。我通过处理像
这样的特定情况来解决这个问题if (etBill.getText().toString().contentEquals(".")) {
// handle special case
etBill.setText("0.00"); }
2)如果您输入8个值,那么让我们说editText中的字符串是“12345678”我会收到StackOverflowError,因为我正在以美元金额形式更新editText中的值。因此,在这种情况下,editText会尝试更新为12345678.00。这是一个问题,因为我只允许maxLength = 10.我必须处理这个特定情况,如
// handle special case
if (integerPlaces == 7 &&
etBill.getText().toString().contains(".") == false) {
etBill.setText(strFormatted);
}
这种情况不是我最好的,但基本上你甚至可以在没有小数的情况下输入8个整数之前,它会以适当的美元形式编辑editText(strFormatted是正确的美元格式“0.00”)。
3)如果您输入的小数位数超过两位,这也会成为一个问题。换句话说,1.234不是有效的美元格式,所以我必须处理这种情况,如
// handle special case
if (decimalPlaces >= 3) {
etBill.setText(strFormatted);
}
还有更多的案例,但我认为我提供了足够的问题。这是我假设编程的方式吗?个案一案?这似乎不切实际,因为有许多例外情况。例如,如果用户尝试输入两个句点,该怎么办?我必须通过更改editText的inputType来处理这种情况,如果它已经包含一个句点,否则这也会导致异常错误。
更重要的是,如果用户输入1234567.0,然后尝试在小数点左侧添加另一个值,一旦更新为美元形式,这也会导致问题。
什么是更好的方法?我读了一些关于Regex的信息,我认为这可能有助于防止我处理尽可能多的特殊情况,因为那时我可以对模式进行检查。但我真的不知道,我以前从未使用它(而且有点令人困惑!)。
我的应用程序运行正常。但是因为我对编程还是一个新手,这种方法感觉很草率。很抱歉很长的帖子,并提前感谢!
答案 0 :(得分:2)
Bart的回答绝对正确。我只想通过解决你的小数(问题)来构建它
在编辑文本中,您允许用户通过显式设置
输入多个小数点android:digits="0123456789."
如果删除此行,系统将阻止用户输入多个点(无效数字),因为您正在设置
android:inputType="numberDecimal"
并且你真的不需要这条线,因为你允许0-9这样的所有数字都应该足以满足你的目的。
<EditText
android:id="@+id/edittxtbill"
android:layout_width="fill_parent"
android:layout_height="38dp"
android:hint="@string/app_name"
android:gravity="right"
android:inputType="numberDecimal"
android:maxLength="10"
/>
就格式化(限制小数点数)而言,您可以设置Text Watcher,每次文本更改编辑文本时都会调用方法,然后使用上面答案中的正则表达式来执行魔术在onTextChanged ......
答案 1 :(得分:1)
表示所需格式的正则表达式为([1-9]\d{0-6}|0)\.\d{2}
。
这究竟意味着什么: 有((1到9之间的数字后跟0到6个其他数字)或0),然后是一个点,然后是两位数。
但是我不确定这是否适合您,但是这样您就可以一次检查给定的输入字符串是否与您想要的格式匹配。如果您打算使用它,请注意在Java中您需要转义反斜杠,以便您的模式字符串变为"([1-9]\\d{0-6}|0)\\.\\d{2}"
编辑:还要看一下这个问题:Android Money Input with fixed decimal他们在哪里解决了同样的问题。