Hi,
I'm trying to display a currency amount on a landing page using a token. The field value currently looks like 15000, but I'd like it to display $15,000 on the landing page with the current symbol and comma. Is there anyway to auto-format the token? If not, is there another option I can try to achieve my goal?
Thanks.
Solved! Go to Solution.
Put the value into an attribute of a special <span> rather than outputting it directly:
<span data-formattable-value="{{Lead.Your Field}}" data-format="currency-us"></span>
Add this in a <script>:
document.addEventListener("DOMContentLoaded", function(e){
var arrayify = getSelection.call.bind([].slice);
arrayify(document.querySelectorAll("[data-formattable-value]"))
.forEach(function(formattableWrapper){
var origValue = formattableWrapper.getAttribute("data-formattable-value"),
format = formattableWrapper.getAttribute("data-format");
var formatter,
formattedValue;
switch(format){
case "currency-us":
formatter = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" });
formattedValue = formatter.format(origValue);
break;
}
formattableWrapper.textContent = formattedValue;
});
});
Note this solution isn't general-purpose as it only covers your particular formatting need (despite the fact that it might seem quite complex to you!). It doesn't have locale-awareness except for US, for example. And in general, when you need to reformat tokens, it's best to not put them inline at all (not even in a special data- attribute) but rather to hold them in a hidden <datalist> element.
Hey Kaye,
The tokens will return exactly what's in them. You could use a Javascript library like http://autonumeric.org/ to do the trick.
Thanks. I tried reading the documentation for the JS library, but it's a bit over my head. We don't have a developer on staff.
Is there any other way I can format the value in Marketo so it allows dollar sign and comma?
Put the value into an attribute of a special <span> rather than outputting it directly:
<span data-formattable-value="{{Lead.Your Field}}" data-format="currency-us"></span>
Add this in a <script>:
document.addEventListener("DOMContentLoaded", function(e){
var arrayify = getSelection.call.bind([].slice);
arrayify(document.querySelectorAll("[data-formattable-value]"))
.forEach(function(formattableWrapper){
var origValue = formattableWrapper.getAttribute("data-formattable-value"),
format = formattableWrapper.getAttribute("data-format");
var formatter,
formattedValue;
switch(format){
case "currency-us":
formatter = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" });
formattedValue = formatter.format(origValue);
break;
}
formattableWrapper.textContent = formattedValue;
});
});
Note this solution isn't general-purpose as it only covers your particular formatting need (despite the fact that it might seem quite complex to you!). It doesn't have locale-awareness except for US, for example. And in general, when you need to reformat tokens, it's best to not put them inline at all (not even in a special data- attribute) but rather to hold them in a hidden <datalist> element.
Thanks, Sanford!
By the way, just curious... if I didn't want the 2 decimal places to appear in the format, how would I modify the script?
By the way, just curious... if I didn't want the 2 decimal places to appear in the format, how would I modify the script?
Good programming practice is to make the code extensible — as opposed to hard-coding one outcome and removing the previous one.
So, to accommodate US Currency with no decimal, flesh out the code as such:
document.addEventListener("DOMContentLoaded", function(e){
var arrayify = getSelection.call.bind([].slice);
arrayify(document.querySelectorAll("[data-formattable-value]"))
.forEach(function(formattableWrapper){
var origValue = formattableWrapper.getAttribute("data-formattable-value"),
majorFormat = formattableWrapper.getAttribute("data-format-major"),
minorFormat = formattableWrapper.getAttribute("data-format-minor");
var majorFormatter,
finalFormatter,
formattedValue;
switch(majorFormat){
case "currency-us":
majorFormatter = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" });
break;
default:
majorFormatter = { format(value){ return value;} };
}
switch([majorFormat,minorFormat].join("-")){
case "currency-us-nodecimal":
finalFormatter = { format: function(value){ return majorFormatter.format(value).slice(0,-3); } };
break;
default:
finalFormatter = majorFormatter;
}
formattedValue = finalFormatter.format(origValue);
formattableWrapper.textContent = formattedValue;
});
});
Then set the options on the element:
<span data-formattable-value="62487" data-format-major="currency-us"></span>
<span data-formattable-value="62487" data-format-major="currency-us" data-format-minor="nodecimal"></span>
Thanks so much!