DOBON.NETプログラミング道掲示板

ツリー一括表示

Nomalアイコン 兆億万表記の文字列を数値に変換できる? /Wan (23/12/17(Sun) 17:15) #35564
Nomalアイコン Re[1]: 兆億万表記の文字列を数値に変換できる? /Azulean (23/12/17(Sun) 20:44) #35566
  └Nomalアイコン Re[2]: 兆億万表記の文字列を数値に変換できる? /Azulean (23/12/17(Sun) 20:57) #35567
    └Nomalアイコン Re[3]: 兆億万表記の文字列を数値に変換できる? /Wan (23/12/18(Mon) 08:28) #35569 解決み!


親記事 / ▼[ 35566 ]
■35564 / 親階層)  兆億万表記の文字列を数値に変換できる?
□投稿者/ Wan 付き人(95回)-(2023/12/17(Sun) 17:15:04)
  • アイコン環境/言語:[VisualBasic2022 Windows10 C# .NET6] 
    分類:[.NET] 

    兆億万表記の文字列を数値に変換しようと考えています。
    
    初心者ながら思いついたのが、下記のコードです。
       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)を目指しましたが、正規表現が書けませんでした。
    
    円の有無を含めた処理方法について、お知恵を拝借できませんでしょうか?
    
    

違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 35564 ] / ▼[ 35567 ]
■35566 / 1階層)  Re[1]: 兆億万表記の文字列を数値に変換できる?
□投稿者/ Azulean 大御所(542回)-(2023/12/17(Sun) 20:44:58)
  • アイコン以下の部分を、
    string Pattan円 = "(\\d{1,4})円";

    以下のように変更すればいけるのではないでしょうか?
    string Pattan円 = "(\\d{1,4})円?$";


    ? … 直前の文字が 0 回 or 1回数出現
    $ … 文末を意味する。

    https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference
違反を報告
[ 親 35564 / □ Tree ] 返信 削除キー/

▲[ 35566 ] / ▼[ 35569 ]
■35567 / 2階層)  Re[2]: 兆億万表記の文字列を数値に変換できる?
□投稿者/ Azulean 大御所(543回)-(2023/12/17(Sun) 20:57:47)
  • アイコン
    ここまでいけばよいのだろうけど、パターンが難解すぎるので、コピペ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));
    }
    

違反を報告
[ 親 35564 / □ Tree ] 返信 削除キー/

▲[ 35567 ] / 返信無し
■35569 / 3階層)  Re[3]: 兆億万表記の文字列を数値に変換できる?
□投稿者/ Wan 付き人(96回)-(2023/12/18(Mon) 08:28:24)
  • アイコンAzulean様
    大変丁寧な御指南ありがとうございます。

    string pattern = @"^(?:(?<兆>\d{1,4})兆)?(?:(?<億>\d{1,4})億)?(?:(?<万>\d{1,4})万)?(?:(?<円>\d{1,4})円?|円)?$";
    の結果は、まさしく私が求めていたものです。

    が、このようなパターンは、私の実力では、何日かけてもかけなかったと痛感しました。

    折角、お手本を書いていただいたので、単にコピペするのではなく、熟読し研鑽したいと思います。

    本当にありがとうございました。

解決み!
違反を報告
[ 親 35564 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -