Я просто пытаюсь получить миллисекунды, чтобы отобразить первые две цифры переменной.
То, что я ожидаю работать (сначала я вижу две цифры, затем, когда он увеличивается, я вижу три цифры):
@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.
System.out.printf("%07.3f seconds", (elapsedTime / 1000f));
миллисекунды должны быть %03d
не %02d
.
Если вы хотите, чтобы разрешение было на уровне десятков миллисекунд, вам нужно сделать небольшой "фантастический" расчет.
return String.format("%2d.%02d seconds", seconds, milliSeconds / 10);
Long
но это работает:return String.format("%.2f seconds", (float)elapsedTime / 1000f);
1000
будет определять его как число сfloat
, также естьd
иl
дляdouble
иlong
.