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

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

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

من میخواستم مقدار عدد ورودی که کاربر میزنه به ازای هر سه تا صفر یه کاما بزاره! یعنی 20000 رو 20,000 نشون بده! واسه همین از یه textwatcher به شکل زیر استفاده کردم :


import java.text.DecimalFormat;
import java.text.ParseException;

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

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;
hasFracti /> }

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

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

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

@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if (s.toString().contains(String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator())))
{
hasFracti /> } else {
hasFracti /> }
}

}

بعد با یه listener توی mainActivity اون به ادیت تکست دادم :

amount.addTextChangedListener(new NumberTextWatcher(amount));

حالا متاسفانه ورودی رو به عنوان عدد نمیتونه بخونه!
قبلا از کد های getText().toString() و بعدش هم parseDouble استفاده کردم ولی جواب نمیده! ممنون میشم راه حل بدید :)

نظرات

پاسخ‌ها 4

مجتبی یگانه 12 سال پیش

فکر کنم این چیزیه که یک تیم میخواد ! ، ورودی رو از نوع لانگ گرفتم ، بعد این که تایپ تموم شد انجامش بدی بهتره

String pattern = "###,###";
DecimalFormat decimalFormat = new DecimalFormat(pattern);
String format = decimalFormat.format(1234567890123456789L);
Log.i("YekTeam", "" + format);

نظرات

h_r_v 12 سال پیش
خیلی ممنون :دی اینی که دادید رو برای نتایج و تکست ویو ها استفاده کردیم و جواب داده! میخواهیم به صورت runtime وقتی طرف داره input میده سه عدد سه عدد یه کاما بزاره! این کارم با همون کدی که بالا دادم کردیم! فقط ورودی رو به عنوان عدد نمیگیره!‌ :|‌ و در نتیجه دستور try اجرا نمیشه که محاسبات انجام بشه بازم ممنون :X
مجتبی یگانه 12 سال پیش
یعنی مشکل اینه متن تکست ویو parse string یا parse long نمیشه ؟ میخوای نمونه سورس بزارم !
sadeghbarout 12 سال پیش

  خب  متن ورودی رو به عنوان یه string بگیر ، بعد با دستور replace کاما ها رو با "" جایگزین کن  و متن باقی مونده رو با همون ParseDouble به عدد تبدیل کن

نظرات

h_r_v 12 سال پیش

نشد! قسمتی از کد رو میزارم!

 amount.addTextChangedListener(new NumberTextWatcher(amount));



calc.setOnClickListener(new OnClickListener() {



@Override


public void onClick(View arg0) {

String amount1 =amount.getText().toString();
amount1.replace(",","");
try{

double i = Double.parseDouble(amount1);
//doing some calculations :D
}
catch(NumberFormatException e){
Toast.makeText(MainActivity.this, "مقدار را وارد نکرده اید", Toast.LENGTH_LONG).show();

}
}
});

 

نظرات

h_r_v 12 سال پیش
Sorry Bro :D دیدم باو! کدش رو هم توی برنامه گذاشتم جواب نداد :دی
sadeghbarout 12 سال پیش

خب از دستور replace اشتباه استفاده کردی.

اینو تست کن حتما جواب میده :

  amount1 = amount1.replace(",", "");

ولی از کدت خوشم اومد.  ;)

خودت نوشتیش یا از جایی پیداش کردی؟




نظرات

h_r_v 12 سال پیش
ایول! درست شد! خیلی خیلی ممنون :دی کد اولی که گذاشتم رو از یه بلاگ یه دولوپر برداشتم ولی این دومی که خیلی سادست رو خودمون زدیم :دی
h_r_v 12 سال پیش
من دیدم همه فقط برنامه های اولشون رو معرفی میکنن گفتن ما هم فقط همین کار رو کنیم :دی

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