آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

iSheykhi  10 سال پیش  9 سال پیش
+4 0

با سلام

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

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

 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  10 سال پیش
+1 0

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

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

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

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

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

 
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 رو به روز رسانی کنه

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

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

همه چی آروم بود ، پروژه رو تست کردم ، فقط همون طور که گفتم ، تو خط 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 درج بشه و پردازش بشه !

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

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

 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  10 سال پیش
0 0

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

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

 

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

 

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

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

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

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