Новый BigDecimal("0") NumberFormatException

У меня странная проблема с BigDecimal.

У меня есть метод разбора следующим образом:

protected BigDecimal parseBigDecimalFromText(String text) {
    Logger.info("parseBigDecimalFromText("+text+")");
    return new BigDecimal(text);
}

Теперь, когда я запускаю тест, код работает правильно.

@Test
public void parseBigDecimalFromZero() {
    Logger.createLogger();

    // given
    String text = "0";

    // when
    BigDecimal bigDecimal = basicPage.parseBigDecimalFromText(text);

    // then
    Assert.assertEquals(new BigDecimal("0"), bigDecimal);
}

Но когда я выполняю свое приложение, передающее точно такую ​​же строку "0", я получаю "java.lang.NumberFormatException"

Ниже приведен журнал:

2014-11-05 23:21:33.142: INFO - parseBigDecimalFromText(0) 
2014-11-05 23:21:33.142: SEVERE - null 
java.lang.NumberFormatException
    at java.math.BigDecimal.<init>(BigDecimal.java:470)
    at java.math.BigDecimal.<init>(BigDecimal.java:739)
    at com.aa.travian.pages.BasicPage.parseBigDecimalFromText(BasicPage.java:121)

Я знаю, что когда мое приложение запускается, я устанавливаю конкретную локаль:

Locale locale = getConfig().getLocale();
ResourceBundle = ResourceBundle.getBundle("translations", locale);

но я не вижу, как это должно сломать мой метод parseBigDecimalFromText.

Ниже моя версия Java:

java -versionjava version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.2) (7u65-2.5.2-3~14.04)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

Есть идеи, что здесь происходит? Глядя на исходный код BigDecimal, он выглядит так, как будто он падает при анализе экспоненты:

// exponent expected
if ((c != 'e') && (c != 'E'))
    throw new NumberFormatException();

Спасибо заранее за ваше время.

1 ответ

Решение

Вы не можете записать строковую переменную, чтобы проверить ее содержимое, потому что много разных строк не различимы визуально.

Вместо этого обрабатывайте все ваши строки как двоичные данные. Сделайте шестнадцатеричный дамп и сравните это.

Вот один из способов воспроизвести ваш вывод и проблему:

$ cat Test.java
import java.util.regex.*;
import java.util.logging.*;
import java.math.*;

class Test {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger("test");
        String text = "0\0";
        logger.info("parseBigDecimalFromText("+text+")");
        new BigDecimal(text);
    }
}

$ javac Test.java
$ java Test
Nov 06, 2014 12:55:40 AM Test main
INFO: parseBigDecimalFromText(0)
Exception in thread "main" java.lang.NumberFormatException
        at java.math.BigDecimal.<init>(BigDecimal.java:470)
        at java.math.BigDecimal.<init>(BigDecimal.java:739)
        at Test.main(Test.java:10)
$
Другие вопросы по тегам