我正在尝试将给定字符串中的英文数字转换为阿拉伯数字。除非给定的字符串(来自网络服务)包含阿拉伯数字而不是英语,否则效果很好。为此我收到以下错误:
java.lang.ArrayIndexOutOfBoundsException: length=10; index=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
你能帮忙吗?
编辑:
我认为如果 (str.charAt(i)))
存在于 arrayOfChar
中,我应该跳过转换,否则进行转换。
有什么想法吗?
最佳答案
异常(exception)情况很明显,从 (int) (str.charAt(i)) - 48]
生成的索引 1586
是错误的索引,所以你有将其更改为适合您的数组长度,但此问题是因为条件 Character.isDigit(str.charAt(i)
如果 char 是阿拉伯或英文数字,它将返回 true。
所以你必须改变这个条件:
if (Character.isDigit(str.charAt(i))) {
致:
if (isContains(englishDigits, str.charAt(i))) {
并在 arrayOfChar 附近添加以下行:
char[] englishDigits= {48, 49, 50, 51, 52, 53, 54, 55, 56, 57};
因此,即使您传递像 34٣٤٥ 这样的字符串,该方法也会返回٣٤٣٤٥
isContains 是检查 char 是否在 char 数组中的方法。
//编辑
public static boolean isContains (char[] arr, char c) {
for (int i=0; i<arr.length; i++) {
if (arr[i] == c) {
return true;
}
}
return false;
}
但最好使用一些库来做到这一点,例如 commons.apache ArrayUtils.contains
//编辑2
我认为最好通过替换这些行来不使用数组进行转换:
if (isContains(englishDigits, str.charAt(i))) {
builder.append(arrayOfChar[(int) (str.charAt(i)) - 48]);
与:
if (str.charAt(i)>=48 && str.charAt(i)<=48+9) { // english digit
builder.append((char)(str.charAt(i)-48+1632)); // convert from english to arabic digit
关于java - 转换为阿拉伯数字时出现 ArrayIndexOutOfBoundsException 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34567209/