更改android语言本地化时防止更改号码本地化

我想改变Android应用程序本地化阿拉伯语 – 英语。
但是,当我将语言更改为阿拉伯语时,它将所有数字更改为阿拉伯语,以便应用程序崩溃我想将语言更改为阿拉伯语并防止更改数字语言来自英语。

Locale locale = new Locale(AppConfig.Language); Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = "ar"; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); setContentView(R.layout.activity_main); 

当我想使用gps获取位置时它是阿拉伯语中的返回数字我怎么能阻止它改变数字语言?

我知道这个答案为时已晚,但它可以帮助将来的某个人。 几天我一直在努力,但我find了一个简单的解决方案。 只是将国家设置为第二个参数。因为有些国家使用阿拉伯数字而其他国家使用所谓的印度数字

 Locale locale = new Locale(LanguageToLoad,"MA");//For Morocco to use 0123... 

要么

 Locale locale = new Locale(LanguageToLoad,"SA");//For Saudi Arabia to use ٠١٢٣... 

建立在这里有一个补充,所以你不必改变整个代码

谷歌的bugtracker中存在这样的问题: 阿拉伯语数字在阿拉伯语中与印度 – 阿拉伯数字系统相关

如果由于某些客户的问题(我可以理解)特别是埃及语言环境不起作用,那么您可以将字符串格式化为任何其他西方语言环境。 例如:

  NumberFormat nf = NumberFormat.getInstance(new Locale("en","US")); //or "nb","No" - for Norway String sDistance = nf.format(distance); distanceTextView.setText(String.format(getString(R.string.distance), sDistance)); 

如果具有新Locale解决方案根本不起作用,那么有一个丑陋的解决方法:

 public String replaceArabicNumbers(String original) { return original.replaceAll("١","1") .replaceAll("٢","2") .replaceAll("٣","3") .....; } 

(以及与Unicodes匹配的变体(U + 0661,U + 0662,…)。 在这里查看更多类似的想法)

Upd1:为了避免在任何地方逐个调用格式化字符串,我建议创建一个小工具方法:

 public final class Tools { static NumberFormat numberFormat = NumberFormat.getInstance(new Locale("en","US")); public static String getString(Resources resources, int stringId, Object... formatArgs) { if (formatArgs == null || formatArgs.length == 0) { return resources.getString(stringId, formatArgs); } Object[] formattedArgs = new Object[formatArgs.length]; for (int i = 0; i < formatArgs.length; i++) { formattedArgs[i] = (formatArgs[i] instanceof Number) ? numberFormat.format(formatArgs[i]) : formatArgs[i]; } return resources.getString(stringId, formattedArgs); } } .... distanceText.setText(Tools.getString(getResources(), R.string.distance, 24)); 

或者覆盖默认的TextView并在setText(CharSequence text, BufferType type)处理它setText(CharSequence text, BufferType type)

 public class TextViewWithArabicDigits extends TextView { public TextViewWithArabicDigits(Context context) { super(context); } public TextViewWithArabicDigits(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setText(CharSequence text, BufferType type) { super.setText(replaceArabicNumbers(text), type); } private String replaceArabicNumbers(CharSequence original) { if (original != null) { return original.toString().replaceAll("١","1") .replaceAll("٢","2") .replaceAll("٣","3") ....; } return null; } } 

我希望,这有帮助

可以为各个TextView或在应用程序中扩展它的元素设置区域设置。
有关更多信息,请参阅http://developer.android.com/reference/android/widget/TextView.html#setTextLocale(java.util.Locale)

UPDATE
您可以使用以下方法将数字解析为所需的语言环境

 public static String nFormate(double d) { NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH); nf.setMaximumFractionDigits(10); String st= nf.format(d); return st; } 

然后你可以再次解析数字加倍

最好和最简单的方法是在所有本地化字符串中保留所有字符串文件中的数字。 或者您需要将每个数字字符串转换为数字