対象となる開発形態
- intra-mart Accel Platform
- スクリプト開発
- IM-FormaDesigner(Ajax利用)
やりたいこと
- 文字列をバイト数指定で切り捨てる。
- 指定バイト数が文字の途中だった場合、その前の文字までを取得する。
コード
byteTruncStr.js
function byteTruncStr(str, byteLen) {
if (Module.string.size(str) <= byteLen) {
return str;
}
let strLen = byteLen > str.length ? str.length : byteLen;
let truncStr = str.substring(0, strLen);
while (Module.string.size(truncStr) > byteLen) {
strLen --;
truncStr = truncStr.substring(0, strLen);
}
return truncStr;
}
- 引数
-
str
: 切り捨て対象の文字列 -
byteLen
: 切り捨てるバイト数
-
- 戻り値
-
truncStr
: 切り捨て後の文字列
-
解説
intra-mart APIのModule.string.size(str)
は、文字列のバイト数を取得するAPIです。
intra-mart Accel Platform SSJS API Documentation
if (Module.string.size(str) <= byteLen) {
return str;
}
で、そもそも対象文字列が指定バイト数内に収まっている場合にそのまま文字列を返却します。
収まりきっていない場合は切り捨て処理を行う訳ですが、それが次のコード。
let strLen = byteLen > str.length ? str.length : byteLen;
let truncStr = str.substring(0, strLen);
while (Module.string.size(truncStr) > byteLen) {
strLen --;
truncStr = truncStr.substring(0, strLen);
}
切り捨て対象文字列を変数truncStr
に入れ、そのバイト数が指定バイト数以下になるまで1文字ずつ減らしていきます。
単純に対象文字列全体から1文字ずつ減らしていくと、文字列が非常に大きく切り捨てるバイト数が非常に小さい場合にループ回数が極端に大きくなってしまうため、対象文字列を初めから制限するようにしました。
それがwhileループ前の変数宣言部分。
そもそも100文字300バイトを10バイトに切り捨てたいんなら、先頭10文字しか使わなくていいじゃん、って考えです。
通常のJavaScriptでは
Module.String.size(str)
部分さえJavaScriptで実装できてしまえば、後は全く同じように利用できます。