動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
UIコンポーネントなどにTagをつけて、そのタグのインデックスで異なる処理をしたいと思った。
それにはTagのstring文字列からインデックスを取得したい。
try1
LINQなど使ってできないか調べたが、Unityで動きそうなもので「これだ」というのを見つけられなかったので、以下の実装をした。
using System.Linq; // for .ToArray()
...
int getIntFromAlphaNumericString(string src)
{
var query = src.ToArray ();
int work = 0;
bool found = false;
for (int idx=0; idx < query.Length; idx++) {
if (query[idx] >= '0' && query[idx] <= '9') {
work = work * 10;
work = work + query[idx] - '0';
found = true;
}
}
if (found) {
return work;
} else {
return -1;
}
}
上記の関数の使用例
public void ButtonClick() {
string str;
int val;
// 1
str = "Tag314";
val = getIntFromAlphaNumericString (str);
Debug.Log ("val = " + val.ToString () + " from " + str);
// 2
str = "Tag271um";
val = getIntFromAlphaNumericString (str);
Debug.Log ("val = " + val.ToString () + " from " + str);
// 3
str = "6022x1023";
val = getIntFromAlphaNumericString (str);
Debug.Log ("val = " + val.ToString () + " from " + str);
// 4
str = "404 not found";
val = getIntFromAlphaNumericString (str);
Debug.Log ("val = " + val.ToString () + " from " + str);
// 4
str = "Please contact to system administrator (:>)";
val = getIntFromAlphaNumericString (str);
Debug.Log ("val = " + val.ToString () + " from " + str);
}
上記の実行例
とりあえず取れた。
1つの問題として、6022x1023のように、2つの数値がある場合、60221023のようになってしまう。これはとりあえず自分が使う分にはこういう文字列を使わないということで回避する。
上記の実装はC#の機能でなくほとんどCで処理している。
Unityで動くC#にてもっと簡易な実装があれば知りたい。
improved
(追記 2015/09/09)
@laughter さんに教えていただいた方法。
using System;
using System.Text.RegularExpressions; // for Regex
public class Test
{
public static void Main()
{
String msg = "Tag314";
int val;
msg = "Tag314";
val = int.Parse(new Regex("[0-9]+").Match(msg).Value);
Console.WriteLine(val.ToString());
msg = "have271dogs";
val = int.Parse(new Regex("[0-9]+").Match(msg).Value);
Console.WriteLine(val.ToString());
msg = "6022x1023";
val = int.Parse(new Regex("[0-9]+").Match(msg).Value);
Console.WriteLine(val.ToString());
}
}
結果
314
271
6022
すごくシンプルになりました。どうもありがとうございます。
6022x1023については最初の数値だけ読み取ってくれるのもいいですね。
以下の環境でも動作確認しました。
動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5