Java: Почему String.format () не работает с этой переменной Long?

1

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

То, что я ожидаю работать (сначала я вижу две цифры, затем, когда он увеличивается, я вижу три цифры):

@Override
public String toString() {
    Long milliSeconds = TimeUnit.MILLISECONDS.toMillis(elapsedTime) % 1000;
    Long seconds = (TimeUnit.MILLISECONDS.toSeconds(elapsedTime));
    return String.format("%2d.%02d seconds", seconds, milliSeconds);
}

Что на самом деле работает:

@Override
public String toString() {
    String milliSeconds = String.format("%02d",
            TimeUnit.MILLISECONDS.toMillis(elapsedTime) % 1000).substring(0, 2);
    Long seconds = (TimeUnit.MILLISECONDS.toSeconds(elapsedTime));
    return String.format("%2d.%s seconds", seconds, milliSeconds);
}

Или:

@Override
public String toString() {
    double milliSeconds = (double)(TimeUnit.MILLISECONDS.toMillis(elapsedTime) % 1000) / 1000;
    Long seconds = (TimeUnit.MILLISECONDS.toSeconds(elapsedTime));
    return String.format("%.2f seconds", seconds + milliSeconds);
}

Я предполагаю, что мой первый вопрос - это либо мои решения, которые работают более ресурсоемкими, чем тот, который этого не делает? А во-вторых, что я делаю неправильно в первом решении? Я ожидал бы, что %02d возьмет длинный и %02d его до двух цифр, буферизованных с помощью 0. Вместо этого я вижу две цифры плюс конечный 0.

Теги:

2 ответа

2
Лучший ответ
System.out.printf("%07.3f seconds", (elapsedTime / 1000f));
  • 0
    Спасибо, elapsedTime был Long но это работает: return String.format("%.2f seconds", (float)elapsedTime / 1000f);
  • 0
    Если один из операндов является плавающей точкой, а другой - целым числом, то результатом будет плавающая точка. Литерал на 1000 будет определять его как число с float , также есть d и l для double и long .
2

миллисекунды должны быть %03d не %02d.

Если вы хотите, чтобы разрешение было на уровне десятков миллисекунд, вам нужно сделать небольшой "фантастический" расчет.

return String.format("%2d.%02d seconds", seconds, milliSeconds / 10);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню