% s в String.format для чисел - PullRequest
19 голосов
/ 24 октября 2011

Есть ли причина не использовать %s для спецификатора формата при форматировании чисел, если дополнительное форматирование не требуется?

, например

int answer = 42;
String text = String.format("The answer is %s", answer);

, а не как обычно:

int answer = 42;
String text = String.format("The answer is %d", answer);

Причина, по которой я спрашиваю, состоит в том, что я хочу внести некоторые автоматические изменения в исходный код, и было бы неудобно выяснять, является ли тип answer int или String или что-то еще

1 Ответ

34 голосов
/ 24 октября 2011

Я ожидаю, что будет потенциальная разница с точки зрения разделителей тысяч и других опций, зависящих от локали.Первый подход просто вызовет Integer.toString (который не чувствителен к локали), потому что Integer не реализует Formattable.Второй будет использовать потенциально целочисленное форматирование, зависящее от локали - он может вставить тысячи разделителей, потенциально даже использовать другой набор цифр и т. Д.

При более внимательном рассмотрении документов, выглядитПодобные разделители группирования не будут применяться без специального флага форматирования, но:

Алгоритм локализации чисел

После получения цифр для целой части, дробнаяpart и экспонента (в зависимости от типа данных) применяется следующее преобразование:

  • Каждый цифровой символ d в строке заменяется цифрой, специфичной для локали, вычисляемой относительно нуля текущей локалицифра z;то есть d - '0' + z.

Пример, где это имеет значение:

import java.util.Locale;

public class Test {
  public static void main(String[] args) {
    Locale.setDefault(new Locale("hi", "IN"));
    System.out.printf("String: %s; Number: %d\n", 1234, 1234);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...