diff --git a/js/symbol/resolve_text.js b/js/symbol/resolve_text.js index c38cbf7db7e..697c481c1a4 100644 --- a/js/symbol/resolve_text.js +++ b/js/symbol/resolve_text.js @@ -13,16 +13,20 @@ module.exports = resolveText; */ function resolveText(features, layoutProperties, codepoints) { var textFeatures = []; + var textField = layoutProperties['text-field']; + var transform = layoutProperties['text-transform']; + var numericPrecision = layoutProperties['numeric-precision']; + if (numericPrecision === undefined) numericPrecision = 8; // to be replaced with spec default + var numericMultiplier = Math.pow(10, numericPrecision); for (var i = 0, fl = features.length; i < fl; i++) { - var text = resolveTokens(features[i].properties, layoutProperties['text-field']); + var text = resolveTokens(features[i].properties, textField, numericMultiplier); if (!text) { textFeatures[i] = null; continue; } text = text.toString(); - var transform = layoutProperties['text-transform']; if (transform === 'uppercase') { text = text.toLocaleUpperCase(); } else if (transform === 'lowercase') { diff --git a/js/util/token.js b/js/util/token.js index 814c070bf5b..83554bf56d5 100644 --- a/js/util/token.js +++ b/js/util/token.js @@ -10,8 +10,12 @@ module.exports = resolveTokens; * @returns {string} the template with tokens replaced * @private */ -function resolveTokens(properties, text) { +function resolveTokens(properties, text, numericMultiplier) { return text.replace(/{([^{}]+)}/g, function(match, key) { - return key in properties ? properties[key] : ''; + var value = key in properties ? properties[key] : ''; + if (typeof value === 'number' && numericMultiplier != null) { + value = Math.round(value * numericMultiplier) / numericMultiplier; + } + return value; }); } diff --git a/test/js/util/token.test.js b/test/js/util/token.test.js index 066d36767db..ba952ea4ba0 100644 --- a/test/js/util/token.test.js +++ b/test/js/util/token.test.js @@ -14,6 +14,7 @@ test('token', function(t) { t.equal('dashed', resolveTokens({'dashed-property': 'dashed'}, '{dashed-property}')); t.equal('150 m', resolveTokens({'HØYDE': 150}, '{HØYDE} m')); t.equal('mapbox', resolveTokens({'$special:characters;': 'mapbox'}, '{$special:characters;}')); + t.equal('12.345 m', resolveTokens({foo: 12.345178911111}, '{foo} m', 1e3)); t.end(); });