StringIndexOutOfBoundsException после форматирования BigDecimal - PullRequest
0 голосов
/ 26 сентября 2019

Мы получаем следующую ошибку при попытке получить сумму в долларах без центов:

Caused by java.lang.StringIndexOutOfBoundsException length=6; regionStart=0; regionLength=-1

Вот код:

public static String findDollarAmount(@Nullable BigDecimal fullAmount) {
    if (fullAmount == null || fullAmount.compareTo(BigDecimal.ZERO) == 0) {
        return "0";
    }

    DecimalFormat df = new DecimalFormat("#,##0.00;-#,##0.00");

    //This value is returned as some string value that doesn't contain a '.'
    String amountStr = df.format(fullAmount);

    //The crash happens on this line
    return amountStr.substring(0, amountStr.indexOf('.'));
}

Мы не можем распечататьзначения в производстве, и мы не можем воссоздать этот сценарий во время тестирования.Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

3 голосов
/ 26 сентября 2019

Это может быть ваше приложение Язык .Если локаль приложения имеет в качестве своей валюты представление десятичного разделителя «,», как в PT-BR (R $ 1.000,00), то при выполнении будет возникать исключение.Другой пример, в качестве значения Locale для US Locale.setDefault (Locale.US) будет использоваться десятичный разделитель "."как $ 1000,00 и без проблем.

0 голосов
/ 26 сентября 2019

возможно, ваш формат неправильный, в симуляции он возвращает что-то вроде "10,00", и вместо этого вы пытаетесь найти точку ".".Проверьте это, вставив System.out.println(amountStr); перед вторым возвратом, и вы сможете увидеть форматирование строки.Просто так:

10,00

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 5
0 голосов
/ 26 сентября 2019

Может быть связано с этим фактом о методе Java .substring:

Подстрока начинается с указанного beginIndex и продолжается до символа в индексе endIndex - 1 Найдена здесь

Исходя из этого, вам может потребоваться сделать что-то вроде ...

return amountStr.substring(0, amountStr.indexOf('.') - 1);

...