编辑
我正在将我的应用移植到阿拉伯语区域设置.我有一些带有以下参数的getString():
getString(R.string.distance, distance)
哪里
要求是在阿拉伯语中我应该这样表达:"2.3كم".
如果我设置为沙特阿拉伯(country ="sa")或阿联酋(country ="ae")的区域设置,则数字以东方阿拉伯语显示,但我的客户希望使用西方阿拉伯语.
这里的解决方案是使用埃及作为当地的国家,但这对我来说是不可能的.
我试过了:
@TargetApi(Build.VERSION_CODES.LOLLIPOP) public void setAppContextLocale(Locale savedLocale) { Locale.Builder builder = new Locale.Builder(); builder.setLocale(savedLocale).setExtension(Locale.UNICODE_LOCALE_EXTENSION, "nu-latn"); Locale locale = builder.build(); Configuration config = new Configuration(); config.locale = locale; config.setLayoutDirection(new Locale(savedLocale.getLanguage())); mAppContext.getResources().updateConfiguration(config, mContext.getResources().getDisplayMetrics()); }
正如此问题中所建议的那样,但在此之后该国家被忽略,因此SA和AE语言环境都使用默认文件中的字符串.
在谷歌的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));
如果使用new的解决方案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)
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; } }
我希望,这有帮助
有一个简单的方法。取整数并将其格式化为字符串,它将通过此方法隐式地将本地化应用于数字:
String YourNumberString = String.format("%d", YourNumberInteger);
所以123将变成??? 等等。
有关更多信息,请参见以下网址的 “格式编号”部分:https: //developer.android.com/training/basics/supporting-devices/languages