Может ли DateComponentsFormatter форматировать доли секунды?

Я хочу напечатать, например, значение 1,5 как "1,5 сек", как это делает временная шкала Safari, и я пытаюсь использовать для него DateComponentsFormatter.

К сожалению, его .allowedUnits сводится только к .second (хотя перечисление имеет .nanosecond). Я пробовал настройку .allowsFractionalUnits = true, но я все еще получаю "0 сек".

Есть ли способ получить дробные секунды из DateComponentsFormatter?

0 ответов

Для стиля позиционных единиц DateComponentsFormatter можно использовать вместе с NumberFormatter чтобы получить строку с учетом локали.

func format(_ seconds: TimeInterval) -> String {
  let components = DateComponentsFormatter()
  components.allowedUnits = [.minute, .second]
  components.allowsFractionalUnits = true // does not work as expected
  components.unitsStyle = .positional
  components.zeroFormattingBehavior = .pad

  let fraction = NumberFormatter()
  fraction.maximumIntegerDigits = 0
  fraction.minimumFractionDigits = 0
  fraction.maximumFractionDigits = 3
  fraction.alwaysShowsDecimalSeparator = false

  let fractionalPart = NSNumber(value: seconds.truncatingRemainder(dividingBy: 1))

  return components.string(from: seconds)! + fraction.string(from: fractionalPart)!
}

print(Locale.current) // ru_RU (current)
print(format(600.5))  // 10:00,5 <- note locale specific decimal separator

К сожалению, использовать этот метод для других стилей дат еще более опасно.

Другие вопросы по тегам