みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
win10、FM17
項目「商品名」に入力されている値から、左から16バイト数分の文字を返したいのですが、
何か方法はありますでしょうか?
商品名は全角半角混在しているので、16バイトちょうどでない時は、
その直前の文字までを抜き出したいです。
例:商品名
abcあいうえおかきく → 19バイト
15バイトの「abcあいうえおか」を抜き出したい。
よろしくお願いします。
Last edited by cybe (2021-04-28 14:58:03)
Offline
すみません、7年前に同じ質問をしていました。
https://fm-aid.com/bbs2/viewtopic.php?id=1028
今でも簡単に取り出せる方法は無いですよね、、、
Offline
こんなカンジで。
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
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
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
)
ループなしでできたようです。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 )
)
詳細ありがとうございます。
無事に変換できました!!
Offline
Pages: 1
[ Generated in 0.024 seconds, 9 queries executed - Memory usage: 508.81 KiB (Peak: 514.56 KiB) ]