gpt4 book ai didi

arrays - 有没有更好的方法在 Swift textView 中对齐这列数字?

转载 作者:行者123 更新时间:2023-11-28 12:30:41 24 4
gpt4 key购买 nike

我需要通过显示一列小数和小数并对齐它们来格式化 textView 中的一列数字,以便小数点或正斜杠字符出现在同一列中,如下所示......

    x      1/1
1 76.04900
x 193.15686
x 310.26471
4 5/4
x 503.42157
6 579.47057
x 696.57843
x 25/16
9 889.73529
x 1006.84314
11 1082.89214

这在 Swift 中是通过插入适当数量的前导空白字符并使用左对齐和每个字符的列宽相同的字体来实现的。

要计算空格数,将余数或被除数中的字符从每个数字的字符总数中排除。这个简单的任务涉及从 .count 中减去 .index(of:) 并且由于 .index(of:) 返回一个可选的 Array.Index? 不是 Int?

我怀疑可能有一种更简单的方法来实现相同的结果,并欢迎对 下面 的 Swift 代码进行任何改进,这可能会使必须维护它的人的生活更轻松。代码是从我的项目中提取出来的,并且已经在 Playground 中进行了测试。

注意。 textMessage 是一个字符串。目前显示在Debug区。它最终会显示在 textView 中。

//: Playground

import UIKit

var tuningArray = ["1/1", "76.04900", "193.15686", "310.26471", "5/4", "503.42157", "579.47057", "696.57843", "25/16", "889.73529", "1006.84314", "1082.89214"]
var keyArray = ["x", "1", "x", "x", "4", "x", "6", "x", "x", "9", "x", "11"]

var characterCountArray = [Int]()
var scaleSize = Int()
var textMessage = String()



func formatTextMessage() {
var formattedTextArray = [String](repeating: "", count: scaleSize)

for i in 0..<scaleSize {
let element = tuningArray[i]
countNumericCharactersBeforeDotOrSlash (s: element)
}

let largestStringSize = characterCountArray.reduce(Int.min, { max($0, $1) })

for i in 0..<scaleSize {

let thisStringSize = characterCountArray[i]
let blanks = largestStringSize - thisStringSize
let filler = insertWhiteSpace(count: blanks)

formattedTextArray[i].append("\t" + keyArray[i] + "\t" + filler + tuningArray[i] + "\n")
textMessage += formattedTextArray[i]
}
print(textMessage)
}



func insertWhiteSpace(count: Int) -> String {
var filler = ""
for _ in 0..<count {
filler = filler + " "
}
return filler
}



func countNumericCharactersBeforeDotOrSlash (s: String) {

let fractionalNumber = findFractionalNumber(s: s)
let decimalNumber = findDecimalNumber(s: s)
var thisStringSize = 0

if !fractionalNumber && !decimalNumber {
print("Error: invalid number format")
}

if fractionalNumber == true {

let pitchStringArray = Array(s.characters)
let endIndex = pitchStringArray.count

if let slashIndex = pitchStringArray.index(of: "/") {
let dividendFiller = endIndex - slashIndex
thisStringSize = s.characters.count - dividendFiller
}

} else {

if decimalNumber == true {

let pitchStringArray = Array(s.characters)
let endIndex = pitchStringArray.count

if let dotIndex = pitchStringArray.index(of: ".") {
let remainderFiller = endIndex - dotIndex
thisStringSize = s.characters.count - remainderFiller
}
}
}
characterCountArray.append(thisStringSize)
}



func findDecimalNumber(s: String?) -> Bool {
if (s?.contains(".")) == true {
return true
}
return false
}



func findFractionalNumber(s: String?) -> Bool {
if (s?.contains("/")) == true {
return true
}
return false
}



scaleSize = tuningArray.count
formatTextMessage()

最佳答案

您可以使用带有自定义制表位的属性文本,如本例所示:

import UIKit
import PlaygroundSupport


var tuningArray = ["1/1", "76.04900", "193.15686", "310.26471", "5/4", "503.42157", "579.47057", "696.57843", "25/16", "889.73529", "1006.84314", "1082.89214"]

var keyArray = ["x", "1", "x", "x", "4", "x", "6", "x", "x", "9", "x", "11"]
let scaleSize = tuningArray.count
var textMessage = ""

for i in 0..<scaleSize {
var textLine = "\t" + keyArray[i] + "\t" + tuningArray[i] + "\n"
textMessage += textLine
}

let paragraphStyle = NSMutableParagraphStyle()
let decimalTerminators:CharacterSet = [".", "/"]
let decimalTabOptions = [NSTabColumnTerminatorsAttributeName:decimalTerminators]
let decimalTabLocation = CGFloat(100) // TODO: Calculate...
var decimalTab = NSTextTab(textAlignment: .natural, location: decimalTabLocation, options: decimalTabOptions)
var leftTab = NSTextTab(textAlignment: .left, location: CGFloat(0.01), options: [:])
paragraphStyle.tabStops = [leftTab, decimalTab]

var a = NSAttributedString(string:textMessage,attributes: [NSParagraphStyleAttributeName: paragraphStyle])

let tv = UITextView(frame:CGRect(x:0, y:0, width:400, height:200))
tv.attributedText = a
PlaygroundPage.current.liveView = tv

唯一的缺点是,您必须以某种方式计算小数制表符的位置;在示例中,我只是使用 CGFloat(100) 来获得一个不错的值。但也许您可以简单地接受这样的常量。

Screenshot

关于arrays - 有没有更好的方法在 Swift textView 中对齐这列数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42150492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com