public static void Main()
Handlebars.RegisterHelper("formatCurrency", (writer, context, parameters) =>
if (Decimal.TryParse(parameters[0].ToString(), out decimal amount))
writer.WriteSafeString(amount.ToString("C"));
{ ""Title"": ""Receipt ID"", ""Value"": ""{{ReceiptId}}"" },
{ ""Title"": ""Total"", ""Value"": ""{{formatCurrency Amount}}"" },
{ ""Title"": ""Item #{{@index}} PLU"", ""Value"": ""{{PLU}}"" },
{ ""Title"": ""Item #{{@index}} Quantity"", ""Value"": ""{{Qty}} unit(s)"" }{{#unless @last}},{{/unless}}
var template = Handlebars.Compile(source);
var receipt = new Receipt
ReceiptId = Guid.NewGuid(),
ReceiptItems = new ReceiptItem[] { new(){PLU = 123, Qty = 3.33m}, new(){PLU = 321, Qty = 1} },
var result = template(receipt);
Console.WriteLine(result.Trim());
public Guid ReceiptId { get; set;}
public decimal Amount {get; set;}
public string? SomeText {get; set;}
public ReceiptItem[] ReceiptItems {get; set;} = Array.Empty<ReceiptItem>();
public int PLU {get; set;}
public decimal Qty {get; set;}