我正在尝试将给定字符串中的英文数字转换为阿拉伯数字。除非给定的字符串(来自Web服务)包含阿拉伯数字而不是英语,否则它的工作正常。因为我得到以下错误:
java.lang.ArrayIndexOutOfBoundsException:length = 10;指数= 1586
我使用以下函数执行转换任务:
public static String convertToArabicDigits(String str) {
char[] arrayOfChar = {1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641};
if ((str != null)|| (!str.isEmpty())) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
if (Character.isDigit(str.charAt(i))) {
builder.append(arrayOfChar[(int) (str.charAt(i)) - 48]);
} else {
builder.append(str.charAt(i));
}
}
return builder.toString();
}
else return "";
}
如果字符串包含阿拉伯数字,则会发生这种情况:
الأقثرطلباالتيسيحرممنهاالعالمالعربيفيالعام2016
但如上所述,如果字符串包含英文数字,则转换功能正常
你可以帮忙吗?الأقثرطلباالتيسيحرممنهاالعالمالعربيفيالعام2016
修改
我想如果(str.charAt(i)))
退出arrayOfChar
,我会跳过转换,否则转换。
任何想法?
答案 0 :(得分:1)
异常很明显,从1586
生成的索引(int) (str.charAt(i)) - 48]
作为索引是错误的,因此您必须将其更改为适合您的数组长度,但这个问题是因为条件{ {1}}如果char是阿拉伯数字或英文数字,它将返回true。
所以你必须改变这个条件:
Character.isDigit(str.charAt(i)
要:
if (Character.isDigit(str.charAt(i))) {
在arrayOfChar附近添加以下行:
if (isContains(englishDigits, str.charAt(i))) {
所以即使你像34345那样传递字符串,该方法也会返回34345
isContains是检查char是否在char数组中的方法。
// EDIT
char[] englishDigits= {48, 49, 50, 51, 52, 53, 54, 55, 56, 57};
但最好使用一些库来执行它,如commons.apache ArrayUtils.contains
//编辑2
我认为通过替换这些行来转换而不使用数组更好:
public static boolean isContains (char[] arr, char c) {
for (int i=0; i<arr.length; i++) {
if (arr[i] == c) {
return true;
}
}
return false;
}
使用:
if (isContains(englishDigits, str.charAt(i))) {
builder.append(arrayOfChar[(int) (str.charAt(i)) - 48]);