NumberFormatter () - pad с указанным c количеством пробелов возможно? - PullRequest
2 голосов
/ 31 января 2020

Я пытаюсь использовать NumberFormatter () для создания строкового представления CGFloats. В идеале я хотел бы создать строку со знаком, например, преобразовав значение

10.1 -> " 10.1" и

-10.1 -> "- 10.1", целая часть дополняется с пробелами.

Это самое близкое, что я получил, но оно содержит целую часть с "0", поэтому я получаю

10.1 -> " 010.1" и

-10.1 to "-010.1"

Если я не использую .minimumIntegerDigits, там нет заполнения.

Я использую моноширинный шрифт для отображения значений, и я пытаюсь убедиться, они не дрожат, когда меняются, и я просто надеялся, что будет какой-то способ использовать пробел вместо 0, но в остальном точно, как работает .minimumIntegerDigits.

extension CGFloat {
   func signedPaddedString() -> String {
      let formatter = NumberFormatter()
      formatter.positivePrefix = " "
      formatter.minimumIntegerDigits = 3
      formatter.paddingCharacter = " "
      formatter.minimumFractionDigits = 1
      formatter.maximumFractionDigits = 1
      return formatter.string(from: self as NSNumber)!
   }
}

1 Ответ

2 голосов
/ 31 января 2020

Этого можно добиться, установив свойства positiveFormat и negativeFormat, которые являются шаблонами форматирования в соответствии с Техническим стандартом Unicode # 35 :

extension FloatingPoint {
    func signedPaddedString() -> String {
        let formatter = NumberFormatter()
        formatter.positiveFormat = " * ##0.0"
        formatter.negativeFormat = "-* ##0.0"
        return formatter.string(for: self)!
    }
}

print((10.1).signedPaddedString())    // "  10.1"
print((-10.1).signedPaddedString())   // "- 10.1"
print((123.45).signedPaddedString())  // " 123.4"
print((-123.45).signedPaddedString()) // "-123.4"
print((0).signedPaddedString())       // "   0.0"
print((-1).signedPaddedString())      // "-  1.0"

Если вы хотите для подавления локализации (например, в странах, использующих десятичную запятую ), затем добавьте

formatter.locale = Locale(identifier: "en_US_POSIX")
...