Все еще нашел решение только с one PeriodFormatter
, но выполнил небольшую работу вне Joda-Time.
Идея состоит в том, чтобы
- Создание необработанной форматированной строки, например, «000d 00:00» с Joda-Time и
- удалить ненужные ведущие нули отдельно
с
object JodaTest {
import org.joda.time._
import format._
// "000d 00:00" - 3 day digits for periods with up to 999 days long
private val pdf = new PeriodFormatter(new PeriodFormatterBuilder()
.printZeroAlways
.minimumPrintedDigits(3).appendDays.appendSeparator("d ")
.minimumPrintedDigits(2).appendHours.appendSeparator(":").appendMinutes
.toPrinter, null)
private def adjust(rawstr: String): String = {
// "000d 00:00" => ("000d 0", "0:00")
val (first, second) = rawstr splitAt 6
// remove unwanted leading zeros in first part, keep it in second
first.dropWhile(c => !c.isDigit || c == '0') + second
}
def durstr(duration: Long): String = {
// PeriodType.dayTime => day is the most significant field (no weeks etc.)
adjust(pdf.print(new Period(duration) normalizedStandard PeriodType.dayTime))
}
}
, что приводит к
duration => rawstr => adjust
0 => "000d 00:00" => "0:00"
2700000 => "000d 00:45" => "0:45"
4980000 => "000d 01:23" => "1:23"
43500000 => "000d 12:05" => "12:05"
104940000 => "001d 05:09" => "1d 05:09"
518760000 => "006d 00:06" => "6d 00:06"
605220000 => "007d 00:07" => "7d 00:07"
951060000 => "011d 00:11" => "11d 00:11"
43230000000 => "500d 08:20" => "500d 08:20"
Конечно, было бы неплохо создавать такие форматы напрямую с помощью Joda-Time, указав шаблон, такой как числовой формат Excel (#, ## 0,00 #), в котором указывается, где всегда нужны нули или только при необходимости. Но, похоже, неясно, как определить его точно, потому что у вас есть не только '0' и '#', но вам нужны символы для каждого поля и вставка литералов в строку формата (возможно, через экранирование), тоже было бы неплохо.