我正在尝试为我的Android应用创建正则表达式,以便将货币格式化为此问题的最佳答案:
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
{
String userInput= ""+s.toString().replaceAll("[^\\d]", "");
StringBuilder cashAmountBuilder = new StringBuilder(userInput);
while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') {
cashAmountBuilder.deleteCharAt(0);
}
while (cashAmountBuilder.length() < 3) {
cashAmountBuilder.insert(0, '0');
}
cashAmountBuilder.insert(cashAmountBuilder.length()-2, '.');
cashAmountBuilder.insert(0, '$');
cashAmountEdit.setText(cashAmountBuilder.toString());
}
}
Android Money Input with fixed decimal
我希望能够使用与该示例相同的格式,在数字之前实现仅减去美元符号,但我真的不确定如何更改代码来实现它,或者是否有另一种方式?
编辑:经过更多评论之后,我的代码可能不是这个特别的部分。通过在正则表达式中更改空格的美元符号并在数字前输入空格,我可以使用非常愚蠢的练习来工作,稍后当我需要值时修剪它,但我无法找到更好的解决方法。
private TextWatcher billWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
{
String userInput= ""+s.toString().replaceAll("[^\\d]", "");
StringBuilder cashAmountBuilder = new StringBuilder(userInput);
while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') {
cashAmountBuilder.deleteCharAt(0);
}
while (cashAmountBuilder.length() < 3) {
cashAmountBuilder.insert(0, '0');
}
cashAmountBuilder.insert(cashAmountBuilder.length()-2, '.');
cashAmountBuilder.insert(0, '$');
billBox.setText(cashAmountBuilder.toString());
billBox.setTextKeepState(cashAmountBuilder.toString());
Selection.setSelection(billBox.getText(), cashAmountBuilder.toString().length());
}
}
框中的XML
<EditText
android:id="@+id/billBox"
android:layout_width="152dp"
android:layout_height="40dp"
android:layout_alignParentLeft="true"
android:layout_below="@+id/billText"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:digits="0123456789."
android:gravity="right"
android:inputType="numberDecimal" />
答案 0 :(得分:1)
你有:<EditText ... android:digits="0123456789." ... />
然而你的正则表达式有\\$(\\d{1,3}...
。这意味着“美元符号后跟更多数字。”
我认为系统很困惑,你要求存在一个美元符号,但在XML中禁止它。
我会取出正则表达式的第一部分并为用户输入美元符号。
答案 1 :(得分:0)
删除此行
cashAmountBuilder.insert(0, '$');
答案 2 :(得分:0)
取出美元符号需要做的就是取出这一行:cashAmountBuilder.insert(0,'$');.
答案 3 :(得分:0)
我认为你试图做太多,系统已经可以为你做了。如果您在内部将货币值保持为double,并且只在要显示时将其格式化,则更容易。请参阅此链接中的我的解决方案它可能有所帮助。 currency edit question answer