转换为阿拉伯数字时,ArrayIndexOutOfBoundsException中断

时间:2016-01-02 14:52:27

标签: java android

我正在尝试将给定字符串中的英文数字转换为阿拉伯数字。除非给定的字符串(来自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,我会跳过转换,否则转换。

任何想法?

1 个答案:

答案 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]);