はじめに
今回はC#で文字列を数字へ変換する方法と、少数を変換する時の問題とその対処法についての紹介です。
なお、Unity上で動かしているので、ログの表示にDebug.Logを使っています。
数字の文字列への変換
数字を文字列への変換する際はToStringを使います。
//数字から文字列に変換 float floatNum = 5.8f; string floatText = floatNum.ToString(""); //変換された文字列をログで確認 Debug.Log(floatText);
ちなみに書式を指定して変換する事も可能です。
//数字から文字列に変換 float floatNum = 5.8f; string floatText = floatNum.ToString("F2");//小数点2桁まで表示するように //変換された文字列をログで確認 Debug.Log(floatText);
どんな書式があるかについては以下の記事を参考の事。
文字列の数字への変換
文字列を数字への変換する際は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}");
ただし、Parseは数字に変換出来ない文字列だとエラーが出てしまいます。
//"あいうえお"を数字に変換 string text = "あいうえお"; float floatNum = float.Parse(text);
FormatException: Input string was not in a correct format.
なので、変換出来る時だけ変換を行うTryParseの方がより安全でオススメです。
//"あいうえお"を数字に変換 string text = "あいうえお"; float floatNum; //変換出来たらfloatNumに変換した数字を設定 if (float.TryParse(text, out floatNum)) { Debug.Log($"{text}をfloatに変換しました : {floatNum}"); } //変換出来なかった場合 else { Debug.LogError($"{text}をfloatに変換出来ませんでした。"); }
小数を変換する時の問題とその対処法
実は少数の表記の仕方は言語によって違います。
例えばハンガリー語などでは少数を5.8ではなく5,8と表記します。(ドットでなくカンマを使う)
この形式は上述したTostringやParse、TryParseにも適用されるので、
ハンガリー語の環境ではToStringで生成した文字列の小数点部分はカンマになりますし、
//数字から文字列に変換 float floatNum = 5.8f; string floatText = floatNum.ToString(""); //変換された文字列をログで確認 Debug.Log(floatText);
ハンガリー語の環境では"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に変換出来ませんでした。"); }
逆にハンガリーの形式で小数を表した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に変換出来ませんでした。"); }
なので、文字列と数字の変換を行う際は予め
CultureInfo.CurrentCultureで使用する言語を指定しておくと安全です。
具体的には以下のような感じで、
英語を指定する事によって小数点が常にドットで表現されるようになります。
//CultureInfoを使うのに必要に using System.Globalization;
//現在の言語を英語に設定 CultureInfo.CurrentCulture = new CultureInfo("en-us");
もちろんユーザの入力を受け付ける時は数字のカンマをドットに変換するか
そもそもカンマを入力させないという処理も必要になってきます。
参考
ハマりそうだった部分のご報告(c#)
— ねことかげ@待機中 (@nekotokage9653) 2020年7月9日
string str = "1.14";
float num = float.parse(str);
文字列をfloatにする命令だけど、一部ヨーロッパ地域のOSだと「1.14」にならないで「114」になるんですね。
これの性質のせいで一部英語圏の人に迷惑をかけてしまっった…
向こうは小数点やる時は「1。14」って描くところもあるみたいなので「.」は無効のようでした。
— ねことかげ@待機中 (@nekotokage9653) 2020年7月9日
なので、プログラム最初の方でアメリカ式にするっていう命令を入れておけば大丈夫になりました。
System.Globalization.CultureInfo.CurrentCulture = new System.Globalization.CultureInfo("en-us");