Template Formatting in iDialogue Templates
This guide shows how to format numbers, currency, percentages, and dates inside iDialogue templates for PDF/HTML generation. All examples assume your data comes from a Data Context Definition (DCD) and is available in the template. The syntax is based on Twig and Pebble.
Filters vs. Functions
- Filters use pipe syntax and feel like a transformation:
{{ opportunity.Amount | formatCurrency() }} - Functions use call syntax:
{{ formatCurrency(opportunity.Amount) }} - Both are available; pick whichever reads best for your team. Filters and functions share the same defaults and behaviors.
Currency Formatting
Default USD with commas and two decimals:
<td>{{ opportunity.Amount | formatCurrency() }}</td>
Custom symbol and pattern:
<td>{{ opportunity.Amount | formatCurrency(currencySymbol="USD ", format="¤#,##0.00") }}</td>
Function style:
<td>{{ formatCurrency(opportunity.Amount) }}</td>
Behavior: null/blank values render as 0.00; numeric strings are parsed safely.
Number Formatting
Thousands separators and two decimals:
<td>{{ lineItem.UnitPrice | formatNumber(format="#,##0.00") }}</td>
Integer quantities:
<td>{{ formatNumber(lineItem.Quantity, format="#,##0") }}</td>
Behavior: null/blank → 0; numeric strings are parsed safely.
Percent Formatting
Show as percent without scaling (expects 0–100 already):
<td>{{ lineItem.Discount | formatPercent() }}</td>
Scale fractional values (e.g., 0.15 → 15%):
<td>{{ formatPercent(lineItem.Discount, scale=true) }}</td>
Custom pattern:
<td>{{ lineItem.Discount | formatPercent(format="#0.0'%'") }}</td>
Behavior: null/blank → 0%; numeric strings are parsed safely.
Date Formatting
Default pattern yyyy-MM-dd:
<td>{{ formatDate(opportunity.CloseDate) }}</td>
Custom pattern:
<td>{{ opportunity.CloseDate | formatDate(pattern="MMM d, yyyy") }}</td>
Behavior: accepts ISO date strings (e.g., 2024-03-01) or epoch millis; null/blank → empty string.
DateTime Formatting
Default pattern yyyy-MM-dd HH:mm z:
<td>{{ formatDateTime(quote.IssuedAt) }}</td>
Custom pattern:
<td>{{ quote.IssuedAt | formatDateTime(pattern="MMM d, yyyy HH:mm") }}</td>
Behavior: accepts ISO date-time (e.g., 2024-03-01T15:30:00Z) or epoch millis; null/blank → empty string.
Quick Cut-and-Paste Examples
Line items table with all formatters (filter style):
{% for li in lineItems %}
<tr>
<td>{{ li.Name }}</td>
<td>{{ li.ProductCode }}</td>
<td>{{ li.Quantity | formatNumber(format="#,##0") }}</td>
<td>{{ li.UnitPrice | formatCurrency() }}</td>
<td>{{ li.Discount | formatPercent(scale=true) }}</td>
<td>{{ li.TotalPrice | formatCurrency() }}</td>
</tr>
{% endfor %}
Same table using functions:
{% for li in lineItems %}
<tr>
<td>{{ li.Name }}</td>
<td>{{ li.ProductCode }}</td>
<td>{{ formatNumber(li.Quantity, format="#,##0") }}</td>
<td>{{ formatCurrency(li.UnitPrice) }}</td>
<td>{{ formatPercent(li.Discount, scale=true) }}</td>
<td>{{ formatCurrency(li.TotalPrice) }}</td>
</tr>
{% endfor %}
Defaults and Fallbacks
- Locale defaults to
en_USfor number/currency/percent. - Currency symbol defaults to
$; override withcurrencySymbol. - Percent defaults to no scaling; set
scale=trueto multiply by 100. - Null/blank values render safe defaults instead of throwing (e.g.,
0,0.00,0%, or empty string for dates). - Numeric strings are parsed to numbers automatically; non-numeric strings fall back to the null/default value.
Tips for Salesforce Admins/Developers
- Keep templates simple: prefer filters for inline readability; switch to functions if your team finds them clearer.