مصطفی کاظمی
مصطفی کاظمی
خواندن ۲ دقیقه·۵ سال پیش

حل مشکل ارقام فارسی در جاوای ۹+ در ویندوز

وقتی از جاوای ۸ به جاوای ۱۰ مهاجرت کردم، زمانی که می‌خواستم پروژه رو اجرا کنم با خطای عجیب NumberFormatException روبرو می‌شدم؛ دقت که کردم دیدم تاریخ لاگ‌ها توی کنسول با ارقام فارسی نوشته می‌شه (توی cmd که علامت سوال می‌افتاد).

ارقام فارسی تو کنسول!
ارقام فارسی تو کنسول!

سری اول که یه چرخی توی گوگل زدم هیچ سرنخی نتونستم پیدا کنم و دوباره برگشتم به جاوای ۸؛ راستش اون موقع خیلیم انگیزه نداشتم برم روی جاوای جدیدتر! بعدتر که جاوای ۱۱ اومد و پایدار شد (و کلیدواژه‌ی دوست داشتنی var اضافه شد)، گفتم لابد این مشکل حل شده و تصمیم گرفتم پروژه‌های جدید رو با جاوای ۱۱ بزنم.

اما کماکان مشکل وجود داشت :(

این سری که با جدیت بیشتری تو گوگل چرخ زدم فهمیدم که توی جاوای ۹ به بعد، Locale Provider های جاوا، تغییر کرده و به صورت پیش‌فرض از فرمت تعریف شده توی سیستم عامل استفاده می‌کنه و از اونجایی که فرمت ویندوز من روی فارسی تنظیم شده بود این مشکل به وجود می‌اومد.

توی ویندوز فرمت رو می‌شه داخل Region در Control Panel تغییر داد.
توی ویندوز فرمت رو می‌شه داخل Region در Control Panel تغییر داد.

راه حل اول: تغییر فرمت ویندوز

خب با تغییر فرمت به انگلیسی مشکل حل میشه اما راه حل مطلوبی نیست!

راه حل دوم: تغییر Locale Provider

به سه روش می‌شه Locale Provider رو تغییر داد:

۱)‌ تغییر Locale Provider با ارسال آرگومان JVM

توی این روش کافیه وقتی از دستور java استفاده می‌کنید، بلافاصله بعدش این رو اضافه کنید:

-Djava.locale.providers=COMPAT

به عنوان مثال:

java -Djava.locale.providers=COMPAT -jar file.jar

اگر از IntelliJ استفاده می‌کنید می‌تونید آرگومان گفته شده رو در قسمت زیر اضافه کنید:

Run --> Edit Configurations --> VM Options
پنجره Run/Debug Configurations در IntelliJ
پنجره Run/Debug Configurations در IntelliJ

۲) تغییر Locale Provider در کد

خودم روش قبلی رو وقتی از Maven استفاده کردم نتونستم اعمال کنم؛ اما با اضافه کردن دستور پایین به تابع main، جواب گرفتم:

System.setProperty(&quotjava.locale.providers&quot, &quotCOMPAT&quot);
اینم کل تابع main :)
اینم کل تابع main :)

۳) تغییر Locale Provider در سطح سیستم

با اجرای این دستور در CMD (به صورت admin)، یه متغیر در System Environment Variables تنظیم میشه و تمامی نرم‌افزارهایی که با جاوا اجرا میشن Locale Providerشون تغییر می‌کنه.

setx _JAVA_OPTIONS &quot-Djava.locale.providers=COMPAT&quot /M

امیدوارم روش‌های گفته شده به کارتون بیاد؛ باز اگه راه بهتری سراغ داشتید بگید ممنون می‌شم. ✋


java persian numberاعداد فارسی در جاواjava numberformatexceptinمشکل اعداد فارسی در جاواjava locale provider compat
توسعه‌دهنده جاوا و اندکی جاوا اسکریپت | در تپسی
شاید از این پست‌ها خوشتان بیاید