SwiftUI Text - 如何将 10^12 转换为 10 的正确格式 [重复]
Posted
技术标签:
【中文标题】SwiftUI Text - 如何将 10^12 转换为 10 的正确格式 [重复]【英文标题】:SwiftUI Text - How to convert 10^12 to 10 the correct format [duplicate] 【发布时间】:2020-11-28 18:24:22 【问题描述】:我正在从文本文件中读取行并将这些行显示在 Text 元素上。
我可能有科学记数法元素,比如
10^12
10^9
等等……
我需要将其显示为
这些数字在短语的中间,比如..
The universe has 10^12 bla bla bla
我该怎么做?
我没有显示代码,因为我对此一无所知。
谢谢
【问题讨论】:
这是否回答了您的问题***.com/a/60232789/12299030? (当然你需要先解析字符串找到需要的模式,然后再加入文本组件)。 【参考方案1】:这种事情在 SwiftUI 中要容易得多,在 SwiftUI 中有很多方法可以完成这项工作,其中一种可能是下面的代码:
struct ContentView: View
@State var yourFirstText: String = "The universe has "
@State var yourLastText: String = " bla bla bla"
var body: some View
Text(yourFirstText) + Text("10") + Text("12").font(Font.footnote).baselineOffset(6.0) + Text(yourLastText)
【讨论】:
这需要 OP 手动解析文本 @LeoDabus,嗨,Leo,您的意思是定义一些 Var 或函数来获取文本或数字?如果是这样,如果你认为有必要,可以这样做 我的意思是一个正则表达式来查找范围并正确格式化文本。没那么简单 类似这个帖子How do you set a currency label to show smaller font size for cents【参考方案2】:您需要首先创建一个正则表达式来查找由^
字符(\d+)(\^)(\d+)
分隔的一些数字。然后,您需要获取第一个匹配项的第四个范围并更改其基线偏移量。然后得到第三个范围删除它的字符:
import SwiftUI
struct ContentView: View
@ObservedObject private var bindingManager = TextBindingManager(string: "The universe has 10^12 bla bla bla")
var body: some View
VStack(alignment: .leading)
AttributedLabel(attributedString: bindingManager.attributedString)
struct ContentView_Previews: PreviewProvider
static var previews: some View
ContentView()
struct AttributedLabel: UIViewRepresentable
let attributedString: NSAttributedString
func makeUIView(context: UIViewRepresentableContext<Self>) -> UILabel
let label = UILabel()
DispatchQueue.main.async label.attributedText = attributedString
return label
func updateUIView(_ uiView: UILabel, context: Context)
DispatchQueue.main.async uiView.attributedText = attributedString
class TextBindingManager: ObservableObject
@Published var string: String
var attributedString: NSAttributedString
let mutableAttributedString = NSMutableAttributedString(string: string)
if let matches = try! NSRegularExpression(pattern: #"(\d+)(\^)(\d+)"#)
.matches(in: string,
range: .init(string.startIndex...,
in: string)).first
if matches.numberOfRanges == 4
mutableAttributedString.setAttributes([.font: UIFont.systemFont(ofSize: 10),.baselineOffset: 10],
range: matches.range(at: 3))
mutableAttributedString.deleteCharacters(in: matches.range(at: 2))
return mutableAttributedString
init(string: String) self.string = string
【讨论】:
【参考方案3】:使用NSAttributedString
的替代解决方案
除了使用多个 Text
组合之外,您可以只使用一个组合并使用 NSAttributedString
组合文本本身
let font: UIFont = .systemFont(ofSize: 17)
let text = NSMutableAttributedString(
string:"1012", attributes: [.font : font]
)
text.setAttributes(
[.baselineOffset: 10, .font : font.withSize(10)],
range: NSRange(location: 2, length: 2)
)
然后简单地将attributedString
分配给您的UILabel
yourLabel.attributedText = text
由于此答案不适用于 SwiftUI Text
组件,请查看 this answer 以了解如何在您的 SwiftUI 视图中使用 UIKit UILabel
。
【讨论】:
@Ronnie:取决于选择的编码平台,UIKit 可能会出现像这样的多重答案,但未来属于 SwiftUI,如果你想投入时间,就从 SwiftUI 开始。 我们不要让它成为 SwiftUI 和 UIKit,因为两者都是伟大的技术,争论哪个更好会适得其反。我只是为发布的第一个答案提供替代解决方案,不仅针对 OP,而且针对将来发现此问题的任何人。 @witek:我 100% 同意你的观点,很高兴我们能在 SwiftUI 和 UIKit 中找到答案!干得好!以上是关于SwiftUI Text - 如何将 10^12 转换为 10 的正确格式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章