بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

مشکل در جداسازی اعداد EditText با "," همزمان با ورود اعداد

مدیریت گفتگو
iSheykhi 12 سال پیش
آخرین تغییر: 11 سال پیش

با سلام

نمونه این سوال قبلا مطرح شده بود اما نتونستم با استفاده از اون به جواب برسم

از این کد استفاده می کنم

 private long     currentNumber;
    private Button   btnSubmit;
    private TextView txtResualt;
    private EditText edtInput;
    private String   formatNumber;

        // onCreate
        edtInput = (EditText) findViewById(R.id.edtNumber);
        txtResualt = (TextView) findViewById(R.id.txtResualt);
        edtInput.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub

            }


            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub

            }


            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                currentNumber = Integer.parseInt(edtInput.getText().toString().replace(",", ""));
                Log.i("log", "currentNumber: " + currentNumber);
                formatNumber = String.format("%,d", currentNumber);
                Log.i("log", "formatNumber: " + formatNumber);
                txtResualt.setText("" + formatNumber);
                //  edtInput.setText("" + formatNumber);
            }
        });

 

اما فقط برای نمایش در txtResualt از جنس TextView جوابگو هست و در edtInput از جنس EditText خطا می ده

متن خطا

 06-01 15:20:25.931: E/AndroidRuntime(7788): FATAL EXCEPTION: main
06-01 15:20:25.931: E/AndroidRuntime(7788): java.lang.StackOverflowError
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.TextUtils.getChars(TextUtils.java:74)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.graphics.Paint.getTextRunAdvances(Paint.java:1828)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.graphics.Paint.getTextRunAdvances(Paint.java:1782)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.TextLine.handleText(TextLine.java:747)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.TextLine.handleRun(TextLine.java:956)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.TextLine.measureRun(TextLine.java:414)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.TextLine.measure(TextLine.java:293)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.TextLine.metrics(TextLine.java:267)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.Layout.getLineExtent(Layout.java:977)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.Layout.getLineStartPos(Layout.java:504)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.Layout.getHorizontal(Layout.java:840)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.Layout.getHorizontal(Layout.java:812)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.text.Layout.getPrimaryHorizontal(Layout.java:796)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.getFocusedRect(TextView.java:5060)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.view.FocusFinder.findNextFocus(FocusFinder.java:120)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.view.FocusFinder.findNextFocus(FocusFinder.java:94)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.view.FocusFinder.findNextFocus(FocusFinder.java:65)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.view.ViewGroup.focusSearch(ViewGroup.java:639)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.view.ViewGroup.focusSearch(ViewGroup.java:641)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.view.ViewGroup.focusSearch(ViewGroup.java:641)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.view.ViewGroup.focusSearch(ViewGroup.java:641)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.view.View.focusSearch(View.java:6279)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.onCreateInputConnection(TextView.java:5562)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:1106)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.view.inputmethod.InputMethodManager.restartInput(InputMethodManager.java:1057)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3616)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3554)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.EditText.setText(EditText.java:80)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3529)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.sendAfterTextChanged(TextView.java:7247)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3703)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3554)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.EditText.setText(EditText.java:80)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3529)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.sendAfterTextChanged(TextView.java:7247)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3703)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3554)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.EditText.setText(EditText.java:80)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3529)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.sendAfterTextChanged(TextView.java:7247)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3703)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3554)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.EditText.setText(EditText.java:80)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3529)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.sendAfterTextChanged(TextView.java:7247)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3703)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3554)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.EditText.setText(EditText.java:80)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3529)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.sendAfterTextChanged(TextView.java:7247)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3703)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3554)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.EditText.setText(EditText.java:80)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.setText(TextView.java:3529)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at ir.redreactor.course.app.number.NumberActivity$1.afterTextChanged(NumberActivity.java:55)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.sendAfterTextChanged(TextView.java:7247)
06-01 15:20:25.931: E/AndroidRuntime(7788): 	at android.widget.TextView.se

 

 

نظرات

پاسخ‌ها 6

sadeghbarout 12 سال پیش

توی این سوال دقیقا این کار انجام شده.

البته یه مشکلی داشته که تا آخر که بخونید اون مشکل هم رفع شده و کد قابل استفاده است

نشناختن ورودی به عنوان عدد!

نظرات

iSheykhi 12 سال پیش
صادق جان، نوشته بودم به نتیجه نرسیدم. می خوام در حالی که اعداد رو وارد می کنه این اتفاق بی افته
iSheykhi 12 سال پیش

یه کمی کدها رو تغییر دادم

 
public class NumberActivity extends Activity {

private Long currentNumber; private Button btnSubmit; private TextView txtResualt; private EditText edtInput;

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnSubmit = (Button) findViewById(R.id.btnComput); edtInput = (EditText) findViewById(R.id.edtNumber); txtResualt = (TextView) findViewById(R.id.txtResualt); edtInput.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub currentNumber = Long.parseLong(edtInput.getText().toString().replace(",", "")); txtResualt.setText("" + NumberFormat.getNumberInstance(Locale.US).format(currentNumber)); } }); btnSubmit.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub edtInput.setText("" + formatNumber); } }); } }

یه چیزی خیلی جالبه

وقتی روی Button کلیک می کنم تغییرات در EditText عدد رو وارد می کنم توی TextView نمایش داده می شه

و وقتی روی Button می زنم به درستی نمایش می ده؛ و جالب اینجاست که وقتی مجدد عدد رو وارد می کنم باز هم درست نشون می ده

اما اگر توی EditText خالی باشه و چیزی وارد کنم Close force می ده

این به این معنیه که در TextWatcher نمی تونم تعیین کنم که محتویات EditText رو به روز رسانی کنه

آپلود شد لطفا یه نگاه بی اندازین

نظرات

مجتبی یگانه 12 سال پیش
"اما اگر توی EditText خالی باشه و چیزی وارد کنم خطا می ده" یعنی چه خطایی ؟ خوب Catch کن ، بعد پیام بده که متنی وارد نشده :|
iSheykhi 12 سال پیش
منظورم از خطا، Cloe Force بود
مجتبی یگانه 12 سال پیش
خوب امین جان اگه فورس کلوز بده ، میشه با Try Catch جمعش کرد دیگه ! ، کافیه ببینی تو چه خطی کرش میکنه و علت خطا چیه ! ، لاگ بزار اصن :)
iSheykhi 12 سال پیش
آخه اون خط اجرا نمی شه در صورتی که باید اجرا بشه تا تغییرات در EditText ایجاد بشه؛ می شه یه نگاه به فایل آپلود شده بی اندازی؟
مجتبی یگانه 12 سال پیش

همه چی آروم بود ، پروژه رو تست کردم ، فقط همون طور که گفتم ، تو خط 77 یعنی اینجا کرش میکرد

edtInput.setText("" + NumberFormat.getNumberInstance(Locale.US).format(currentNumber));

چرا ؟! ، خوب چون "" نمیتونه Format بشه ! ، پس باید به این شکل تغییر کنه

btnSubmit.setOnClickListener(new OnClickListener() {

	@Override
	public void onClick(View arg0) {
		try {
	edtInput.setText("" + NumberFormat.getNumberInstance(Locale.US).format(currentNumber));
		}
		catch (Exception e) {
			e.printStackTrace();
	Toast.makeText(NumberActivity.this, "Wrong Input !", Toast.LENGTH_SHORT).show();
		}
	}
});

اما بازم به نظرم بهتره بگی اگه EditText خالی بود ، روی دکمه کلیک شد ، مقدار 0 درج بشه و پردازش بشه !

نظرات

iSheykhi 12 سال پیش
مجتبی عزیز، لطفا بدون استفاده از Button امتحان کن، اعداد رو وارد کن و در حین ورود اعداد مقدار رو درج کنه
iSheykhi 12 سال پیش
اگر به جای txtResualt.setText بزنم edtInput.setText اونوقت کرش می ده
مجتبی یگانه 12 سال پیش
کرش نشد ، فقط باید کدی بنویسد که موقعی که مقدار EditText خالی شد ، مقدار 0 بشه ، مثلا من وارد میکنم 123456 حالا وقتی کلا پاک میکنم ، به جای اینکه صفر در نظر بگیره ، آخرین کارکتر ، یعنی 1 در TextView نشون داده میشه !
iSheykhi 12 سال پیش
چطور ممکنه؟ یعنی به جای txtResualt.setText وارد کردی edtInput.setText و کرش نداد؟ مجددا پروژه رو روی همون لینک آپ کردم؛ یعنی به جای استفاده از Button توی EditText وارد کن، اونجا کرش می ده
iSheykhi 12 سال پیش

مقداری از کد رو به این شکل تغییر دادم:

 edtInput.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub
                if (edtInput.getText().length() > 0) {
                    if ( !s.toString().equals(formatNumber)) {
                        currentNumber = Long.parseLong(edtInput.getText().toString().replace(",", ""));
                        formatNumber = NumberFormat.getNumberInstance(Locale.US).format(currentNumber);
                        txtResualt.setText(formatNumber);
                        edtInput.setText(formatNumber);
                    }
                } else {
                    edtInput.setText("" + NumberFormat.getNumberInstance(Locale.US).format(0));
                }
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
            }


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

            }
        });

اما باز هم مشکلی که هست اشاره گر به اولین خونه از متن ورودی می آد، یعنی:

            |987,654,321

" | " همون اشاره گره

اگر بخوام اشاره گر به صورت اتوماتیک به آخرین خونه بره باید چه کدی روش اعمال بشه

پاسخ توسط دوستان در این تاپیک داده شد

نظرات

MeHDi 12 سال پیش

با این متد و پاسخ دوستان مشکل منم برطرف شد. فقط یه مشکل جدید ایجاد شده اونم اینه که در این فیلد که عدد وارد میشه میخوام اون عدد را داخل متغیری بذارم برنامه در همون خط کرش میکنه. آیا راه حلی هست؟ 

 double editInput = Double.parseDouble(edtOjrat.getText().toString());

 

همچنین وقتی یک عددی نوشته میشه بعد از اینکه کاربر عددها را پاک کنه آخرش یه صفر میمونه و پاک نمیشه!

 

نظرات

javad 12 سال پیش
فکر کنم علتش اینه که ادیت تکست شما در اون لحظه مقداری نداره و این باعث خطا میشه. خب یک راهش به نظرم اینه که بگید اگر ادیت تکست خالی بود مقدار صفر قرار بده. double editInput = Double.parseDouble(edtOjrat.getText().toString().replaceAll("","0"));
javad 12 سال پیش
double editInput = Double.parseDouble(edtOjrat.getText().toString().replaceAll("","0"));
MeHDi 12 سال پیش
جواد جان ممنون. البته اون خطی که دادم در اصل در یک لیسنر کلیدی هست که قراره دو ورودی از edittext را بگیره که در یه متغیر ذخیره کنه که در لیسنر کلیده و مشکلی هم نداره. کلا وقتی این اشاره گر TextWatcher را برای جداکردن سه خط سه خط میدم در اون خط اشکال میگیره.
MeHDi 12 سال پیش
من فکر میکنم که چون در TextWatcher من با خط currentNumber = Long.parseLong(edtInput.getText().toString().replace(",", "")); دارم مقدار را عددی میکنم و بعد در کنار هم قرار میدم تا بعد از سه تا عدد علامت ویرگول قرار بگیره(بخاطر فرمت پول) در این متغیر ذخیره میشه و انگار که بعد از اتمام ورود اعداد دیگه اعداد داخل EditText دیگه String نیست! یه همچین چیزی فکر میکنم !!
MeHDi 12 سال پیش
علت را فهمیدم ولی هنوز نتونستم حلش کنم. بخاطر اینکه درون عددها کاما وجود داره و میگه که نمیتونه به دابل برگردونه..!
MeHDi 12 سال پیش
بالاخره حل شد باید در پایان خط اون کاماها را با خالی پر کنم که با دستور - .replaceAll(",","") -- مشکل برطرف گردید.
Devtpoint 11 سال پیش

این هم سورس البته به صورت مثال :

 DecimalFormat formatter = new DecimalFormat("#,###,###");
Long input1 = item.priceVahed;
String pV = formatter.format(input1);
txtPriceVahed.setText("قیمت واحد : " + pV);

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .