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

时间:2016-02-10 07:48:13

标签: ios 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}之间,但我需要来自&#34; \ u {20A0}&#34;的值。到&#34; \ u {20AF}&#34;。我怎样才能解决这个问题。或者还有其他方法可以做我正在尝试的事情吗?

2 个答案:

答案 0 :(得分:2)

编辑:根据建议使用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

答案 1 :(得分:0)

在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.Scalar的{​​{3}} property将其转换为Unicode标量数字表示形式的范围。 / li>
  3. 遍历您的范围,以便从每个Unicode标量数字表示形式创建一个String,以便您可以获取货币符号数组。

如果需要,以下代码使用Unicode.Scalar的{​​{3}}来获取表示为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}"]
 */

或者,您可以使用String的{​​{3}}将标量值转换为十六进制值:

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"]
 */