前言
在开发中需要将字符串中的数字转成波斯语中的数字,随后便写下了这篇文章,希望有所帮助
使用
直接上代码
import android.text.TextUtils;
import android.util.Log;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author huyl
* @date 2022/10/11 14:24
*
* <p>
*/
public class LanguageFormatHelper {
private static final String TAG = "LanguageFormatHelper";
//这里在每个字符前后拼接unicode是防止appendReplacement方法导致字符反转
private static String[] AF09 = new String[]{"\u202D٠\u202C", "\u202D١\u202C", "\u202D٢\u202C", "\u202D٣\u202C", "\u202D۴\u202C",
"\u202D۵\u202C", "\u202D۶\u202C", "\u202D٧\u202C", "\u202D٨\u202C", "\u202D٩\u202C"};
/**
* 将字符串中的0-9转为波斯语 其他语言暂时不管
* @return
*/
public static String toAFStr(String value) {
String locale = Locale.getDefault().toString();
Log.d(TAG, "toAFStr: value = " + value + ", locale = " + locale);
//这里是判断语言是否为波斯语 不是则不做转换
if (TextUtils.isEmpty(value) || !"fa_AF".equals(locale)) {
return value;
}
try {
String patt = "\\d";//找出所有数字
Pattern r = Pattern.compile(patt);
Matcher m = r.matcher(value);
m.reset();
StringBuffer sb = new StringBuffer();
while (m.find()) {
//拿出匹配到的数字
String group = m.group();
int v = Integer.valueOf(group);
m.appendReplacement(sb, AF09[v]);
}
return m.appendTail(sb).toString();
} catch (Exception e) {
e.printStackTrace();
Log.d(TAG, "toAFStr: e = " + e.getMessage(), e);
return value;
}
}
/**
* 纯数字文本请使用这个方法 自带String.format可以根据语音自动转换
* @param value
* @return
*/
public static String toIntAFStr(String value) {
String locale = Locale.getDefault().toString();
Log.d(TAG, "toIntAFStr: value = " + value + ", locale = " + locale);
//这里是判断语言是否为波斯语 不是则不做转换
if (TextUtils.isEmpty(value) || !"fa_AF".equals(locale)) {
return value;
}
try {
int v = Integer.valueOf(value);
return String.format(Locale.getDefault(), "%d", v);
} catch (Exception e) {
e.printStackTrace();
Log.d(TAG, "toIntAFStr: e = " + e.getMessage(), e);
return value;
}
}
}
结尾
波斯语在使用append中会出现字符串反转,所以左右都有拼接unicode,这里感谢[bug修复方案分享]阿拉伯文导致TextView显示顺序左右颠倒
字符串替换方法感谢Java如何使用正则表达式实现替换文本功能