当前位置:  开发笔记 > Android > 正文

Android中阿拉伯文字的阿拉伯数字

如何解决《Android中阿拉伯文字的阿拉伯数字》经验,为你挑选了2个好方法。

编辑

我正在将我的应用移植到阿拉伯语区域设置.我有一些带有以下参数的getString():

getString(R.string.distance, distance)

哪里 %1d km

要求是在阿拉伯语中我应该这样表达:"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语言环境都使用默认文件中的字符串.



1> Konstantin L..:

在谷歌的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;
    }
}

我希望,这有帮助



2> MohammadL..:

有一个简单的方法。取整数并将其格式化为字符串,它将通过此​​方法隐式地将本地化应用于数字:

String YourNumberString = String.format("%d", YourNumberInteger);

所以123将变成??? 等等。

有关更多信息,请参见以下网址的 “格式编号”部分:https: //developer.android.com/training/basics/supporting-devices/languages

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有