TextView 数字以波斯字体显示为英文
TextView Numbers shown in English in Persian font
我正在将一个包含一些数字(全部为波斯语)的字符串加载到 android TextView 中。一切都很好,直到我更改了自定义字体,文本数字显示为英文数字。
Expected : ۱۲۳۴
Received : 1234
我知道我的新字体支持波斯语数字。当我使用正确显示的数字下方的代码更改数字区域设置时。
NumberFormat numberFormat = NumberFormat.getInstance(new Locale("fa", "IR"));
String newNumber = numberFormat.format(number);
问题是我有一个字符串,很难找到数字部分并更改它。我以前的字体也很好用,我不明白这个字体有什么问题。
知道如何为所有文本视图或至少为字符串全局解决此问题吗?
您必须自己翻译。 TextFormat 不会自动将阿拉伯数字转换为任何其他语言的数字,因为这实际上不是人们通常想要的。这些数字中的每一个都有自己的字符代码,简单地遍历字符串并用适当的波斯代码替换它们就足够了。
尝试使用这种方法:
private String setPersianNumbers(String str) {
return str
.replace("0", "۰")
.replace("1", "۱")
.replace("2", "۲")
.replace("3", "۳")
.replace("4", "۴")
.replace("5", "۵")
.replace("6", "۶")
.replace("7", "۷")
.replace("8", "۸")
.replace("9", "۹");
}
private static String[] persianNumbers = new String[]{ "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹" };
public static String PerisanNumber(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;
}}
然后你可以像下面的vlock一样使用它
TextView textView = findViewById(R.id.text_view);
textView.setText(PersianDigitConverter.PerisanNumber("این یک نمونه است ۱۲ "));
你可以使用这个
String NumberString = String.format("%d", NumberInteger);
123 会变成 ١٢٣
使用此代码以波斯数字显示 Hegira 日期:
String farsiDate = "1398/11/3";
farsiDate = farsiDate
.replace('0', '٠')
.replace('1', '١')
.replace('2', '٢')
.replace('3', '٣')
.replace('4', '٤')
.replace('5', '٥')
.replace('6', '٦')
.replace('7', '٧')
.replace('8', '٨')
.replace('9', '٩');
dateText.setText(farsiDate);
在JS中,可以使用下面的函数:
function toPersianDigits(inputValue: any) {
let value = `${inputValue}`;
const charCodeZero = '۰'.charCodeAt(0);
return String(value).replace(/[0-9]/g, w =>
String.fromCharCode(w.charCodeAt(0) + charCodeZero - 48),
);
}
export {toPersianDigits};
我正在将一个包含一些数字(全部为波斯语)的字符串加载到 android TextView 中。一切都很好,直到我更改了自定义字体,文本数字显示为英文数字。
Expected : ۱۲۳۴
Received : 1234
我知道我的新字体支持波斯语数字。当我使用正确显示的数字下方的代码更改数字区域设置时。
NumberFormat numberFormat = NumberFormat.getInstance(new Locale("fa", "IR"));
String newNumber = numberFormat.format(number);
问题是我有一个字符串,很难找到数字部分并更改它。我以前的字体也很好用,我不明白这个字体有什么问题。
知道如何为所有文本视图或至少为字符串全局解决此问题吗?
您必须自己翻译。 TextFormat 不会自动将阿拉伯数字转换为任何其他语言的数字,因为这实际上不是人们通常想要的。这些数字中的每一个都有自己的字符代码,简单地遍历字符串并用适当的波斯代码替换它们就足够了。
尝试使用这种方法:
private String setPersianNumbers(String str) {
return str
.replace("0", "۰")
.replace("1", "۱")
.replace("2", "۲")
.replace("3", "۳")
.replace("4", "۴")
.replace("5", "۵")
.replace("6", "۶")
.replace("7", "۷")
.replace("8", "۸")
.replace("9", "۹");
}
private static String[] persianNumbers = new String[]{ "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹" };
public static String PerisanNumber(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;
}}
然后你可以像下面的vlock一样使用它
TextView textView = findViewById(R.id.text_view);
textView.setText(PersianDigitConverter.PerisanNumber("این یک نمونه است ۱۲ "));
你可以使用这个
String NumberString = String.format("%d", NumberInteger);
123 会变成 ١٢٣
使用此代码以波斯数字显示 Hegira 日期:
String farsiDate = "1398/11/3";
farsiDate = farsiDate
.replace('0', '٠')
.replace('1', '١')
.replace('2', '٢')
.replace('3', '٣')
.replace('4', '٤')
.replace('5', '٥')
.replace('6', '٦')
.replace('7', '٧')
.replace('8', '٨')
.replace('9', '٩');
dateText.setText(farsiDate);
在JS中,可以使用下面的函数:
function toPersianDigits(inputValue: any) {
let value = `${inputValue}`;
const charCodeZero = '۰'.charCodeAt(0);
return String(value).replace(/[0-9]/g, w =>
String.fromCharCode(w.charCodeAt(0) + charCodeZero - 48),
);
}
export {toPersianDigits};