ヨーロッパ圏にXNAゲームを配布するときの注意

バグフィックスのみ。でも結構重要なもの。一部の国で動かなかったそうだ。おそらくヨーロッパ圏あたり。

XNAというか.NETでは小数点の扱いを自動的に各国の流儀に合わせてしまうらしく、ヨーロッパ圏の一部の国で動かすとfloat.Parseで小数点がカンマを使うものと考えてパースしてしまう。なのでドットを前提として書いてあるコードではfloatのパースに失敗してしまう。

以下のようなコードを使えば日本でも再現はできる。

System.Globalization.NumberFormatInfo nfi = 
  new System.Globalization.CultureInfo("fr-FR", false).NumberFormat;
float.Parse("1.5", nfi);

上のコードからはFormatExceptionが発生する。つまりこのコードはフランス(fr-FR)では動かないわけだ。

これを解決するには以下のようにする。

System.Globalization.NumberFormatInfo nfi =
 new System.Globalization.NumberFormatInfo();
nfi.NumberDecimalSeparator = ".";
float.Parse("1.5", nfi);

コードを追ってメールで指摘いただいた方に感謝。これは国内ではきわめて見つけにくいタイプのバグだ。あとこちらの環境で再現のしようがないので実は本当に直っているかどうか分からない。OSを設定すればヨーロッパの環境にできたりするのかね。