2015-10-24 2 views
4

мне нужно форматировать ввод валюту с 2 десятичным форматом например, когда пользователь вводит 2 выглядит $ 2,00, то когда, когда пользователь вводят 2 эти конвертировать в $ 22,00 ... и т.д.валюта вход с форматом 2 десятичного

Подхожу к чему-то аналогично, когда пользователь вводит 2 это преобразование в $ 0,02 в следующем 2 будет, как это $ 0,22

любой может помочь мне спасибо

public class MoneyTextWatcher implements TextWatcher { 
    private final WeakReference<EditText> editTextWeakReference; 

    public MoneyTextWatcher(EditText mEditText) { 
     editTextWeakReference = new WeakReference<EditText>(mEditText); 
    } 

    @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 editTex = editTextWeakReference.get(); 
     if(!s.toString().equals(editTex.getText())) { 
      editTex.removeTextChangedListener(this); 
      String cleanString = s.toString().replaceAll("[$,.]", ""); 
      double parsed = Double.parseDouble(cleanString.replaceAll("[^\\d]", "")); 
      String formatted = NumberFormat.getCurrencyInstance().format((parsed/100)); 
      editTex.setText(formatted); 
      editTex.setSelection(formatted.length()); 

      editTex.addTextChangedListener(this); 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 

    } 


    } 
} 
+0

Вы читали http://stackoverflow.com/questions/5107901/better-way-to-format-currency-input-edittext еще? – BNK

+0

Что относительно плавающих чисел? Вы хотите разрешить пользователю вводить что-то вроде $ 22.51 или работать только с целыми числами? – aga

+0

целые числа, мой код работает с плавающим числом –

ответ

9

Я думаю, вы можете попробовать следующее:

Планировка:

<EditText 
     android:id="@+id/editText" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:inputType="numberDecimal" 
     /> 

активность:

EditText editText = (EditText) findViewById(R.id.editText); 
editText.addTextChangedListener(new NumberTextWatcher(editText, "#,###")); 

с текстом Watcher как следующее:

public class NumberTextWatcher implements TextWatcher { 

    private final DecimalFormat df; 
    private final DecimalFormat dfnd; 
    private final EditText et; 
    private boolean hasFractionalPart; 
    private int trailingZeroCount; 

    public NumberTextWatcher(EditText editText, String pattern) { 
     df = new DecimalFormat(pattern); 
     df.setDecimalSeparatorAlwaysShown(true); 
     dfnd = new DecimalFormat("#,###.00"); 
     this.et = editText; 
     hasFractionalPart = false; 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     et.removeTextChangedListener(this); 

     if (s != null && !s.toString().isEmpty()) { 
      try { 
       int inilen, endlen; 
       inilen = et.getText().length(); 
       String v = s.toString().replace(String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()), "").replace("$",""); 
       Number n = df.parse(v); 
       int cp = et.getSelectionStart(); 
       if (hasFractionalPart) { 
        StringBuilder trailingZeros = new StringBuilder(); 
        while (trailingZeroCount-- > 0) 
         trailingZeros.append('0'); 
        et.setText(df.format(n) + trailingZeros.toString()); 
       } else { 
        et.setText(dfnd.format(n)); 
       } 
       et.setText("$".concat(et.getText().toString())); 
       endlen = et.getText().length(); 
       int sel = (cp + (endlen - inilen)); 
       if (sel > 0 && sel < et.getText().length()) { 
        et.setSelection(sel); 
       } else if (trailingZeroCount > -1) { 
        et.setSelection(et.getText().length() - 3); 
       } else { 
        et.setSelection(et.getText().length()); 
       } 
      } catch (NumberFormatException | ParseException e) { 
       e.printStackTrace(); 
      } 
     } 

     et.addTextChangedListener(this); 
    } 

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

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     int index = s.toString().indexOf(String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator())); 
     trailingZeroCount = 0; 
     if (index > -1) { 
      for (index++; index < s.length(); index++) { 
       if (s.charAt(index) == '0') 
        trailingZeroCount++; 
       else { 
        trailingZeroCount = 0; 
       } 
      } 
      hasFractionalPart = true; 
     } else { 
      hasFractionalPart = false; 
     } 
    } 
} 

enter image description here

+1

Спасибо, что эта работа со мной –

+2

Как конвертировать так, чтобы пользователь мог введите дробную часть. . - Пользователь вводит 2435.89. –

+0

Дробная часть после десятичной точки, похоже, не принимает ненулевые входы. – user1821961

3

Сведите число, введенное пользователем хранится обособленно, так как если вы используете edittext.text у вас будет больше проблем лемы.

Затем используйте DecimalFormat, чтобы отформатировать его так, как вам нужно.

Для первого, возможно, это хороший способ восстановить исходный ввод в edittext, как только пользователи начнут редактирование, таким образом вы можете избежать проблем с редактированием.

Надеюсь, это поможет.

2

HI ниже код преобразует каждое число в два десятичных числа. Значение должно быть числом, символами и специальными символами может вызвать исключение числовой формы. пожалуйста, обращайтесь с этим, как вам нужно. Благодаря

public static String formatDecimal(String value) { 
    DecimalFormat df = new DecimalFormat("#,###,##0.00"); 
    return df.format(Double.valueOf(value)); 
} 
Смежные вопросы