2

我正在为我们的货币处理代码的一些帮助函数编写一些测试,特别是与我们相关的语言环境的不同货币格式的格式。

这是复制相同行为的最小示例:

let positiveCurrencyValue = Decimal(string: "250.00")!
let negativeCurrencyValue = Decimal(string: "-250.00")!

let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "nb_NO")
formatter.numberStyle = .currency
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2

let positiveString = formatter.string(from: positiveCurrencyValue as NSNumber)!

if positiveString == "kr 250,00" {
    print("Positives are equal")
} else {
    print("Positives are NOT equal! \"\(positiveString)\" != \"kr 250,00\"")
}

formatter.locale = Locale(identifier: "sv_SE")

let negativeString = formatter.string(from: negativeCurrencyValue as NSNumber)!

if negativeString == "-250,00 kr" {
    print("Negatives are equal!")
} else {
    print("Negatives are NOT equal! \"\(negativeString)\" != \"kr -250,00\"")
}

在这两个示例中,我们使用的是挪威语和瑞典语语言环境。我们得到的两个字符串都不匹配预期的字符串,因为预期的字符串最初是在单元测试中编写的。所以这就是我们所期望的。

问题是空白不是实际的空间。当我检查格式化程序返回的字符串的 HEX 值时,我得到以下信息(来自hexed.it, LittleEndian):

"-250,00 kr" in hex (SEK):
\x{E28892}250,00\x{C2A0}kr

甚至“-”在这里也搞砸了。将这行代码添加到 Playground 可以解决这个问题:formatter.negativePrefix = "-".

我不知道如何修复空白。这个问题是由某些字符串编码设置引起的吗?鉴于上面的 HEX 字符串,我认为它根本没有使用 UTF8,但这只是我的猜测。我试图将字符串转换为数据并返回,对数据步骤使用不同的编码,但它没有做任何事情。

4

0 回答 0