兆億万表記の文字列を数値に変換しようと考えています。 初心者ながら思いついたのが、下記のコードです。 void Test億万円() { String T1 = "11兆200億3400万5円"; String T2 = "123兆1695億7万500円"; String T3 = "200億3400万5円"; String T4 = "123兆7万500円"; String T5 = "3400万5円"; String T6 = "123兆1695億500円"; String T7 = "5円"; String T8 = "123兆円"; String T9 = "123万"; String T10 = "123"; string s1 = T10; string Pattan兆 = "(\\d{1,4})兆"; string Pattan億 = "(\\d{1,4})億"; string Pattan万 = "(\\d{1,4})万"; string Pattan円 = "(\\d{1,4})円"; var Reg兆 = Regex.Match(s1, Pattan兆); long 兆 = Reg兆.Groups.Count > 1 ? long.Parse(Reg兆.Groups[1].Value) * 1_0000_0000_0000 : 0; var Reg億 = Regex.Match(s1, Pattan億); long 億 = Reg億.Groups.Count > 1 ? long.Parse(Reg億.Groups[1].Value) * 1_0000_0000 : 0; var Reg万 = Regex.Match(s1, Pattan万); long 万 = Reg万.Groups.Count > 1 ? long.Parse(Reg万.Groups[1].Value) * 1_0000 : 0; var Reg円 = Regex.Match(s1, Pattan円); long 円 = Reg円.Groups.Count > 1 ? long.Parse(Reg円.Groups[1].Value) : 0; long 何円 = 兆 + 億 + 万 + 円; MessageBox.Show(String.Format("{0:#,0}", 何円)); } T1〜T10は、サンプル 当然、T10は、0になってしまいます。 正規表現でグループ分けして、兆はGroup[2]、億はGroup[4]、万はGroup[6]、円はGroup[8](Indexは、適当に表現しており、億があろうがなかろうが?固定のGroupインデックスならOK)を目指しましたが、正規表現が書けませんでした。 円の有無を含めた処理方法について、お知恵を拝借できませんでしょうか?
ここまでいけばよいのだろうけど、パターンが難解すぎるので、コピペNGで考えてください。 パターンの意味を理解できずにコピペすると、説明を求められたときや改良しないと行けなくなったときに詰みます。 自分できちんと理解し、書き直せるぐらいになれば良いです。 void Main() { String T1 = "11兆200億3400万5円"; String T2 = "123兆1695億7万500円"; String T3 = "200億3400万5円"; String T4 = "123兆7万500円"; String T5 = "3400万5円"; String T6 = "123兆1695億500円"; String T7 = "5円"; String T8 = "123兆円"; String T9 = "123万"; String T10 = "123円"; string s1 = T10; TestFunc(T1); TestFunc(T2); TestFunc(T3); TestFunc(T4); TestFunc(T5); TestFunc(T6); TestFunc(T7); TestFunc(T8); TestFunc(T9); TestFunc(T10); } private static void TestFunc(string s1) { string pattern = @"^(?:(?<兆>\d{1,4})兆)?(?:(?<億>\d{1,4})億)?(?:(?<万>\d{1,4})万)?(?:(?<円>\d{1,4})円?|円)?$"; var reg = Regex.Match(s1, pattern); var 桁 = new Dictionary<string, long> { ["兆"] = 1_0000_0000_0000, ["億"] = 1_0000_0000, ["万"] = 1_0000, ["円"] = 1 }; long 何円 = 0; foreach (var pair in 桁) { if (0 < reg.Groups[pair.Key].Length) { 何円 += long.Parse(reg.Groups[pair.Key].Value) * pair.Value; } } Console.WriteLine(String.Format("{1} = {0:#,0}", 何円, s1)); }