android - Cómo mostrar números persas(farsi) en vistas
fonts numbers (10)
Quiero mostrar los números persas (farsi) en las vistas. Por ejemplo, calculé una fecha y la convertí al calendario Jalali, pero ¿cómo puedo mostrarla en números persas?
Al usar la clase Typeface, el tipo de fuente de una vista se puede cambiar a fuente Farsi para que los números se puedan mostrar con fuentes Farsi:
Typeface typeface = Typeface.createFromAsset(getAssets(), "FarsiFontName.ttf");
myView.setTypeface(typeface);
La forma simple y correcta es usar Locale
y String.format
. Simplemente puede usar una fuente persa para la vista en caso de que la fuente predeterminada no admita los números persas. Así es como lo haría.
Locale locale = new Locale("fa");
return String.format(locale, "%04d", year) + "/" +
String.format(locale, "%02d", month) + "/" +
String.format(locale, "%02d", day);
También puede usar la biblioteca PersianCaldroid , que no solo le proporciona API simples como PersianDate.toStringInPersian()
sino que también le permite tener persa DatePicker y CalendarView.
Otra forma de mostrar números con fuente persa es mediante el uso de la siguiente clase de ayuda:
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;
}
}
Guarde esta clase como formato UTF8 y utilícela como el siguiente código FormatHelper.toPersianNumber (numberString);
Puede crear una vista personalizada y adjuntar fuente farsi en eso, finalmente, puede usar eso en xml views.most la fuente farsi no tiene un número de inglés en el mapa de caracteres y puede usar simplemente eso sin ningún problema. por ejemplo :
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>
Puedes usar el siguiente método para mostrar el número en persa:
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;
}
Simplemente hazlo en kotlin para enteros sin signo
fun toPersian(n:Int) : String{
val p="۰۱۲۳۴۵۶۷۸۹"
return n.toString().trim().map{
p[it.toString().trim().toInt()]
}.joinToString()
}
txt_view?.text=toPersian(12087)//۱۲۰۸۷
debe agregar el teclado persa estándar en Windows y cambiar a este teclado cuando desee escribir dígitos y palabras persas. Es trabajo para mi
establecer el lugar a árabe, Egipto
int i = 25;
NumberFormat nf = NumberFormat.getInstance(new Locale("ar","EG"));
nf.format(i);
intente esto mientras escribe para editar texto:
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) {
}
});
}
Y prueba esto también:
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;
}
puede usar Time4J para mostrar la fecha y usar ChronoFormatter
para mostrar:
ChronoFormatter<PersianCalendar> formatter= ChronoFormatter.setUp(PersianCalendar.axis(), PERSIAN_LOCALE)
.addPattern("dd", PatternType.CLDR).build();
// it will display day : ۲۴
o
.addPattern("dd MMMM", PatternType.CLDR).build();
// مرداد ۲۴
y con la definición de patrones, puede elegir cómo mostrar la fecha: ChronoFormatter