java - 转换为阿拉伯数字时出现 ArrayIndexOutOfBoundsException 中断

标签 java android

我正在尝试将给定字符串中的英文数字转换为阿拉伯数字。除非给定的字符串(来自网络服务)包含阿拉伯数字而不是英语,否则效果很好。为此我收到以下错误:

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/

相关文章:

java - 如何使用 Gracenote ApI 在 android 中获取歌曲封面艺术?

java - 使用 Java 从 UNIX 时间戳转换为 "Today at: currentTime"

java - Bouncy CasSTLe J2ME加载现有私钥

android - 我可以直接在 android 中播放 .caf 文件吗?

java - 在 Android 应用程序中使用远程 Microsoft Access 数据库

android - Google C2D_MESSAGE 应用程序未定义权限?

java - HttpPost 不适用于生产服务器

java - 我尝试传递给 main 中 Createnewfile 的函数调用时出现字符串错误

java - 如何使用 java swing 在 JButton 上随机显示图像?

android动画向左滑出,向后反转