(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



文字列と数字の相互変換と小数を変換する時の問題とその対処法【C#】


このエントリーをはてなブックマークに追加


はじめに

今回はC#で文字列を数字へ変換する方法と、少数を変換する時の問題とその対処法についての紹介です。


なお、Unity上で動かしているので、ログの表示にDebug.Logを使っています。


数字の文字列への変換

数字を文字列への変換する際はToStringを使います。

//数字から文字列に変換
float floatNum = 5.8f;
string floatText = floatNum.ToString("");

//変換された文字列をログで確認
Debug.Log(floatText);
f:id:kan_kikuchi:20200728091335j:plain


ちなみに書式を指定して変換する事も可能です。

//数字から文字列に変換
float floatNum = 5.8f;
string floatText = floatNum.ToString("F2");//小数点2桁まで表示するように
    
//変換された文字列をログで確認
Debug.Log(floatText);
f:id:kan_kikuchi:20200728091346j:plain


どんな書式があるかについては以下の記事を参考の事。





文字列の数字への変換

文字列を数字への変換する際はParseを使います。

//数字の文字列
string intText   = "58";
string floatText = "5.8";

//文字列から数字に変換
int   intNum   = int.Parse(intText); 
float floatNum = float.Parse(floatText);

//変換された数字をログで確認
Debug.Log($"int : {intNum}");
Debug.Log($"float : {floatNum}");
f:id:kan_kikuchi:20200720070434j:plain


ただし、Parseは数字に変換出来ない文字列だとエラーが出てしまいます。

//"あいうえお"を数字に変換
string text = "あいうえお";
float floatNum = float.Parse(text);

FormatException: Input string was not in a correct format.

f:id:kan_kikuchi:20200720071254j:plain


なので、変換出来る時だけ変換を行うTryParseの方がより安全でオススメです。

//"あいうえお"を数字に変換
string text = "あいうえお";
float floatNum;

//変換出来たらfloatNumに変換した数字を設定
if (float.TryParse(text, out floatNum)) {
  Debug.Log($"{text}をfloatに変換しました : {floatNum}");
}
//変換出来なかった場合
else {
  Debug.LogError($"{text}をfloatに変換出来ませんでした。");
}
f:id:kan_kikuchi:20200720071353j:plain



小数を変換する時の問題とその対処法

実は少数の表記の仕方は言語によって違います。

f:id:kan_kikuchi:20200720071454j:plain


例えばハンガリー語などでは少数を5.8ではなく5,8と表記します。(ドットでなくカンマを使う)

この形式は上述したTostringやParse、TryParseにも適用されるので、

ハンガリー語の環境ではToStringで生成した文字列の小数点部分はカンマになりますし、

//数字から文字列に変換
float floatNum = 5.8f;
string floatText = floatNum.ToString("");

//変換された文字列をログで確認
Debug.Log(floatText);
f:id:kan_kikuchi:20200728091542j:plain


ハンガリー語の環境では"5.8"という文字列を5.8に変換する事は出来ません。

//"5.8"という文字列をfloatに変換
string text = "5.8";
float floatNum;

//変換出来たらfloatNumに変換した数字を設定
if (float.TryParse(text, out floatNum)) {
  Debug.Log($"{text}をfloatに変換しました : {floatNum}");
}
//変換出来なかった場合
else {
  Debug.LogError($"{text}をfloatに変換出来ませんでした。");
}
f:id:kan_kikuchi:20200720071645j:plain


逆にハンガリーの形式で小数を表した5,8という文字列を

日本語などの環境でfloatに変換すると58になってしまいます。

//"5,8"という文字列をfloatに変換
string text = "5,8";
float floatNum;

//変換出来たらfloatNumに変換した数字を設定
if (float.TryParse(text, out floatNum)) {
  Debug.Log($"{text}をfloatに変換しました : {floatNum}");
}
//変換出来なかった場合
else {
  Debug.LogError($"{text}をfloatに変換出来ませんでした。");
}
f:id:kan_kikuchi:20200728085540j:plain


なので、文字列と数字の変換を行う際は予め

CultureInfo.CurrentCultureで使用する言語を指定しておくと安全です。



具体的には以下のような感じで、

英語を指定する事によって小数点が常にドットで表現されるようになります。

//CultureInfoを使うのに必要に
using System.Globalization;
//現在の言語を英語に設定
CultureInfo.CurrentCulture = new CultureInfo("en-us");


もちろんユーザの入力を受け付ける時は数字のカンマをドットに変換するか

そもそもカンマを入力させないという処理も必要になってきます。


参考