Как отображать персидские (фарси) числа в представлениях

Я хочу отображать персидские (фарси) числа в представлениях. Например, я рассчитал дату и преобразовал ее в календарь Джалали, но как я могу отобразить ее с помощью персидских чисел?


person Farnad Tohidkhah    schedule 22.07.2015    source источник
comment
Возможно, вам придется использовать какой-нибудь dll или сторонний инструмент, чтобы получить шрифты для фарси.   -  person Itban Saeed    schedule 22.07.2015


Ответы (11)


Другой способ показать числа персидским шрифтом — использовать следующий вспомогательный класс:

public class FormatHelper {

    private static String[] persianNumbers = new String[]{ "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹" };


    public static String toPersianNumber(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 += persianNumbers[number];
        }
        else if (c == '٫') {
            out += '،';
        }
        else {
            out += c;
        }

        return out;
    }
}

Сохраните этот класс в формате UTF8 и используйте его, как следующий код.

FormatHelper.toPersianNumber(numberString);
person Farnad Tohidkhah    schedule 26.08.2015
comment
если вы считаете по числам, это усложнит задачу. потому что, когда вы хотите вычислить, вы должны преобразовать их обратно. но при использовании шрифта конвертировать и деконвертировать не требуется. - person Hojat Modaresi; 18.07.2016

Используя класс Typeface, тип шрифта представления может быть изменен на шрифт Farsi, чтобы числа могли отображаться шрифтами Farsi:

Typeface typeface = Typeface.createFromAsset(getAssets(), "FarsiFontName.ttf");
myView.setTypeface(typeface);
person Farnad Tohidkhah    schedule 28.07.2015
comment
пожалуйста, переведите на английский свой комментарий - person Mir Hussain; 13.09.2015
comment
Этот метод не на самом деле предложить. - person Manian Rezaee; 31.10.2015
comment
@ Акбар Резаи, почему? - person omid; 15.09.2016
comment
Хорошо, но я думаю, что это решение работает только тогда, когда вы уже сохранили числа как utf-8. - person Ayub; 13.10.2017

установите язык на арабский, Египет

int i = 25;
NumberFormat nf = NumberFormat.getInstance(new Locale("ar","EG"));
nf.format(i);
person SMahdiS    schedule 18.06.2016

Вы можете создать собственное представление и прикрепить к нему шрифт фарси, наконец, вы можете использовать его в представлениях xml. Большинство шрифтов фарси не имеют английского номера в карте символов, и вы можете просто использовать это без каких-либо проблем. Например :

public class TextViewStyle extends TextView {

    public TextViewStyle(Context context) {
        super(context);
        init(context, null, 0);
    }


    public TextViewStyle(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        init(context, attrs, 0);
    }


    public TextViewStyle(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle){
        try {
            TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.TextViewStyle, defStyle, 0);
            String str = a.getString(R.styleable.TextViewStyle_fonttype);
            switch (Integer.parseInt(str)) {
                case 0:
                    str = "fonts/byekan.ttf";
                    break;
                case 1:
                    str = "fonts/bnazanin.ttf";
                    break;
                case 2:
                    str = "fonts/btitr.ttf";
                    break;
                case 3:
                    str = "fonts/mjbeirut.ttf";
                    break;
                case 4:
                    str = "fonts/bnazanin_bold.ttf";
                    break;
                default:
                    str = "fonts/bnazanin.ttf";
                    break;
            }
            setTypeface(FontManager.getInstance(getContext()).loadFont(str));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

attr.xml :

<declare-styleable name="TextViewStyle">
    <attr name="selected_background" format="integer"/>
    <attr name="fonttype">
        <enum name="byekan" value="0"/>
        <enum name="bnazanin" value="1"/>
        <enum name="btitr" value="2"/>
        <enum name="mjbeirut" value="3"/>
        <enum name="bnazaninBold" value="4"/>
    </attr>
</declare-styleable>
person Community    schedule 22.07.2015
comment
В этом случае нам нужны только персидские числа, а не все символы, поэтому я предлагаю создать массив и вручную ввести персидские числа. - person Manian Rezaee; 31.10.2015

Простой и правильный способ — использовать Locale и String.format. Вы можете просто использовать персидский шрифт для представления, если шрифт по умолчанию не поддерживает персидские цифры. Вот как бы я это сделал.

Locale locale = new Locale("fa");
return String.format(locale, "%04d", year) + "/" + 
       String.format(locale, "%02d", month) + "/" + 
       String.format(locale, "%02d", day);

Вы также можете использовать библиотеку PersianCaldroid, которая не только предоставляет вам простые API, такие как PersianDate.toStringInPersian(), но также позволяет Персидский DatePicker и CalendarView.

person Dariush Malek    schedule 19.05.2018

попробуйте это, набрав для EditText:

 public static void edtNumE2P(final EditText edt) {
    edt.addTextChangedListener(new TextWatcher() {

      @Override
      public void onTextChanged(CharSequence s, int pstart, int pbefore, int pcount) {
//        for (String chr : new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}) {
        for (char chr : "0123456789".toCharArray()) {
          if (s.toString().contains("" + chr)) {
            edt.setText(MyUtils.numE2P(edt.getText().toString()));
            edt.setSelection(edt.getText().length());
          }
        }
      }


      @Override
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {

      }


      @Override
      public void afterTextChanged(Editable s) {
      }
    });
  }

И попробуйте это тоже:

    public static String numE2P(String str, boolean reverse) {
    String[][] chars = new String[][]{
      {"0", "۰"},
      {"1", "۱"},
      {"2", "۲"},
      {"3", "۳"},
      {"4", "۴"},
      {"5", "۵"},
      {"6", "۶"},
      {"7", "۷"},
      {"8", "۸"},
      {"9", "۹"}
    };

    for (String[] num : chars) {
      if (reverse) {
        str = str.replace(num[1], num[0]);
      } else {
        str = str.replace(num[0], num[1]);
      }
    }
//    Log.v("numE2P", str);
    return str;
  }
person Criss    schedule 08.06.2018

вы можете использовать Time4J для отображения даты и использовать ChronoFormatter для отображения:

ChronoFormatter<PersianCalendar> formatter= ChronoFormatter.setUp(PersianCalendar.axis(), PERSIAN_LOCALE)
.addPattern("dd", PatternType.CLDR).build();
// it will display day :  ۲۴

or

.addPattern("dd MMMM", PatternType.CLDR).build();
// مرداد ۲۴

и с определением шаблонов вы можете выбрать способ отображения даты: ChronoFormatter

person Vahid Rajabi    schedule 15.08.2018
comment
Для Android я бы предпочел использовать Time4A (дочерний проект). Есть также несколько способов показать числа на фарси, либо выбрав подходящую локаль для Ирана, либо изменив средство форматирования следующим образом: chronoFormatter.with(Attributes.NUMBER_SYSTEM, NumberSystem.ARABIC_INDIC_EXT) - person Meno Hochschild; 17.08.2018

Самый простой и легкий способ — использовать NumberFormat:

NumberFormat numberFormat = NumberFormat.getInstance(new Locale("fa","IR"));
textView.setText(numberFormat.format(15000))
person ParSa    schedule 22.08.2020
comment
Этот ответ более интеллектуален; Спасибо! - person Ehsan; 06.04.2021

Вы можете использовать следующий метод для отображения числа на персидском языке:

 public String NumToPersion(String a){
    String[] pNum =new String[]{"۰","۱","۲","۳","۴","۵","۶","۷","۸","۹" };
    a=a.replace("0",pNum[0]);
    a=a.replace("1",pNum[1]);
    a=a.replace("2",pNum[2]);
    a=a.replace("3",pNum[3]);
    a=a.replace("4",pNum[4]);
    a=a.replace("5",pNum[5]);
    a=a.replace("6",pNum[6]);
    a=a.replace("7",pNum[7]);
    a=a.replace("8",pNum[8]);
    a=a.replace("9",pNum[9]);
   return a;
}
person Hossein Bagheri    schedule 01.04.2018

Просто сделайте это в kotlin для целых чисел без знака

fun toPersian(n:Int) : String{
val p="۰۱۲۳۴۵۶۷۸۹"
return n.toString().trim().map{
    p[it.toString().trim().toInt()]
}.joinToString()
}
txt_view?.text=toPersian(12087)//۱۲۰۸۷
person babak    schedule 04.04.2018

вы должны добавить персидскую стандартную клавиатуру в Windows и перейти на эту клавиатуру, когда хотите набирать персидские цифры и слова. это работа для меня

person Reza_Tiraxturchi_Namarvari    schedule 27.11.2016