基于 3 个 int 值显示字符串
Displaying String based on 3 int values
我正在尝试以这种格式显示字符串
x day, y hr, z min
其中 x、y、z 是来自用户的 Int 值,如果 day 和 hr 为 0,则用户需要至少在 5 分钟内发送。
这是我处理显示用户输入的函数
func pickerTimeShow(day: Int, hour: Int, minutes: Int) -> String {
if day > 0 {
return "\(day) day, \(hour) hr, \(minutes) min"
}
if hour > 0 {
return "\(hour) hr, \(minutes) min"
}
return "\(minutes) min"
}
但是,如果用户发送 pickerTimeShow(day: 0, hour: 2, minutes: 0),我的字符串将显示
2 hr, 0 min
这不是主意,因为它应该只显示
2 hr
此外,如果用户发送 pickerTimeShow(day: 5, hour: 0, minutes: 5),我的字符串将显示
5 day, 0 hr, 5 min
但我只想
5 day, 5 min
您有处理这种情况的简单解决方案吗?除了添加更多 if 语句来检查是什么让我的函数变得很长之外,我真的想不出还有什么。非常感谢。
这是一种方法。将碎片放入一个数组中,然后在最后加入它们:
func pickerTimeShow(day: Int, hour: Int, minutes: Int) -> String {
var result = [String]()
if day > 0 {
result.append("\(day) day")
}
if hour > 0 {
result.append("\(hour) hr")
}
if minutes > 0 {
result.append("\(minutes) min")
}
if result.isEmpty {
// decide what to return in the case that all are zero
return "0 min"
} else {
return result.joined(separator: ", ")
}
}
测试:
pickerTimeShow(day: 0, hour: 0, minutes: 0) // "0 min"
pickerTimeShow(day: 5, hour: 0, minutes: 0) // "5 day"
pickerTimeShow(day: 0, hour: 6, minutes: 0) // "6 hr"
pickerTimeShow(day: 0, hour: 0, minutes: 7) // "7 min"
pickerTimeShow(day: 5, hour: 6, minutes: 0) // "5 day, 6 hr"
pickerTimeShow(day: 0, hour: 6, minutes: 7) // "6 hr, 7 min"
pickerTimeShow(day: 5, hour: 0, minutes: 7) // "5 day, 7 min"
pickerTimeShow(day: 5, hour: 6, minutes: 7) // "5 day, 6 hr, 7 min"
或者 – 如果您可以接受 5 days
而不是 5 day
– 这是使用 DateComponentsFormatter
的解决方案
func pickerTimeShow(day: Int, hour: Int, minutes: Int) -> String? {
let dateComponents = DateComponents(day: day, hour: hour, minute: minutes)
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .short
formatter.allowedUnits = [.day, .hour, .minute]
return formatter.string(from: dateComponents)
}
函数returns nil
如果输入乱序。
我正在尝试以这种格式显示字符串
x day, y hr, z min
其中 x、y、z 是来自用户的 Int 值,如果 day 和 hr 为 0,则用户需要至少在 5 分钟内发送。
这是我处理显示用户输入的函数
func pickerTimeShow(day: Int, hour: Int, minutes: Int) -> String {
if day > 0 {
return "\(day) day, \(hour) hr, \(minutes) min"
}
if hour > 0 {
return "\(hour) hr, \(minutes) min"
}
return "\(minutes) min"
}
但是,如果用户发送 pickerTimeShow(day: 0, hour: 2, minutes: 0),我的字符串将显示
2 hr, 0 min
这不是主意,因为它应该只显示
2 hr
此外,如果用户发送 pickerTimeShow(day: 5, hour: 0, minutes: 5),我的字符串将显示
5 day, 0 hr, 5 min
但我只想
5 day, 5 min
您有处理这种情况的简单解决方案吗?除了添加更多 if 语句来检查是什么让我的函数变得很长之外,我真的想不出还有什么。非常感谢。
这是一种方法。将碎片放入一个数组中,然后在最后加入它们:
func pickerTimeShow(day: Int, hour: Int, minutes: Int) -> String {
var result = [String]()
if day > 0 {
result.append("\(day) day")
}
if hour > 0 {
result.append("\(hour) hr")
}
if minutes > 0 {
result.append("\(minutes) min")
}
if result.isEmpty {
// decide what to return in the case that all are zero
return "0 min"
} else {
return result.joined(separator: ", ")
}
}
测试:
pickerTimeShow(day: 0, hour: 0, minutes: 0) // "0 min"
pickerTimeShow(day: 5, hour: 0, minutes: 0) // "5 day"
pickerTimeShow(day: 0, hour: 6, minutes: 0) // "6 hr"
pickerTimeShow(day: 0, hour: 0, minutes: 7) // "7 min"
pickerTimeShow(day: 5, hour: 6, minutes: 0) // "5 day, 6 hr"
pickerTimeShow(day: 0, hour: 6, minutes: 7) // "6 hr, 7 min"
pickerTimeShow(day: 5, hour: 0, minutes: 7) // "5 day, 7 min"
pickerTimeShow(day: 5, hour: 6, minutes: 7) // "5 day, 6 hr, 7 min"
或者 – 如果您可以接受 5 days
而不是 5 day
– 这是使用 DateComponentsFormatter
func pickerTimeShow(day: Int, hour: Int, minutes: Int) -> String? {
let dateComponents = DateComponents(day: day, hour: hour, minute: minutes)
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .short
formatter.allowedUnits = [.day, .hour, .minute]
return formatter.string(from: dateComponents)
}
函数returns nil
如果输入乱序。