21
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【C#.NET】言語によって挙動が変わる

Last updated at Posted at 2021-12-18

はじめに

こちらは、Advent Calendar 2021 「ググって解決しづらかったこと」19日目の記事になります。

私が仕事の中で起きたググって解決しづらかったことについて書こうと思います。

よろしくお願いします。

環境

  • Windows 10
  • Visual Studio 2022
  • C# ( .NET 6.0 )

ググって解決しづらかったこと

仕事の内容は、開発しているWebアプリで日本語や英語、韓国語、中国語などの各国の言語に対応させることです。
Webアプリ内でユーザーが言語を選択できる仕様で、この機能については問題なく追加することができました。

しかし、ここでおかしな現象が起きます。><
なんと、今までWebアプリ内で表示していたグラフなどのチャートの色が選択した言語によって、変わってしまうのです!(仕様ではどの言語も同じ色のチャートで表示します。)
言語を変えることでチャートの色が変わってしまうなんて、まったく想定できない問題でした。なにが原因なのか見当もつきません。
ただ明白なのは、各言語に対応させる機能を追加をしたので、言語機能周りが何か悪さしているということです。

ここから、ググってググってググってググってググって、やっと解決できました。本当にググって解決しづらかったな~と思います。やはり言語機能周りで問題は起こっていました。

原因

.NETでは、日付、数値、および通貨の書式設定など、言語に依存するとのことです...
自身で言語設定をしない場合は、デフォルトととしてWindowsで表示している言語が選択されるそうです。私の場合は日本語になります。
また、テキストの並べ替え順序、大文字と小文字の表記規則、文字列比較も言語に依存するそうです。

今回起きた問題では、四捨五入の計算で予期しない挙動をしていました。

double data = 0.25;

CultureInfo.CurrentCulture = new CultureInfo("ja-JP");
Console.WriteLine(Math.Round(data, 1, MidpointRounding.AwayFromZero)); // 0.3

CultureInfo.CurrentCulture = new CultureInfo("es-ES");
Console.WriteLine(Math.Round(data, 1, MidpointRounding.AwayFromZero)); // 0,3

上記のコードで、コメントアウトが出力結果です。

違いに気がつきましたか??
なんと、日本語だと「0.3」、スペイン語だと「0,3」なんです。
「.」と「,」が違うんです!!!
色の透明度として関数に渡していた値でしたが、スペイン語だと「0,3」になり、引数の数がおかしいということでバグになってしまいました...。色はもちろん無効な色です...。

解決策として、カルチャに依存しない言語「InvariantCulture」というものを指定しました。これを使用することで、挙動を統一することができました。

おわりに

ここまで読んでいただきありがとうございます。

起こった問題と原因がなかなか紐づかない内容だったので、最初はどのようにググったらいいのか、そこから難しかったです。
ここが悪さしているんじゃないか?と疑いながらコツコツと調べていくことで、最終的にはたどり着くことができたエピソードでした!

21
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?