کمک در تکمیل اولین برنامه من (جدا کردن 3رقم 3رقم اعداد در محاسبه) لطفاً این سوال رو بدون جواب نذارید ...
سلام دوستان
دارم یه برنامه مبدل میسازم ( چون رسیدم به بخش 7) همه چی خوب کار میکنه. عالی
فقط یه ایراد هست!
اینه که من میخوام اعداد 3رقم 3رقم از هم جدا بشن ، هم هنگام نوشتن و هم هنگام تبدیل شدن ولی نمیشن.
مثلا توی ادیت تکست سانتی متر نوشته بشه 1،000 بعد که تبدیل میشه توی میلی متر بشه 10،000
چجوری میتونم این کارو کنم؟؟؟؟ لطفاً اگه بلدید دریغ نکنید. میخوام به امیدخدا اولین برنامم تکمیل بشه واسه ادامه کار لازمه دوسندارم الکی نا امید بشم!!!
از همچین کدی چجوری استفاده کنم:
numFormat =newDecimalFormat("#,###,###"); number = numFormat.format(1556789);System.out.println("3. DecimalFormat with ,: "+ number);
یا این:
String pattern =
"#,###.###"
;
DecimalFormat decimalFormat =
new
DecimalFormat(pattern);
decimalFormat.setGroupingSize(
3
);
String format = decimalFormat.format(
585858585
);
دوست عزیز به صورت زیر عمل کن:
اول یک کلاس بساز و نامش رو TextWatcherNumber بذار و داخلش کدهای زیر رو قرار بده:
public class TextWatcherNumber implements TextWatcher { int len = 0; EditText editText; public TextWatcherNumber(EditText editText){ this.editText = editText; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { len = s.length(); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { String number = Card.getPureNumber(editText.getText().toString()); String sepratedNumber = number; editText.removeTextChangedListener(this); if(number.length() > 3 && number.length()<7) { sepratedNumber = number.substring(0,number.length()-3) + "," + number.substring(number.length()-3,number.length()); }else if(number.length() > 6 && number.length()<10) { sepratedNumber = number.substring(0,number.length()-6) + ","+number.substring(number.length()-6,number.length()-3) +"," + number.substring(number.length()-3,number.length()); }else if(number.length() > 9 && number.length()<13) { sepratedNumber = number.substring(0,number.length()-9) + ","+number.substring(number.length()-9,number.length()-6) +","+number.substring(number.length()-6,number.length()-3) +"," + number.substring(number.length()-3,number.length()); }else if(number.length() > 12 && number.length()<16) { sepratedNumber = number.substring(0,number.length()-12) + ","+number.substring(number.length()-12,number.length()-9) +","+number.substring(number.length()-9,number.length()-6) +","+number.substring(number.length()-6,number.length()-3) +"," + number.substring(number.length()-3,number.length()); } editText.setText(sepratedNumber); editText.addTextChangedListener(this); editText.setSelection(editText.length()); } }
خوب حالا توی کدهای جاوا، برای ادیت تکستی که میخوای اعداد رو توش نمایش بدی کد زیر رو اضافه کن:
edt.addTextChangedListener(new TextWatcherNumber(edt));
البته این کد خیلی قدیمیه و شما میتونید بهترش کنید.
موفق باشید
---------------------------------------------
Card یک کلاس هست که من توی برنامم ازش استفاده کرده بودم. شما متد زیر رو توی کلاستون اضافه کنید و کلمه Card رو حذف کنید:
public static String getPureNumber(String _number){ if(_number != null && !_number.equals("")) { String number; number = _number.replace(" ", ""); number = number.replace(" ", ""); number = number.replace(" ", ""); number = number.replace(":", ""); number = number.replace(",", ""); number = number.replace("?", ""); number = number.replace(".", ""); number = number.replace("-", ""); number = number.replace("*", ""); return number; }else return ""; }
کد بالا یک رشته به شما برمیگردونه که هیچ گونه کاراکتر اضافی نداره. یعنی شما باید اون ویرگول هایی که میذاری رو با هربار تغییر متن حذف کنی و دوباره تمام ویرگول هارو اضافه کنی. (کاراکترهای اضافی برای برنامه من بوده که شما میتونید حذفشون کنید)
اگر هم نمیخواید از ادیت تکست استفاده کنید و فقط میخواید اعداد رو توی تکست ویو نمایش بدید، از متد زیر استفاده کنید:
public String sepratePrice(String price) { String temp = new StringBuilder(price).reverse().toString(); ArrayList<String> parts = new ArrayList<String>(); int c = 3; do { parts.add(temp.substring(c - 3, c)); c += 3; } while (c < temp.length()); parts.add(temp.substring(c - 3, temp.length())); String finalPrice = ""; for (int i = 0; i < parts.size() - 1; i++) finalPrice += parts.get(i) + ","; finalPrice += parts.get(parts.size() - 1); return new StringBuilder(finalPrice).reverse().toString(); }
این متد رو هم حدود 1 سال پیش نوشتم و فکر کنم بتونید تمیزترش کنید.
متاسفانه به خاطر تعهداتی که نسبت به شرکت هایی که در آنها کار میکنم دارم، نمیتونم سورس آخرین ورژن از هیچ کدی رو قرار بدم، ولی این کد کاملا درست کار میکنه و اگر صلاح دونستید، میتونید تمیزترش کنید.
پیشاپیش انتشار اولین برنامتون رو تبریک میگم دوست عزیز
دریافت numberDecimal و نمایش آن در TextView به طوری که بین هر سه عدد کاما قرار داده شود ( کدها تست شده ) :
سلام ، کد زیر به صورتی هست که کاربر عدد رو در EditText وارد کرده و خروجی آن بر روی TextView به صورت سه رقم سه رقم از یکدیگر مجزا می شود .
این از Method :
public class SimpleActivity extends Activity {
private static String decimalFormatCommafy(String inputnum) {
String[] splittednum = inputnum.split("\\.");
String decimalnum = "";
if (splittednum.length == 2) {
inputnum = splittednum[0];
decimalnum = "." + splittednum[1];
}
Double inputDouble = Double.parseDouble(inputnum);
DecimalFormat myFormatter = new DecimalFormat("###,###");
String output = myFormatter.format(inputDouble);
return output + decimalnum;
}
خب در این مرحله Method ای که نوشته ایم را فراخوانی می کنیم :
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button btn_conpute = (Button) findViewById(R.id.btn_compute);
final TextView txt_compute = (TextView) findViewById(R.id.txt_caption);
final EditText edt_inputenubmer = (EditText) findViewById(R.id.edt_inputenubmer);
// در اینجا من متد رو در لگتگ تست کردم
String userinpute = decimalFormatCommafy("2222222");
Log.i("LOG", "userinpute is " + userinpute);
// در این مرحله رویداد کلیک رو تعریف میکنیم
btn_conpute.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String userinpute = edt_inputenubmer.getText().toString();
//در این مرحله متد را فراخوانی میکنیم
String resulte = decimalFormatCommafy(userinpute);
txt_compute.setText(resulte);
}
});
}
موفق باشید .
در هنگام وارد کردن numberdecimalدر EditText ببین هر سه رقم کاما نمایش داده شود ( کدهای زیر تست شده است ) :
ابتدا EditText ای را در بخش طراحی UI ایجاد کرده و بر روی آن دابل کلیک کرده تا وارد بخش XML مربوطه شویم و کد های زیر را وارد می نماییم :
<EditText
android:id="@+id/edt_userinpute"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:digits="0123456789,"
android:ems="10"
android:inputType="numberDecimal" />
سپس وارد بخش کد نویسی شده و برای EditText رویداد زیر را تعریف می کنیم :
edt_userinpute.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
edt_userinpute.removeTextChangedListener(this);
try {
String givenstring = s.toString();
Long longval;
if (givenstring.contains(",")) {
givenstring = givenstring.replaceAll(",", "");
}
longval = Long.parseLong(givenstring);
DecimalFormat formatter = new DecimalFormat("#,###,###");
String formattedString = formatter.format(longval);
edt_userinpute.setText(formattedString);
edt_userinpute.setSelection(edt_userinpute.getText().length());
// to place the cursor at the end of text
}
catch (NumberFormatException nfe) {
nfe.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
edt_userinpute.addTextChangedListener(this);
}
});
موفق باشید .
جواب سوال : وقتی در EditText مقداری وارد نمی کنم و برروی دکمه میزنم برنامه crash پیدا میکنه ، چیکار کنم ؟
برای جلوگیری از این Crash باید عمل اعتبار سنجی ورودی به فیلد رو انجام داد ، به شرح زیر :
btn_conpute.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String userinpute = edt_inputenubmer.getText().toString();
// در این خط کد عمل اعتبار سنجی رو انجام دادم
// گفتم اگر مقدار ورودی به فیلد برابر با رشته ی خالی بود پیغامی رو نمایش بده
if (userinpute.equals("")) {
Toast.makeText(G.context, "No amount was received ! ", Toast.LENGTH_SHORT).show();
return ;
// در غیر اینصورت اگر کاربر مقداری رو وارد کرد عملیات نمایش رو انجام بده
} else {
String resulte = decimalFormatCommafy(userinpute);
txt_compute.setText(resulte);
}
}
});
دلیلش چیه؟ زبان گوشی که فارسی میشه ایجوری میشه :( . ادیت تکست اولی عدد اصلیه وقتی کانورت زده میشه میشه دومی
اقا من میخوام ایجوری باشه :
یه ادیت تکست از نوع نامبر دسیمال که عدد رو میگیره بعد با زدن کانورت به دابل تبدیل کنه و مثلا ضربدر 10 کنه و توی ادیت تکست دومی نشون بده. این وسط کاما ها هم گذاشته بشن همین.
public class send_activity extends Activity {
private static String decimalFormatCommafy(String inputnum) {
String[] splittednum = inputnum.split("\\.");
String decimalnum = "";
if (splittednum.length == 2) {
inputnum = splittednum[0];
decimalnum = "." + splittednum[1];
}
Double inputDouble = Double.parseDouble(inputnum);
DecimalFormat myFormatter = new DecimalFormat("#,###,###");
String output = myFormatter.format(inputDouble);
return output + decimalnum;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.send_layout);
final Button btn_conpute = (Button) findViewById(R.id.btn_compute);
final EditText txt_compute = (EditText) findViewById(R.id.txt_caption);
final EditText edt_userinpute = (EditText) findViewById(R.id.edt_userinpute);
btn_conpute.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
if (edt_userinpute.getText().toString().length() > 0) {
String userinpute = edt_userinpute.getText().toString();
String resulte = decimalFormatCommafy(userinpute);
Double v = Double.parseDouble(String.valueOf(resulte));
txt_compute.setText(""+v * 10);
}
else {
Toast.makeText(send_activity.this,"Please Insert any Number",Toast.LENGTH_SHORT).show();
}
}
});
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .