2012-09-22 1 views
2

У меня есть EditText, в котором пользователь должен ввести число, включая десятичные числа, и я хочу, чтобы тысяча разделителей автоматически добавилась на номер ввода. Я попробовал несколько других методов, но некоторые из них разрешить номера с плавающей запятой, поэтому я придумал этот код, который хорошо работает только с тем, что ввод строки не редактируется в реальном времени до одного с возможными тысячами разделителей, и ошибки, похоже, связаны с s.replace();Как отформатировать номер в android EditText после редактирования в реальном времени

am2 = new TextWatcher(){ 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 
    public void onTextChanged(CharSequence s, int start, int before, int count) {} 
    public void afterTextChanged(Editable s) { 
     if (s.toString().equals("")) { 
      amount.setText(""); 
      value = 0; 
     }else{ 
      StringBuffer strBuff = new StringBuffer(); 
      char c; 
      for (int i = 0; i < amount2.getText().toString().length() ; i++) { 
       c = amount2.getText().toString().charAt(i); 
       if (Character.isDigit(c)) { 
        strBuff.append(c); 
       } 
      } 
      value = Double.parseDouble(strBuff.toString()); 
      reverse(); 
      NumberFormat nf2 = NumberFormat.getInstance(Locale.ENGLISH); 
      ((DecimalFormat)nf2).applyPattern("###,###.#######"); 
      s.replace(0, s.length(), nf2.format(value)); 
     } 
    } 
}; 

ответ

26

Этот класс решает проблему, позволяет десятичного ввода и добавляет разделители тысяч.

public class NumberTextWatcher implements TextWatcher { 

private DecimalFormat df; 
private DecimalFormat dfnd; 
private boolean hasFractionalPart; 

private EditText et; 

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

@SuppressWarnings("unused") 
private static final String TAG = "NumberTextWatcher"; 

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

    try { 
     int inilen, endlen; 
     inilen = et.getText().length(); 

     String v = s.toString().replace(String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()), ""); 
     Number n = df.parse(v); 
     int cp = et.getSelectionStart(); 
     if (hasFractionalPart) { 
      et.setText(df.format(n)); 
     } else { 
      et.setText(dfnd.format(n)); 
     } 
     endlen = et.getText().length(); 
     int sel = (cp + (endlen - inilen)); 
     if (sel > 0 && sel <= et.getText().length()) { 
      et.setSelection(sel); 
     } else { 
      // place cursor at the end? 
      et.setSelection(et.getText().length() - 1); 
     } 
    } catch (NumberFormatException nfe) { 
     // do nothing? 
    } catch (ParseException e) { 
     // do nothing? 
    } 

    et.addTextChangedListener(this); 
} 

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().contains(String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator()))) 
    { 
     hasFractionalPart = true; 
    } else { 
     hasFractionalPart = false; 
    } 
} 

}

Источник: http://blog.roshka.com/2012/08/android-edittext-with-number-format.html

+1

Большое спасибо .. это спасло мой день –

+4

Как насчет того, если я хочу, чтобы пользователь мог ввести номер следующим образом: «1,234,05»? 'df = new DecimalFormat (" #, ###. ## ");' Этот формат не разрешает нули после запятой, но если я его сменил на 'df = new DecimalFormat (" #, ###. 0 # ");' он автоматически добавит ноль после запятой. Ну, вы можете добавить другое состояние типа «isFractionalPartThere» и проанализировать его с помощью 'dfdot = new DecimalFormat (« #, ###. »);' , но как бы вы это сделали, если вам нужно сделать более точную «100.000005», ? –

+2

как сделать номер как 1.000 или 1.000.000 или 1.000.000.000? –

3

Вы должны использовать DecimalFormat класс с DecimalFormatSymbols класса, проверьте следующий метод отказа,

public static String formatAmount(int num) 
{ 
    DecimalFormat decimalFormat = new DecimalFormat(); 
    DecimalFormatSymbols decimalFormateSymbol = new DecimalFormatSymbols(); 
    decimalFormateSymbol.setGroupingSeparator(','); 
    decimalFormat.setDecimalFormatSymbols(decimalFormateSymbol); 
    return decimalFormat.format(num); 
} 
+0

он не работает .. ошибка все еще на той части, где EditText меняется на новую строку с тысячами сепараторов –

+0

@PaulAsiimweTumwesigye я полностью протестированы , 'System.out.println (formatAmount (1234));' даст результат 1,234 – Lucifer

+2

спасибо, я пробовал его с помощью System.out.println, и он выводит отформатированный двойной, моя проблема в том, что в моем android editText номера не меняя его, просто появляется ошибка при попытке изменить его. –