[英]SwiftUI String formatting is rounding my values to nearest whole number?
我希望你们一切都好!
我有一个(可能)愚蠢的问题。 我正在尝试通过重新创建 Instagram UI 来学习 SwiftUI 开发。
现在,我正在处理显示单个用户及其个人资料统计信息的用户页面。 我的字符串格式出现了一些奇怪的行为。
HStack (spacing: 24){
VStack (alignment: .center, spacing: 2) {
Text(postCountString)
.font(.system(size: 16, weight: .bold))
Text("Posts")
.font(.system(size: 13, weight: .regular))
}
VStack (alignment: .center, spacing: 2) {
Text(followerCountString)
.font(.system(size: 16, weight: .bold))
Text("Followers")
.font(.system(size: 13, weight: .regular))
}
VStack (alignment: .center, spacing: 2) {
Text(followsCountString)
.font(.system(size: 16, weight: .bold))
Text("Follows")
.font(.system(size: 13, weight: .regular))
}
}
.frame(maxWidth: .infinity)
.padding(.leading, 16)
.onAppear {
postCountString = UIHelperFunctions.FormatCountNumber(number: creator.posts.count)
followerCountString = UIHelperFunctions.FormatCountNumber(number: creator.followerCount)
followsCountString = UIHelperFunctions.FormatCountNumber(number: creator.followsCount)
}
上面是 View 组件,它显示了创建者的主要统计信息(帖子、关注者、关注者)。 显示视图时,它应该通过我的 UIHelperFunction 运行每个统计信息,将数字格式化为可读的字符串,请参阅 function
import Foundation
class UIHelperFunctions {
static func FormatCountNumber(number: Int) -> String {
guard number > 1000 else {
return String(number)
}
guard number > 10000 else {
return String(format: "%.1fK", Double(number/1000))
}
guard number > 1000000 else {
return String(format: "%dK", number/1000)
}
return String(format: "%.1fM", Double(number/1000000))
}
}
// Example with input: 32495
print(UIHelperFunctions.FormatCountNumber(number: 32495)) // Output: 32K
但是,当我输入一个介于 1000 和 10000 之间的值时,它会返回一个接近值; 但是,它将小数位保留为 0。下图显示了我在输入值6748
时在屏幕上看到的内容。 我希望它是 output 6.7K,但我看到的是 6.0K。
我在做傻事吗? 如果不是,我是否误解了浮点数学在 SwiftUI 中的工作原理?
任何帮助将不胜感激; 如果您需要更多上下文或代码,请告诉我。
提前致谢:)
SwiftUI 为我们进行格式化,并在区域设置更改时自动更新屏幕上的UILabel
,只需执行以下操作:
Text(creator.posts.count, format: .number)
或者
Text("Count: \(creator.posts.count, format: .number)")
为了在未来获得 M、K 等,这应该可以工作(如果这得到批准)
extension NumberFormatter {
static var compact: NumberFormatter = {
let f = NumberFormatter()
f.numberStyle = .compact
return f
}()
}
Text(creator.posts.count, formatter: NumberFormatter.compact)
Int 除以 Int 将是 Int,将其转换为 Double 为时已晚,您需要将 double 除以 double,例如
guard number > 10000 else {
return String(format: "%.1fK", Double(number)/Double(1000)))
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.