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 的正确格式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何将视图附加到多行文本的结尾?

SwiftUI 全屏图片背景

如何将不在根层次结构中的 SwiftUI 视图呈现为 UIImage?

SwiftUI - 在 VStack 中对齐文本

将 HTML 代码实体传递到 SwiftUI 文本视图

如何在 SwiftUI 中调整 navigationBarTitle 和 Label Text 对齐方式