نمایش اعداد فارسی در View های اندروید
به نام خدا. در این مبحث ابتدا روشهای متفاوت نمایش اعداد فارسی در برنامهی اندرویدی را بررسی کرده سپس یک متد جاوا برای تبدیل اعداد انگلیسی به فارسی مینویسیم و در View های پروژه اندروید برای نمایش اعداد به صورت فارسی از آن استفاده میکنیم.
چرا باید از اعداد فارسی در برنامه اندروید استفاده کنیم؟
یکی از مشکلات توسعه دهندگان فارسی زبان، نمایش اعداد انگلیسی در محیط اپلیکیشن اندرویدی است که باعث ایجاد نوعی بینظمی در رابط کاربری برنامه اندرویدی میشود. یک متن فارسی که در میان آن چند عدد قرار گرفته و همه آنها با فرمت اعداد انگلیسی نمایش داده میشوند. یا به عنوان مثال قیمت یک محصول در اپلیکیشن فروشگاهی شما بهاینصورت به مخاطب نشان داده شود:
این یک امتیاز منفی برای اپلیکیشن به حساب میآید. درست همانطور که نمایش عددهای فارسی در یک متن انگلیسی میتواند مضحک بنظر برسد!
بنابراین لازم است در صفحاتِ با محتوای فارسی حتما از اعداد فارسی استفاده کنیم (مگر در موارد خاص). در اینصورت خوانایی محتوا نیز برای کاربر بهینه میشود.
روشهای نمایش اعداد فارسی در اپلیکیشن اندروید
برای نمایش عددهای فارسی در برنامه نویسی اندروید، راهکارهای متفاوتی وجود دارد که در اینجا به چند مورد اشاره میکنم:
۱- بکاربردن مستقیم اعداد فارسی در متن و قسمتهای مدنظر: در این حالت کافیست اعداد به صورت فارسی به View ها ارسال شوند. چه محتوایی که در دیتابیس ذخیره شده چه آنهایی که به واسطه وب سرویس از سرور دریافت میشوند و چه آنهایی که در خود اکتیویتی و Layout قرار گرفته اند.
۲- استفاده از فونتهای فارسی: اگر مبحث تغییر فونت در برنامه اندرویدی را مطالعه کرده باشید، روشهای متفاوت تغییر فونت پیش فرض اندروید را بررسی کردیم. برخی فونتهای فارسی، اعداد انگلیسی را هم به صورت فارسی نمایش میدهند بنابراین خیلی ساده و بدون نیاز به هیچ عمل دیگری میتوانید مسئله را حل کنید. به عنوان مثال فونت IRANSans برای اپلیکیشنهای موبایلی دو فونت متفاوت ارائه داده که در یکی از آنها فارغ از اینکه اعداد فارسی یا انگلیسی هستند، آنها را به صورت فارسی نمایش میدهد. البته استفاده از این نوع فونت یک ایراد دارد که در واقع همان ویژگی آن محسوب میشود! یعنی شما امکان نمایش اعداد انگلیسی را نخواهید داشت. فرض کنید نام و مدل یک محصول در فروشگاه شما LG G7 است. طبیعتا چون نام و مدل، کاراکترهای انگلیسی هستند، عدد بکار رفته در سری یا مدل این محصول نیز باید انگلیسی باشد نه فارسی. مگر آنکه هر دو فونت استاندارد و به اصطلاح FaNum را در پروژه بکار ببریم و در هر View بنا به نیاز از یکی از آنها استفاده کنیم.
۳- تبدیل اعداد انگلیسی به فارسی: در این روش باید متدی را پیاده سازی کنیم که قبل از ارسال محتوا به View مدنظر، چک کند اگر عدد یا اعداد انگلیسی وجود دارد آنها را با اعداد فارسی جایگزین نماید. در این مبحث قصد دارم این روش را آموزش دهم.
تبدیل اعداد انگلیسی به فارسی در View های اندروید
در این روش یک متد میسازیم که محتوای ارسالی به View را بررسی میکند و درصورت وجود اعداد انگلیسی، آنها را به اعداد فارسی تبدیل میکند.
ابتدا یک پروژه با نام FarsiNumbers در اندروید استودیو میسازم که اکتیویتی آن از نوع Empty Activity است.
پروژه با موفقیت بیلد شد. حالا یک کلاس جاوا به پروژه اضافه میکنم. من نام این کلاس را FaNum انتخاب کردم:
کلاس FaNum.java را بصورت زیر تکمیل میکنم:
package ir.android_studio.farsinumbers; public class FaNum { public static String convert(String faNumbers) { String[][] mChars = new String[][]{ {"0", "۰"}, {"1", "۱"}, {"2", "۲"}, {"3", "۳"}, {"4", "۴"}, {"5", "۵"}, {"6", "۶"}, {"7", "۷"}, {"8", "۸"}, {"9", "۹"} }; for (String[] num : mChars) { faNumbers = faNumbers.replace(num[0], num[1]); } return faNumbers; } }
یک متد از نوع String و با نام دلخواه convert درون کلاس ایجاد کردم که پارامتر ورودی آن از نوع String و با نام دلخواه faNumbers انتخاب شده. در ادامه یک آرایه دو بُعدی با نام mChars ساختهام که مقادیر آن شامل اعداد انگلیسی و فارسیست. ستون اول (اندیس صفر) مربوط به اعداد انگلیسی و ستون دوم (اندیس یک) مربوط به اعداد فارسی میباشد. سپس یک for تعریف شده. درون بلاک for از متد replace استفاده شده بهاینصورت که کاراکترهای دریافتی بررسی شده و در صورت وجود کاراکتر (اعداد) انگلیسی (ستون اول)، با عدد فارسی مقابل آن (ستون دوم) تعویض و جایگذاری میشود. به عبارتی اندیس ۱ جایگزین اندیس ۰ میشود.
در نهایت چون متد از نوع بازگشتی است، مقدار خروجی return میشود.
متد کامل شد. حالا برای تست متدی که ساختم، یک TextView به اکتیویتی اضافه میکنم:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/m_txt" android:layout_centerInParent="true" android:textSize="40sp"/> </RelativeLayout>
MainActivity.java:
package ir.android_studio.farsinumbers; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView mText = findViewById(R.id.m_txt); mText.setText("1234567890"); } }
ابتدا توسط متد setText یک رشته شامل اعداد ۰ تا ۹ انگلیسی را به TextView ارسال میکنم. با اجرای پروژه روی شبیه ساز اندروید مسلما اعداد به صورت انگلیسی ظاهر خواهند شد:
حالا از متدی که نوشتم استفاده میکنم و انتظار دارم با افزودن متد convert کلاس FaNum به setText اعداد به صورت فارسی نمایش داده شوند:
mText.setText(FaNum.convert("1234567890"));
متد به درستی کار میکند.
این متد را به صورتهای دیگری نیز میتوان پیاده سازی کرد که با جستجو در وب به نمونههایی برخورد میکنیم. یکی از آنها را در اینجا ذکر میکنم:
package ir.android_studio.farsinumbers; public class FaNum2 { private static String[] faNumbers = new String[]{"۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"}; public static String convert(String text) { if (text.length() == 0) { return ""; } String out = ""; int length = text.length(); for (int i = 0; i < length; i++) { char c = text.charAt(i); if ('0' <= c && c <= '9') { int number = Integer.parseInt(String.valueOf(c)); out += faNumbers[number]; } else if (c == '٫' || c == ',') { out += '،'; } else { out += c; } } return out; } }
یک کلاس جدید با نام FaNum2 به پروژه اضافه کرده و متد فوق را درون آن قرار دادم. حالا کافیست در setText متد convert این کلاس را فراخوانی کنم:
mText.setText(FaNum2.convert("1234567890"));
نتیجه مشابه خروجی متد قبل بوده و اعداد فارسی نمایش داده میشوند.
به تکه کد زیر دقت کنید:
if (c == '٫' || c == ',') { out += '،'; }
کاربرد این کد برای مواقعی است که قیمت محصولات دارای جداکننده باشد و بخواهیم کاراکتر جداکننده نیز به ویرگول فارسی تبدیل شود.
اعداد را توسط جداکننده (ویرگول انگلیسی) به صورت سه رقم از یکدیگر جدا کرده و مجدد پروژه را اجرا میکنم:
mText.setText(FaNum2.convert("123,4567,890"));
خروجی همان چیزی است که انتظارش را داشتیم.
توجه: سورس پروژه درون پوشه Exercises قرار دارد
تعداد صفحات : ۱۰
حجم : ۱ مگابایت
قیمت : رایگان
دانلود رایگان با حجم ۱ مگابایت لینک کمکی
با سلام
چطور میتونیم در شبیه ساز اندروید در Android Studio فارسی تایپ کنیم؟
با فارسی مشکل داره
دست شما درد نکنه. من برای جاوا ۱۷ نوشتم این متد شد :
public static String formatPersianDigits(String text) {
String result = null;
if (isValidString(text)) {
var builder = new StringBuilder();
for (char c : text.toCharArray()) {
if (‘0’ <= c && c <= '9') {
builder.append(faNumbers[Integer.parseInt(String.valueOf(c))]);
} else if (c == '٫' || c == ',') {
builder.append('،');
} else {
builder.append(c);
}
}
result = builder.toString();
}
return result;
}
با سلام و سپاس از مطالب خوبتون خواستم عرض کنم فکر کنم همه میدونیم اعداد فارسی متاسفانه خطا و مشکلاتی داره که باعث میشه بعضی دوست داشته باشند حتی اگر اشتباه هم به نظر برسه همیشه از اعداد انگلیسی استفاده کنند،.
در برخی از گوشی های قدیمی مثل آنر این امکان وجود داشت که خود کاربر در بخش تنظیمات زبان انتخاب کند از اعداد محلی استفاده کند یا نه ولی متاسفانه در گوشی های جدید این گزینه را من ندیدم.
اینکه بشود در برخی اپلیکیشن اعداد را انگلیسی کرد خوب هست ولی این کار برای همه مقدور نیست و محدویت هایی هم دارد.
پرسش و درخواستی که من دارم اینه که چطور میشود به عنوان یک ایرانی کاری کرد شرکتهای تولید گوشی این گزینه انتخابی را به اندروید های جدید اضافه کنند.
ببخشید که این درخواست غیر معمول رو میکنم ولی یقینا این کار خدمتی بزرگ به مردم هست.
با آرزوی بهترین ها…
خدا خیرت بده 🙂
عالی بود.
سلام. خیلی ممنون از آموزش هایی که خیلی واضح و روان بیان میکنید، موضوعاتی هم که تو سایت شما بیان میشه همه کاربردی و پراستفاده هستند. براتون آروزی موفقیت میکنم. یه سوال درباره مطلب بالا داشتم، اگر از روش دوم (فونتهای فارسی) استفاده کنیم که خودشون اعداد رو بصورت فارسی نمایش میدن، آیا راه حلی وجود داره که وقتی متن انگلیسی میشه اعداد هم انگلیسی نمایش داده بشن؟ درواقع زمانیکه ما استفاده از یه فونت خاص مدنظرمونه، ولی درعین حال هم میخوایم بر حسب تغییر زبان متن نمایش اعداد هم تغییر کنند. ممنونم.
باید از دو فونت استفاده کنید. فونت با اعداد فارسی برای متون انگلیسی و فونت اعداد لاتین برای متون انگلیسی
سلام خسته نباشید
من میخوام برعکس این کار رو انجام بدم یعنی اعداد گوشیم فارسیه میخوام انگلیسیشون کنم، راهی هست؟
این آموزش برای اپلیکیشن هست نه خود دیوایس
سلام
از اموزش های چند سایت استفاده کردم واقعا سایت شما از بهترین هاست
لطف دارید
آرزوی توفیق دارم برای شما از صمیم دلم
استفاده می کنیم از سایت شما
سلام لطف کنید نحوه استفاده از Service ها در برنامه نویسی اندروید را قرار دهید.
البته آموزشی که کامل و جامع باشد و بتواند دز زمینه های مختلف مورد استفاده قرار گیرد.
ممنون از شما و سایت خوبتون.
سلام
خواستم تشکر کنم از زحمات شما
سایت بسیار عالی هست واقعا ممنون
لطف دارید