クリック画像の実寸表示

段ボール箱を机にした猫 ファイルメーカー(filemaker)のちらしの裏のメモ書き

TOP  >  Lengthb関数を作って文字数をカウントする
作成日:2024年11月11日

Lengthb関数を作って文字数をカウントする

イメージイラスト
にゃん太

どうも、にゃん太です

文字を入力していて、半角換算で何文字分かが知りたくなる事はありませんか?

今回のメモでは、昔あったLengthb関数の様に半角換算での文字数をカウントできるカスタム関数を作成してみます


文字数を数える

まずは基本的な文字数を数える関数といえば、Length関数となります

計算式

Length ( "あいうえおかきくけこさしすせそ" )
計算結果
15
と、こんな具合に文字数を数えてくれます
この関数は文字種は区別しませんので、

計算式

Length ( "123456789012345" )
や、

計算式

Length ( "あいうえおカキクケコ12345" )
でも同じく「15」が返されます

全角・半角の区別が必要な場合

多くの場合、全角と半角を区別する必要はありませんが、時には区別をして処理したい場合もあります
例えば、全角30文字分のスペースにきれいに収まるように文字入力させたい場合などです
等幅フォントを使用している場合、全角30文字分のスペースには半角であれば60文字が収まります
全角だけ、半角だけと固定できる場合だけではありませんから、混在した場合に上手く収まるかの判定をする必要があります
そんな時に昔のFileMakerであればLengthb関数を使用して文字数を数える事が出来たのですが、現在はLengthb関数は廃止され、代替となる関数は提供されていません
仕方がないので、自分でカスタム関数を作成する事にします

Lengthb関数に求める機能

では、Lengthb関数を作ってみましょう
尚、過去にあったLengthb関数の「b」はバイトを示しており今回作成する内容と一致しませんが、求める機能は一緒という事で気にしない事にします

さて、まずは求める機能について明確にします
例えば、以下のような結果を返す事を期待します

計算式

Lengthb ( "あいうえおかきくけこさしすせそ" )
計算結果
30


計算式

Lengthb ( "あいうえおカキクケコ12345" )
計算結果
20
という結果を返す様な関数とします
全角なら2、半角なら1とカウントしていくという事ですね

Lengthb関数を作る

上記機能を満たすには、半角と全角を何らかの方法で区別をしないといけません
単純に区別する関数はありませんが、半角/全角を変換する関数として、
があります
これを利用して何かできないかを考えてみましょう

計算式

RomanHankaku ( "あいうえおカキクケコ12345" )
計算結果
あいうえおカキクケコ12345


計算式

RomanZenkaku ( "あいうえおカキクケコ12345" )
計算結果
あいうえおカキクケコ12345


計算式

KanaHankaku ( "あいうえおカキクケコ12345" )
計算結果
あいうえおカキクケコ12345


計算式

KanaZenkaku ( "あいうえおカキクケコ12345" )
計算結果
あいうえおカキクケコ12345

RomanHankaku関数、KanaHankaku関数は何の変化もありませんが、RomanZenkaku関数、KanaZenkaku関数は半角が全角に変わりました
この結果から、RomanZenkaku関数・KanaZenkaku関数の両方を適用し、変化がない文字は全角、変化した文字は半角と区別できます
そして、変化がない文字を抜粋するには、Filter関数で実行できます

計算式

Filter ( "あいうえおカキクケコ12345"; RomanZenkaku ( KanaZenkaku ( "あいうえおカキクケコ12345" ) ) )
計算結果
あいうえお

これで、全角と半角の区別が付けられました
全角は2、半角は1とカウントしたいのですから、元の文字列の文字数を算出し、それに全角だけ抜き出した文字数を加算すれば、期待した結果が得られると想定できます

計算式

Length ( "あいうえおカキクケコ12345" ) + Length ( Filter ( "あいうえおカキクケコ12345"; RomanZenkaku ( KanaZenkaku ( "あいうえおカキクケコ12345" ) ) ) )
計算結果
20

無事、求める結果が得られました

カスタム関数「Lengthb」

では、最終的な形は下記の通りです

Lengthb ( txt ) =
Length ( txt ) + Length ( Filter ( txt; RomanZenkaku ( KanaZenkaku ( txt ) ) ) )


メモ書き終了の案内イラスト

以上で今日のメモ書きは終了です

内容はいかがでしたか?

もしご意見やご要望、誤りの指摘などありましたら、下記フォームよりお気軽にご連絡ください

ご連絡フォーム