如何在 Swift 中创建货币符号的 unicode 值数组


Unicode values are:
U+20A0 to U+20AF

所有这些值都表示货币符号。查看以下链接以供参考:https://en.wikipedia.org/wiki/Currency_Symbols_(Unicode_block)

在 swift 中,我可以使用以下代码打印与 unicode 关联的货币符号:

let rupee = "u{20B9}"    //Its currency symbol "₹"

我的goel是在表格中显示所有货币符号,为此,我想创建一个Unicode值数组,其范围我上面已经提到过。我使用以下代码创建了一个数组,但是在创建unicode的步骤中存在问题:

var unicodeArray:[String] = [String]()
for var decNumber=0; decNumber < 16; decNumber++ {
    let hexVal = String(decNumber, radix: 16)
    let unicode = "{20A(hexVal)}"  \u is missing in the string, writing u gives error"
    unicodeArray.append(unicode)
}
在 for 循环之后,数组的值将介于 {20A0} 到 {20AF}

之间,但我需要从"\u{20A0}"到"\u{20AF}"的值。我该如何解决这个问题。或者有没有其他方法可以做我正在尝试的事情?

已编辑:根据建议使用 swift 样式循环@Grimxn

试试这个:

var unicodeArray:[String] = [String]()
for decNumber in 0..<16 {
    let hexVal = String(decNumber, radix: 16)
    let integer = Int(strtoul("20A(hexVal)", nil, 16))
    let unicode = UnicodeScalar(integer)
    unicodeArray.append(String(unicode))
}

基本上,它将十六进制值准备为Int。然后UnicodeScalar将它们转换为 unicode。然后您可以将其转换为String

在 Swift 5 中,您可以使用以下 Playground 示例代码来获取货币符号 Unicode 块中定义的所有货币符号的数组:

//1.
let scalarRange: ClosedRange<Unicode.Scalar> = "u{20A0}" ... "u{20BF}"
//2.
let scalarValueRange = scalarRange.lowerBound.value ... scalarRange.upperBound.value
//3.
let currencySymbolArray = scalarValueRange.compactMap({ (scalarValue: UInt32) -> String? in
    guard let scalar = Unicode.Scalar(scalarValue) else { return nil }
    return String(scalar)
})
print(currencySymbolArray)
/*
 prints: ["₠", "₡", "₢", "₣", "₤", "₥", "₦", "₧", "₨", "₩", "₪", "₫", "€", "₭", "₮", "₯", "₰", "₱", "₲", "₳", "₴", "₵", "₶", "₷", "₸", "₹", "₺", "₻", "₼", "₽", "₾", "₿"]
 */
  1. 首先创建一系列与货币符号的代码点匹配的 Unicode 标量。
  2. 由于第一个范围不可跨步(您无法对其进行迭代),因此请使用 Unicode.Scalarvalue property 将其转换为一系列 Unicode 标量数字表示形式。
  3. 遍历您的范围,以便从每个 Unicode 标量数字表示形式创建一个String,以便您可以获得货币符号数组。

如果需要,以下代码使用 Unicode.Scalarescaped(asASCII:)来获取表示为 ASCII 转义数值的货币符号数组:

let scalarRange: ClosedRange<Unicode.Scalar> = "u{20A0}" ... "u{20BF}"
let scalarValueRange = scalarRange.lowerBound.value ... scalarRange.upperBound.value
let currencySymbolArray = scalarValueRange.compactMap({ (scalarValue: UInt32) -> String? in
    guard let scalar = Unicode.Scalar(scalarValue) else { return nil}
    let ascii = scalar.escaped(asASCII: true)
    return ascii
})
print(currencySymbolArray)
/*
 prints: ["\u{20A0}", "\u{20A1}", "\u{20A2}", "\u{20A3}", "\u{20A4}", "\u{20A5}", "\u{20A6}", "\u{20A7}", "\u{20A8}", "\u{20A9}", "\u{20AA}", "\u{20AB}", "\u{20AC}", "\u{20AD}", "\u{20AE}", "\u{20AF}", "\u{20B0}", "\u{20B1}", "\u{20B2}", "\u{20B3}", "\u{20B4}", "\u{20B5}", "\u{20B6}", "\u{20B7}", "\u{20B8}", "\u{20B9}", "\u{20BA}", "\u{20BB}", "\u{20BC}", "\u{20BD}", "\u{20BE}", "\u{20BF}"]
 */

或者,您可以使用 Stringinit(_:radix:uppercase:)将标量值转换为十六进制值:

let scalarRange: ClosedRange<Unicode.Scalar> = "u{20A0}" ... "u{20BF}"
let scalarValueRange = scalarRange.lowerBound.value ... scalarRange.upperBound.value
let currencySymbolArray = scalarValueRange.map({ (scalarValue: UInt32) -> String in
    return String(scalarValue, radix: 16, uppercase: true)
})
print(currencySymbolArray)
/*
 prints: ["20A0", "20A1", "20A2", "20A3", "20A4", "20A5", "20A6", "20A7", "20A8", "20A9", "20AA", "20AB", "20AC", "20AD", "20AE", "20AF", "20B0", "20B1", "20B2", "20B3", "20B4", "20B5", "20B6", "20B7", "20B8", "20B9", "20BA", "20BB", "20BC", "20BD", "20BE", "20BF"]
 */

最新更新