初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2018-01-03 09:29:42

salon_hiyake
Member

文字列中のひらがなの個数をカウントする【カスタム関数】【再帰】

文字列中のひらがなの個数をカウントしたくて、カスタム関数を作ってみましたが、うまく動作しません。
どこが悪いのでしょうか? どなたかわかりましたらよろしくお願いします。
(ちなみに再帰を使ったカスタム関数、みなさんはどうやってデバッグしているのでしょうか?)

関数名:HiraganaCount()
引数:txt(下記の例では"航空センターあかし"を代入しています)

Let([
   $txt="航空センターあかし";
   $num = 0 ;                       /*ひらがなの個数*/
   $len = Length($txt) ;    	    /*文字列の長さ*/
   $pos = 0 ;                       /*何文字目か*/
   $tp = Middle($txt;$pos;1);
   $code = Code($tp);
   $fnc="Case($pos ≥ $len ; $num ; /*終了条件:最後の文字まで判定したら$numを返す*/
      Let([
         $pos = $pos+1;
         $tp = Middle( $txt ; $pos ; 1);
         $code = Code( $tp );
         $num = $num + ($code ≥ 12353 and $code ≤ 12438)
      ]; Evaluate($fnc))
   )"
];
   Evaluate($fnc)
)

Offline

#2 2018-01-03 10:55:56

Shin
Member

Re: 文字列中のひらがなの個数をカウントする【カスタム関数】【再帰】

動いていますよ。
ただ、6、7行目は不要でしょう。

Let([
   $txt="航空センターあかし";
   $num = 0 ;                       /*ひらがなの個数*/
   $fnc="Case ( IsEmpty ( $txt ) ; $num ; /*終了条件:最後の文字まで判定したら$numを返す*/
      Let([
         $tp = left ( $txt ; 1) ;
         $code = Code ( $tp ) ;
         $num = $num + ( 12353 ≤ $code and $code ≤ 12438 ) ;
         $txt = right ( $txt ; length ( $txt ) - 1)
      ]; Evaluate ( $fnc ) 
     )
   )"
   ];
   Evaluate($fnc)
)

とも書けますよ。
デバッグは、頭の中ですね。

Offline

#3 2018-01-03 13:20:38

salon_hiyake
Member

Re: 文字列中のひらがなの個数をカウントする【カスタム関数】【再帰】

Shinさん、ありがとうございました。確かに6,7行目、不要ですね。
動いていました。単なる自分の勘違いでした。

Offline

#4 2018-01-03 14:00:06

Hiro
Member

Re: 文字列中のひらがなの個数をカウントする【カスタム関数】【再帰】

動きますが、

もしも、ひらがな "こべ" 内の長音「ー」(12540、8213) もカウントするとすれば、
・式は、多少内容を精査・簡素化して、(カレント式内だけなら$→#変数が良)

Let([
   $txt="航空センターこ―べタワー";
   $flg=0;                       /*前字はひらがなか*/
   $num=0;                       /*ひらがなの個数*/
   $fnc="Case(IsEmpty($txt); $num;
      Let([
         #chr=Left($txt; 1);
         #cod=Code(#chr);
         #add=(#cod≥12353 and #cod≤12438) or (#cod=12540 or #cod=8213)*$flg;
         $txt=Right($txt; Length($txt)-1);
         $flg=#add;
         $num=Sum($num; #add)
      ]; Evaluate($fnc))
   )"
];
   Evaluate($fnc)
)

●デバックは、可能です。
・EvaluationError関数の利用を工夫、
・テキスト記述した式をEvaluate()内に入れて、
・それをEvaluationError()内で動作試行させ、
・エラーキャッチします。
      EvaluationError(Evaluate("テキスト記述式"))
※なお、式を記述するg_テキストフィールドとエラー対応表を用意すると非常に重宝です。

Last edited by Hiro (2018-01-03 16:04:44)

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.004 seconds, 9 queries executed - Memory usage: 508.19 KiB (Peak: 514.86 KiB) ]