2010-06-10 8 views
10

के साथ एंड्रॉइड मनी इनपुट आप एक एडिटेक्स्ट एंट्री कैसे बनाते हैं जो केवल पैसे प्रारूप में इनपुट स्वरूपित करता है? जब उपयोगकर्ता 5 में प्रवेश करता है, तो मैं इनपुट को "$ 0.05" जैसा दिखाना चाहता हूं और जब वे 3 दर्ज करते हैं, तो इनपुट अब "$ 0.53" जैसा दिखना चाहिए और अंत में वे 6 दर्ज करें और इनपुट "$ 5.36" जैसा दिखना चाहिए।निश्चित दशमलव

उत्तर

1

आप इस तरह की चीज करने के लिए टेक्स्टवॉचर का उपयोग कर सकते हैं।

बढ़ाएँ TextWatcher: http://d.android.com/reference/android/text/TextWatcher.html

public class MyTextWatcher implements TextWatcher { 

    public void afterTextChanged(Editable arg0) { 

    } 

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

    } 

    public void onTextChanged(CharSequence s, int start, int before, int count) { 

    } 

} 

फिर

myEditText.addTextChangedListener(new MyTextWatcher()); 
1

मैंने पाया TextWatcher थोड़ा बोझिल होने के लिए के साथ अपने editText में जोड़ें। इसके बजाय, आप कुंजी श्रोता सेट कर सकते हैं:

setKeyListener(new CalculatorKeyListener()); 
// Must be called after setKeyListener(), otherwise is overridden 
setRawInputType(Configuration.KEYBOARD_12KEY); 

और फिर एक KeyListener जो NumberKeyListener फैली बनाएँ:

class CalculatorKeyListener extends NumberKeyListener { 
    @Override 
    public int getInputType() { 
     return InputType.TYPE_CLASS_NUMBER; 
    } 

    @Override 
    public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) { 
     if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) { 
      digitPressed(keyCode - KeyEvent.KEYCODE_0); 
     } else if (keyCode == KeyEvent.KEYCODE_DEL) {           
      deletePressed(); 
     } 
     return true; 
    } 

    @Override 
    protected char[] getAcceptedChars() { 
     return new char[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    } 
} 

फिर आप पात्रों सही ढंग से प्रदर्शित करने की आवश्यकता है, लेकिन यह मुश्किल नहीं है; बस सेंट का ट्रैक रखें, और उसके बाद 10 से विभाजित या गुणा करें, और स्वरूपण को सही करने के लिए संख्याफॉर्मेट का उपयोग करें।

+2

KeyListener नहीं रह गया है कुछ उपकरणों पर काम कर रहा है, इस नोट देखें: मुलायम इनपुट विधियों पर कुंजी प्रेस इस श्रोता में तरीकों को गति प्रदान करने की आवश्यकता नहीं है, और वास्तव में ऐसा करने के लिए हतोत्साहित किया जाता है। डिफ़ॉल्ट एंड्रॉइड कीबोर्ड जेली बीन या बाद में किसी भी एप्लिकेशन को लक्षित करने के लिए किसी भी कुंजी के लिए इन्हें ट्रिगर नहीं करेगा, और केवल इसे आइस क्रीम सैंडविच को लक्षित करने वाले अनुप्रयोगों के लिए कुछ महत्वपूर्ण प्रेस के लिए वितरित करेगा। स्रोत: http://developer.android.com/reference/android/text/method/KeyListener.html –

1

यहाँ मेरा पूर्ण समाधान:

   tvValue.setRawInputType(Configuration.KEYBOARD_12KEY); 

      tvValue.addTextChangedListener(new TextWatcher(){ 


       @Override 
       public void afterTextChanged(Editable arg0) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void beforeTextChanged(CharSequence s, int start, 
         int count, int after) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onTextChanged(CharSequence s, int start, 
         int before, int count) { 
        // TODO Auto-generated method stub 

        // here i converted to string 
        if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$")) 
        { 
         String userInput= ""+s.toString().replaceAll("[^\\d]", ""); 
         Float in=Float.parseFloat(userInput); 
         float percen = in/100; 
         tvValue.setText("$"+percen); 
        } 

       } 

      }); 
8

ninjasense के पूर्ण समाधान मूल रूप से काम करता है, लेकिन यह कुछ मुद्दे हैं:

  1. हर बार क्षेत्र के डेटा "onTextChanged" हैंडलर में बदल दिया जाता है, कर्सर की स्थिति फ़ील्ड पर इंडेक्स 0 पर रीसेट हो जाती है, जो मौद्रिक मानों में टाइप करते समय होने वाली थोड़ी परेशान होती है।
  2. यह मौद्रिक मूल्य स्वरूपण के लिए फ्लोट का उपयोग करता है, जो बैकफायर कर सकता है।

पहली समस्या मैं इस काम करता है की तरह एक दूसरे के कोड के लिए अभी तक समाधान नहीं है, के लिए:

@Override 
    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()); 
     } 

    } 
3

ZDS बंद का निर्माण।

फ़ील्ड के अंत में स्थित कर्सर को रखने के लिए इसका उपयोग करें।

cashAmountEdit.setTextKeepState(cashAmountBuilder.toString()); 
Selection.setSelection(cashAmountEdit.getText(), cashAmountBuilder.toString().length()); 
0

मैंने ऐसा किया लेकिन दशमलव के बिना और मील के लिए डॉट के साथ, कोड की जांच करें और दशमलव का समर्थन करने के लिए कार्यक्षमता जोड़ें।

MyEditText.addTextChangedListener(new TextWatcher() 
     { 
      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count){ 
       if(s.toString().length() > 0){ 
        MyEditText.removeTextChangedListener(this);     
        String numbers = removeCharacters(s.toString()); 
        int money = 0; 
        try{ 
         money = Integer.parseInt(numbers); 
        } 
        catch(Exception ex){ 
         money = 0; 
        } 

        MyEditText.setText(getMoney(money)); 
        //Set cursor on correct position 
        int selection = start; 
        if(count > 0){ 
         selection++; 
         if(MyEditText.getText().toString().length() == 2 || MyEditText.getText().toString().length() == 6 || MyEditText.getText().toString().length() == 10){ 
          selection++; 
         }       
        } 
        else{ 
         if(MyEditText.getText().toString().length() == 4 || MyEditText.getText().toString().length() == 8){ 
          selection--; 
         } 
        } 

        if(selection > MyEditText.getText().toString().length()){ 
         selection = MyEditText.getText().toString().length(); 
        }      

        MyEditText.setSelection(selection); 
        MyEditText.addTextChangedListener(this); 
       } 
       if(s.toString().length() == 1 && count < 1 && start == 1){ 
        MyEditText.removeTextChangedListener(this); 
        MyEditText.setText(""); 
        MyEditText.addTextChangedListener(this); 
       } 

      }   

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

      }   

      @Override 
      public void afterTextChanged(Editable s) 
      { 

      } 

     }); 



    public String removeCharacters(String money){  

    int i=0; 
    while (i<money.length()) 
    { 
     Character c = money.charAt(i);   
      if (Character.isDigit(c) && c != '.') 
      {    
       i++; 
      } 
      else 
      {    
       money = money.replace(c.toString(), "");     
      } 
    } 

    return money; 
} 


public String getMoney(int value){ 
    String money = "$"; 
    NumberFormat numberFormatter;  
    numberFormatter = NumberFormat.getNumberInstance(Locale.GERMAN);   
    money += numberFormatter.format(value); 

    return money; 
} 
0

इस उत्तर Zds' answer (जो बारी में ninjasense's answer पर आधारित था) पर आधारित है, लेकिन यह कर्सर की स्थिति समस्या को हल करना चाहिए:

if(!text.matches("^\\$(\\d{1,2})(\\.\\d{2})?$")) { 
    int originalCursorPosition = view.getSelectionStart(); 
    int cursorOffset = 0; 

    boolean cursorAtEnd = originalCursorPosition == text.length(); 

    String userInput= ""+text.replaceAll("[^\\d]", ""); 
    StringBuilder cashAmountBuilder = new StringBuilder(userInput); 

    while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0')   { 
     cashAmountBuilder.deleteCharAt(0); 
     cursorOffset--; 
    } 
    while (cashAmountBuilder.length() < 3) { 
     cashAmountBuilder.insert(0, '0'); 
     cursorOffset++; 
    } 
    cashAmountBuilder.insert(cashAmountBuilder.length() - 2, '.'); 
    cashAmountBuilder.insert(0, '$'); 

    view.setText(cashAmountBuilder.toString()); 
    view.setSelection(cursorAtEnd ? view.getText().length() : originalCursorPosition + cursorOffset); 
} 

नोट्स:

  • निम्नलिखित TextWatcher.onTextChanged
  • में एक अलग उपयोग कर रहा है अन्य उत्तर से regex, जो < के मूल्य रखता है $ 100
  • 'दृश्य' है editText, 'पाठ' स्ट्रिंग सामग्री 6 के एक maxLength साथ
  • यह मेरे लिए काम किया है एक EditText उपयोग कर रहा है (अर्थात $ 00,00)