IntSummaryStatistics возвращает результат с разделителем-запятой, хотя это не относится ко всем другим типам типа double или float. - PullRequest
0 голосов
/ 12 сентября 2018

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

IntSummaryStatistics ageSummary =
    persons
      .stream()
      .collect(Collectors.summarizingInt(p -> p.age));

System.out.println(ageSummary);
// IntSummaryStatistics{count=4, sum=76, min=12, average=19,000000, max=23}

Среднее значение - это разделенный запятыми двойной символ, это первый раз, когда я получаю запятую с разделением запятой в Java Во всех остальных случаях я получаю точку, разделенную вдвое. Например:

System.out.println(1.0); // 1.0

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

-Duser.country=US -Duser.language=en

Ничего не изменилось. Что может быть причиной? Думаю, тот факт, что я живу в Бельгии, не должен влиять на JVM или нет? Спасибо.

Edit:

Ниже я добавил методы класса toString () и getAverage (). И уже выяснилось, что это класс в JDK.

    public String toString() {
    return String.format(
        "%s{count=%d, sum=%d, min=%d, average=%f, max=%d}",
        this.getClass().getSimpleName(),
        getCount(),
        getSum(),
        getMin(),
        getAverage(),
        getMax());
}

public final double getAverage() {
    return getCount() > 0 ? (double) getSum() / getCount() : 0.0d;
}

Ссылка на Javadoc.

И теперь я понял, что если я печатаю с String.format("%f", 1.0), я также получаю разделитель запятых. Никогда раньше этого не видел, я, наверное, смотрел на это раньше.

Редактировать 2: jdk1.8.0_181 - это моя версия JDK.

1 Ответ

0 голосов
/ 13 сентября 2018

Рассмотрим

System.out.println(5.0);         // 1
System.out.printf("%f%n", 5.0);  // 2

Строка 1 проходит через PrintStream, который указан для выполнения преобразования с использованием Double.valueOf, который, в свою очередь, предназначен для использования Double.toString(double). Это преобразует двойное значение в строку, используя фиксированный формат, который не зависит от локали.

В отличие от этого, в строке 2 используется String.format, которая выполняет преобразование для конкретного языка. Очевидно, что в вашей локали есть что-то, что указывает запятую в качестве десятичного разделителя.

Обратите внимание, что локаль богаче, чем просто "en_US" (язык и страна). JDK может получать информацию из среды рабочего стола. По крайней мере, на Mac и Windows можно применить несколько отдельных настроек форматирования. (Я не думал, что JDK подобрал их до более поздних выпусков, но некоторые могли бы сделать это в 8u181.) Также проверьте значение Locale.getDefault(Locale.Category.FORMAT)). Тот факт, что вы находитесь в Бельгии, а не в США, имеет большое значение. Возможно, вы сделали настройку в панели управления интернационализацией вашей системы, чтобы заставить некоторое числовое форматирование работать должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...