با سلام خدمت شما دوستان گرامی . توی این آموزش قصد دارم فرمت بندی اعداد در EditText رو بهتون آموزش بدم .

فرمت بندی اعداد در EditText

منظور از فرمت بندی اعداد چیست ؟

معمولا بیشتر ما ها عادت داریم وقتی عدد بالای سه رقم میشه برای اینکه راحت تر خونده بشه اون عدد رو سه رقم سه رقم جدا کنیم . توی برنامه های اندرویدی هم خیلی جاها نیاز میشه که این اعداد رو فرمت بندی کنیم . مثلا موقع وارد کردن عدد در EditText ها یا نشان دادن این عدد ها در TextView .

فرمت بندی اعداد در اندروید به چه صورت انجام میشود ؟

برای فرمت کردن اعداد از کلاس DecimalFormat به صورت زیر استفاده میکنیم :

علامت های شارپ (#) برای اینه که نوع فرمت بندی رو مشخص کنه در واقع تعداد اعداد در هر گروه و علامت ویرگول هم ( , ) جدا کننده رو مشخص میکنه .

نکته : دقت داشته باشید که موقع import کردن کلاس DecimalFormat  دو نوع کلاس از پکیج های مختلف رو بهتون پیشنهاد میکنه که یکیش مربوط به پکیج icu هست که کلاس کامل تریه ولی چون از SDK 24 به بعد به اندروید اضافه شده نمیشه برای اندروید های پایین تر ازش استفاده کرد پس ما کلاس مربوط به پکیج java.text.DecimalFormat رو انتخاب میکنیم .

چگونه اعداد را در EditText سه رقم سه رقم جدا کنیم ؟

برای اینکه ما بتونیم اعداد را موقع تایپ کردن فرمت بندی کنیم نیاز به اینترفیس TextWatcher داریم .این اینتر فیس سه حال رو برای EditText در اختیار ما میذاره :

  1. قبل از تغییر نوشته.
  2. در هنگام تغییر نوشته .
  3. بعد از تغییر نوشته.

خب ما میخایم که نوشته رو بعد از اینکه تغییر داده شد فرمت بندی کنیم . برای اینکار به صورت زیر عمل میکنیم :

در مورد قسمت های ستاره دار یه توضیحی بدم :

* : وقتی شما TextWatcher رو به EditText اضافه میکنید هر تغییری در نوشته های EditText ایجاد بشه متد ها TextWatcher اجرا میشن . این تغییر شامل استفاده از متد setText مربوط به EditText هم میشه . یعنی وقتی شما با استفاده از متد setText نوشته EditText رو عوض میکنید متد afterTextChanged هم فرخوانی میشه و فقط کافیه شما یک عدد در EditText تایپ کنید تا برنامه شما در یک لوپ (گردش ) بی نهایت قرار بگیره و هنگ کنه . برای اینکه از این اتفاق جلوگیری کنیم قبل از اینکه از متد setText استفاده کنیم TextWatcher رو از EditText حذف میکنیم .

** : بعد از انجام عملیات فرمتینگ برای اینکه دوباره تغییرات EditText مانیتور بشه TextWatcher رو به EditText اضافه میکنیم .

*** : وقتی اعداد رو فرمت میکنید با علامت ( , ) از هم جدا میشن که این علامت جزو عدد نیست و وقتی از Double.valueOf استفاده میکنید اگه چیزی غیر از فقط عدد به آرگومانش ارسال کنیم اکسپشن پرتاب میشه و باعث کرش شدن برنامه میشه . برای همین قبل از استفاده از  Double.valueOf با استفاده از متد replaceAll تمام ( , ) ها رو با ( “” ) عوض میکنیم .

تا تقریبا کار ما تموم شده . ولی یه مشکلی هست ! اگه شما اعداد رو به صورت فارسی تایپ کنید برنامه کرش میشه !! به این خاطر که Double.valueOf اعداد فارسی رو نمیشناسه و به همین خاطر NumberFormatException اتفاق میفته . خب برای حل این مشکل چیکار کنیم ؟

حل مشکل NumberFormatException برای اعداد فارسی :

برای اینکه این مشکل رو حل کنیم چنتا راه پیشنهاد شده . یکیش اینه که تمام کاراکتر های اعداد فارسی رو در یک ارایه قرار بدیم و به اضای هرکدومشون عدد انگلیسیشو جاش بذاریم که  به 20 -25 خط کد نوشتن نیاز داره ، راه دیگه و از همه بی دردسر ترش استفاده از کلاس BigDecimal هست . به این صورت که مقدار استرینگ عدد فارسی رو به این کلاس میدیم و معادل انگلیسیش رو دریافت میکنیم  😎

کد نهایی ما به این صورت میشه :

دو خطی رو که با علامت ( **** ) مشخص کردم تغییر دادیم . حالا بدون مشکل میتونید از اعداد فارسی هم استفاده کنید .

نکته 1 :

برای اینکه به کاربر اجازه وارد کردن چیزی غیر از اعداد رو در EditText ندیم تا از ایجاد مشکل در فرمت بندی و همچنین پرتاپ شدن NumberFormatException  جلوگیری بشه بهتره که inputType مربوط به EditText رو در فایل xml ی که EditText توش تعریف شده برابر number یا numberDecimal بذاریم :

نکته 2 :

برای اینکه از کرش شدن برنامه بر اثر ورودی های نا خواسته مثل کپی پیست کردن چیزی غیر از اعداد در EditText جلوگیری کنیم بهتره کد های بالا درون try catch بذاریم .یا اینکه میتونید خودتون کد هارو کامل تر کنید و اعتبار سنجی رو قبل از فرستاد به متد Double.valueOf انجام بدید .

امیدوارم این آموزش براتون مفید واقع شده باشه  🙂

به این مطلب چه امتیازی میدهید ؟

اشتراک
باخبر شدن از
guest
0 Comments
Inline Feedbacks
View all comments