Как сделать прописными буквами первое слово DateComponentsFormatter.string (from :)? - PullRequest
0 голосов
/ 10 октября 2018

В моем проекте iOS у меня есть функция для преобразования целочисленного значения в строку с постфиксом «секунд»:

func secondsToString(_ seconds: Int) -> String {    
    let formatter = DateComponentsFormatter()
    formatter.unitsStyle = .full
    formatter.allowedUnits = [.second]
    return formatter.string(from: DateComponents(second: seconds)) ?? ""
}

И вот как я это называю:

print(secondsToString(10)) // Output is "10 seconds"
print(secondsToString(1)) // Output is "1 second"

Однако мне нужно сделать первое слово результата secondsToString прописным, например:

print(secondsToString(10)) // Output is "10 Seconds"
print(secondsToString(1)) // Output is "1 Second"

Как я могу решить эту проблему?Должен ли я изменить какое-либо свойство DateComponentsFormatter?

1 Ответ

0 голосов
/ 10 октября 2018

Просто добавьте .capitalized в конце отформатированной строки.

func secondsToString(_ seconds: Int) -> String {
    let formatter = DateComponentsFormatter()
    formatter.unitsStyle = .full
    formatter.allowedUnits = [.second]
    return formatter.string(from: DateComponents(second: seconds))?.capitalized ?? ""
}

Примечание: В этом решении будут использованы все слова, возвращаемые методом.Для вашего случая использования этого должно быть достаточно, потому что даже если вы добавите больше единиц времени, если бы я их использовал с заглавной буквы, я бы предпочел использовать все из них с заглавной буквы.


Итак, если бы вы изменилив некотором роде и хотите, чтобы только первое слово было написано заглавными, вы можете попробовать это: (Первое слово означает первое слово, которое содержит букву)

func secondsToString(_ seconds: Int) -> String {
    let formatter = DateComponentsFormatter()
    formatter.unitsStyle = .full
    formatter.allowedUnits = [.second, .hour, .day]
    let string = formatter.string(from: DateComponents(second: seconds)) ?? ""
    var substrings = string.components(separatedBy: " ")
    // Using for...each would make the iterating element a constant and hence i would have to find the index and replace it using the index
    for i in 0...substrings.count {     
        if let firstCharacter = substrings[i].unicodeScalars.first, CharacterSet.letters.contains(firstCharacter) {
            substrings[i] = substrings[i].capitalized
            break
        }
    }
    let finalString = substrings.joined(separator: " ")
    return finalString
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...