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

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

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

You are not logged in.

Announcement

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


#1 2021-04-28 14:57:36

cybe
Member

バイト数分の文字を返したい

win10、FM17

項目「商品名」に入力されている値から、左から16バイト数分の文字を返したいのですが、
何か方法はありますでしょうか?

商品名は全角半角混在しているので、16バイトちょうどでない時は、
その直前の文字までを抜き出したいです。

例:商品名
  abcあいうえおかきく → 19バイト
  15バイトの「abcあいうえおか」を抜き出したい。

よろしくお願いします。

Last edited by cybe (2021-04-28 14:58:03)

Offline

#2 2021-04-28 15:37:38

cybe
Member

Re: バイト数分の文字を返したい

すみません、7年前に同じ質問をしていました。
https://fm-aid.com/bbs2/viewtopic.php?id=1028

今でも簡単に取り出せる方法は無いですよね、、、

Offline

#3 2021-04-28 16:11:26

qb_dp
Member

Re: バイト数分の文字を返したい

こんなカンジで。

Let ([
	$text="abcあいうえおかきく";
	$Length=Length ( $text );
	$n=1;
	$f=
		"Case(
			Length($text & Filter ( $text ; RomanZenkaku ( KanaZenkaku ( $text ) ))) <= 16; $text ;
			Let([
				$text=Left ( $text ; $Length-$n );
				$n=$n+1
			];
				Evaluate($f)
			)
		)"
];
Evaluate($f)
)

Offline

#4 2021-04-28 18:20:05

Shin
Member

Re: バイト数分の文字を返したい

FM18からは While() が使えるので、

While ( 
[ 
	$text="abcあいうえおかきく";
	$length = 16 ;
	$text = Left ( $text ; $length ) 
] ; 
	Length ( $text & Filter ( $text ; RomanZenkaku ( KanaZenkaku ( $text ) ) ) ) > $length ; 
[ 
	$text = Left ( $text ; Length ( $text ) - 1 ) 
] ; 
	$text 
)

Offline

#5 2021-04-28 23:42:02

himadanee
Guest

Re: バイト数分の文字を返したい

TextEncode()を使えば少しだけシンプルになる。
あいにくLength()はエンコード結果に適用できるけど、Left()などのテキスト関数は適用できない。HexEncode()もテキスト変換してから計算されてしまう。
Base64は使えそうだけど、ループしないで済んでも文字数の計算が却って複雑になる。

While ( 
[ 
	$text="abcあいうえおかきく";
	$length = 16 ;
	$text = Left ( $text ; $length ) 
] ; 
	Length ( TextEncode ( $text ; "shift_jis" ; 1 ) ) > $length ; 
[ 
	$text = Left ( $text ; Length ( $text ) - 1 )
] ; 
	$text 
)

#6 2021-04-29 11:09:44

himadanee
Guest

Re: バイト数分の文字を返したい

ループなしでできたようです。HexDecode()の際にファイル名を指定すればいいのでした。
ただし、全角の途中に引っかかるかどうかの判定が今一ださいのと、「商品名」が空欄の場合に結果が?になってしまいます。

Let ( [
d = HexEncode ( TextEncode ( 商品名 ; "shift_jis" ; 1 ) ) ;
t = TextDecode ( HexDecode ( Left ( d ; 32 ) ; "d.dat" ) ; "shift_jis" )
] ;
Case ( t = "?" ; TextDecode ( HexDecode ( Left ( d ; 30 ) ; "d.dat" ) ; "shift_jis" ) ; t )
)

#7 2021-04-30 10:15:01

cybe
Member

Re: バイト数分の文字を返したい

詳細ありがとうございます。
無事に変換できました!!

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, 7 queries executed - Memory usage: 510.11 KiB (Peak: 516.08 KiB) ]