Labyrinth of Wisdom

-This is My Archive-


【Salesforce】一定の文字数で改行して画面に表示する方法

Visualforceで一定の文字数を指定して自動改行をするメソッドを作ったので、自分用にメモ。

意外と使いどころが多いんじゃないかと思います。PDFページとか文字が突き抜けでしまうので。 cloudcompass.seesaa.net

Apexクラス

第一引数に改行したい文字、第二引数に改行したい文字数を指定。

\r\nを削除している行がありますが、これはオブジェクトのテキストエリア型などから値を取得してくる場合に有効なので書いています。

decimalStRowsを取得する部分も、Salesforceが勝手に四捨五入するという動きがあるので、確実に処理するためにDecimal型にしてます。(これをやらないと値が揺れる)

public class kaigyoTextController {
      
    public String kaigyoText {get;private set;}
    
    public kaigyoTextController(){
        kaigyoText = autoKaigyo('あいうえおかきくけこ', 4);
    }
    
    private String autoKaigyo(String st, Integer kaigyoLength){
        String rtnSt;
        Integer stLength = st.length();
    // 改行コード削除
        st = st.replaceAll('\r\n','');

        // 文字が空白、または文字数が指定改行文字数以下の場合はそのままの値を返す
        if(String.isBlank(st) || stLength <= kaigyoLength){
            rtnSt = st;
        }else{
            // 小数点を出す為にDecimal型で計算
            Decimal decimalStRows = Decimal.valueOf(stLength) / Decimal.valueOf(kaigyoLength);
            // 切り上げ処理で内容の行数を取得
            Integer stRows = Integer.valueOf(decimalStRows.round(System.RoundingMode.UP));
            // 最初の改行まで取得+改行コード付与
            rtnSt = st.substring(0, kaigyoLength) + '<br/>';
            // 2行目以降をループ処理
            for(Integer i = 1; i < stRows; i++){
                if(kaigyoLength*(i + 1) < stLength){
                    rtnSt += st.substring(kaigyoLength*i, kaigyoLength*(i + 1)) + '<br/>';
                }else{
          // 最後の文字まで取得
                    rtnSt += st.substring(kaigyoLength*i);
                }
            }
        }
        return rtnSt;
    }
}

Visualforce

フィールド変数kaigyoTextをgetしているのでそれを表示しているだけです。 ただし一点注意点として、escape属性をFalseにしてやらないと、コントローラで追加した<br/>が効かないので注意してください。

<apex:page controller="TestFormController" >
    <apex:outputText value="{!kaigyoText}" escape="false" />
</apex:page>

f:id:Labyrinth_of_Wisdom:20171005115511p:plain