Visualforce(メールテンプレート)で数値や日時項目の表示フォーマットを指定する方法(日本時間時差修正含む)

Visualforce形式のメールテンプレートを作成しているときに、いくつか表示のフォーマットで苦労したので、メモしておこうと思います。

特に、差込項目としてそのままだと、なかなか思ったように表示させることができませんでした。

日時(Datetime)項目が欧米式のフォーマットで表示されてしまう

日時(Datetime)項目をそのまま表示すると、「Sun Jan 01 05:51:00 GMT 2017」のようにGMTで、しかも欧米式のフォーマットで表示されてしまいます。

「2017/01/01 14:51:22」のように表示するにはどうしたらいいでしょう?

Visualforceでは、「outputtext」を使うと、フォーマットを指定できます。

(※下記では、ColDatetime__cが日時項目だとします)

さらに、時間の加算も出来るので、標準時+9時間だと、(9/24)で日本時間にすることができます。

<!-- 日本時間での日時表示 -->
<apex:outputtext value="{0, date, yyyy/MM/dd HH:mm:ss}">
    <apex:param value="{!relatedTo.ColDatetime__c+(9/24)}"></apex:param>
</apex:outputtext>

整数の数値項目が小数点付きで表示されてしまう

数値項目は、「5.0」のように、小数点付きで表示されてしまいます。

オブジェクトの項目の定義で、小数点以下の桁数を0桁に変更しても変わりません。

そのような場合は、

<!-- 数値のカンマ区切り -->
<apex:outputtext value="{0, number, ###,###}">
    <apex:param value="{!relatedTo.Number__c}"></apex:param>
</apex:outputtext>
 
<!-- 数値の0埋め表示 -->
<apex:outputtext value="{0, number, 000000}">
    <apex:param value="{!relatedTo.Number__c}"></apex:param>
</apex:outputtext>

なお、もっと複雑なことをしたい場合は、コンポーネントを使うと簡単に実装できます。

やり方は「SalesforceのVisualforce Emailテンプレートで、コンポーネントを使用しpicklistの翻訳を取得する」を参考にしてください。

整数の数値項目がカンマ付きで表示されてしまう

一方、少し話はずれますが、apexコードで数値項目をString型に変更する場合、「String.valueOf(lead.Birth_Year_Marketo__c)」とすると、「1,500」のように、カンマ付きで表示されてしまいます。

そのような場合は、以下のように、一旦IntegerにしてからStringに変更すると「1500」のように表示されます。

String.valueOf(Integer.valueOf(lead.Birth_Year_Marketo__c))