C#
iOS
.NET
Xamarin
Xamarin.iOS

小数点がドットじゃなくてカンマになってしまう場合の対応

2018/11/09更新 : 実行環境、タグを追記しました。

実行環境

  • Mac OS X 10.13.6
  • Visual Studio for Mac 7.6.7
  • Xamarin.iOS 12.0.0.15
  • Xcode 10.1

きっかけ

普段Visual Studio for Mac(Xamarin.iOS)にてiOSアプリ開発を行なっているのですが、その時に発生した不具合についての備忘録です。
小数点の数値を文字列に変換する場合、小数点がドットではなく、カンマになってしまう場合がある。
URLのクエリに利用する文字列の場合、ドットにしないとエラーになって値を取得できないということがあったので調査。

原因

端末の言語設定が、ある地域の言語(ヨーロッパ圏言語等)の言語の場合、小数点をカンマで表現する様子

対応

小数点を含む数値を文字列に変換する時は、英語圏(en-US等)の書式を指定すると、小数点は常にドットで文字列化される。

実際の使用例は下記の通り

using System.Globalization;

/* 省略 */

// 文字列化したいdouble型
double val = 1.12345;
// 端末依存のCultureInfoで文字列出力した場合
// 文字列から数値に戻せるように書式指定子にR(ラウンドトリップ書式指定子)を指定
Debug.WriteLine ("Before: " + val.ToString("R"));

// CultureInfo.InvariantCultureでen-USの書式を取得
CultureInfo culture = CultureInfo.InvariantCulture;
// 数値文字列のフォーマットを取得
NumberFormatInfo format = culture.NumberFormat;

// CultureInfo.InvariantCultureのNumberFormatInfoを指定して出力
Debug.WriteLine ("After: " + val.ToString ("R", format));

このコードを、端末の言語設定がフランス語の場合で試した結果、コンソールでは下の画像のように出力されます。
(一部の出力は隠しています。)

qiita_image_20181107.png

参考