DRYな備忘録

Don't Repeat Yourself.

【追記】XCTAssertEqualが("foo bar") is not equal to ("foo bar")などと寝ぼけたことを言う【NSNumberFormatter】

問題

("Optional("10,00 €")") is not equal to ("Optional("10,00 €")"

とか言われてXCTAssertEqualがコケる。

f:id:otiai10:20160728224408p:plain

調査

原因

NSNumberFormatter.CurrencyStyleで出力された10,00 €のbyte列

[UInt8]("10,00 €".utf8)
[49, 48, 44, 48, 48, 194, 160, 226, 130, 172]

一方、キーボードから入力した 10,00 €のbyte列

[UInt8]("10,00 €".utf8)
[49, 48, 44, 48, 48, 32, 226, 130, 172]

[49, 48, 44, 48, 48]の部分は10,00だと思われ、[226, 130, 172]も共通なのできっとだと思うので、それをPlaygroundで以下のように確認

String(bytes: [194, 160], encoding: NSUTF8StringEncoding)// " "
String(bytes: [32], encoding: NSUTF8StringEncoding)// " "
String(bytes: [226, 130, 172], encoding: NSUTF8StringEncoding)// "€"

ということで、結論としては、

  • キーボード入力のスペースは[32]
  • 一方NSNumberFormatterが吐いたスペースは[194, 160]

f:id:otiai10:20160728230229p:plain

32は分かるんだけど、194,160って何の仕様だろうか

解決

とりあえずだけど、printNSUTF8StringEncodingの出力をコピペしてテストコードに貼った。

雑感

  • でも型があるの本当に気持ちいいです
  • 8月第2週第3週は帰ります。おもにコミケのために。

追記

だいぶややこしそうだ... アプリケーションレイヤーに返す前にreplaceしといたほうがよさそうだと思った。あるいはNSNumberFormatterにそういうプロパティ無いか探してみる// TODO

DRYな備忘録として