S.B.S. Salesforce技術ブログ

教えて921さん!

Salesforce Apex 指定Blobサイズでの文字列分割(改行など)

こんにちは皆さん!

YUMOTOです。

帳票等作成時に文字数未定の文字列を横幅見ていい感じの位置で改行したい
なんてことがあると思うのですが、 文字数指定で改行した場合、全角と半角が混じっていると、 まだ文字が入りそうな中途半端なところで改行してしまう等 あんまりいけてない。
文字幅=Blobサイズではないので使えないことが判明

そこで、 文字列のBlob.size()で改行?指定してあげればいいんじゃないかということで、関数を作りました。

前提としてSalesforceでは(?)
英数字のBlob.size()が1、 日本語のBlob.size()が3  のようなので、案外めんどくさかった。

指定Blob.size数で改行する関数
public List<String> autoKaigyoBlob(String OriginalStr,Integer kaigyoBlobSize){
   List<String> rtnStrList = new List<String>();
   Integer LineNum = 0;
   Integer count = 0;
   String tempStrLine = '';
   
   //何行になるか計算
   if(Math.mod(Blob.valueOf(OriginalStr).size(),kaigyoBlobSize) == 0){
       LineNum = Blob.valueOf(OriginalStr).size() / kaigyoBlobSize;
   }else{
       LineNum = Blob.valueOf(OriginalStr).size() / kaigyoBlobSize + 1;    
   }
   

   //OriginalStrを一文字ずつsplitしたList
   List<String> splitStrList = new List<String>();
   splitStrList = OriginalStr.split('');
   
   if(LineNum ==1){ //一行で終わる場合
       rtnStrList.add(OriginalStr);
   }else{ //二行以上の場合
       for(Integer i = 0; i < LineNum; i++){ //行数分回す
           //一行分の格納
           for(Integer j = count; j < splitStrList.size();j++){
               //次の文字を文字列に足していいのかの判定
               if(Blob.valueOf(tempStrLine).size() + Blob.valueOf(splitStrList[j]).size() <= kaigyoBlobSize){
                   tempStrLine += splitStrList[j];    
               }else{                       //はみだした場合
                   //次splitStrList の何番目から取得すればいいのかの値を保持してbreak;
                   count = j;
                   break;
               }
           }
           rtnStrList.add(tempStrLine);
           tempStrLine = '';
       }
   }
   return rtnStrList;
}

使い方としては、

第一引数に分割したい文字列
第二引数に何Blobで分割するかの数字

ざっくり解説

①分割したい文字列のBlob.sizeを見て、最終的に何分割すればいいのかを計算

②分割したい文字列を、1文字ずつ配列に格納

③一文字ずつのBlob.sizeを見て文字列に足していく、
 もし分割したいBlob.sizeより超えていたら文字列に足さずに、
 何文字目まで取ったかを記録してスキップ。

④分割した文字列をListにadd

③④繰り返し

実行結果

実際にこちらを開発者コンソールのAnonymous Windowで実行してみました。

String OriginalStr = 'あいうえおお12おal;fdこいlkacjaowlふぉあdjaliだじょいどdailkふぃえ'; 
List<String> LFtextList = new List<String>();
LFtextList = autoKaigyoBlob(OriginalStr,20);

for(String str: LFtextList){
   system.debug(str +'   '+ 'Blob.valueOf(str).size()' + Blob.valueOf(str).size());
}


public List<String> autoKaigyoBlob(String OriginalStr,Integer kaigyoBlobSize){
   ~~~中略~~~
}

実行結果
f:id:sbsSF:20210325105813p:plain

指定サイズで分割できるところでは、ぴったり分割できていて
あともう一文字追加したら指定サイズ超えるところではうまくスキップしています。

まとめ

Blobサイズで分割してみました。
分割した文字列使って実際にVFの改行がうまくいくかは自分の目で確かめてください。
(プログラム作るのが楽しかっただけです。)

後日VFページの帳票で改行位置を確かめてみたのですがうまくいきませんでした。