diff --git a/draftlogs/7900_fix.md b/draftlogs/7900_fix.md new file mode 100644 index 00000000000..bee5d62ee9e --- /dev/null +++ b/draftlogs/7900_fix.md @@ -0,0 +1 @@ +- Fix `hovertemplate`/`texttemplate`/`tickformat`/`hoverformat` improperly handling d3-format specs that start with a sign flag such as `+.2f` [[#7900](https://github.com/plotly/plotly.js/pull/7900)] diff --git a/src/lib/index.js b/src/lib/index.js index d898a526140..ec1cf71b51e 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -19,8 +19,16 @@ lib.adjustFormat = function adjustFormat(formatStr) { if (/^\d%/.test(formatStr)) return '~%'; if (/^\ds/.test(formatStr)) return '~s'; - // try adding tilde to the start of format in order to trim - if (!/^[~,.0$]/.test(formatStr) && /[&fps]/.test(formatStr)) return '~' + formatStr; + // A d3-format spec may begin with a sign flag (+, -, (, space). Look past + // that prefix before deciding whether to trim, and reattach it: prepending + // the tilde to the whole string (e.g. "~+.2f") is an invalid spec that + // d3Format rejects, so "+.2f" used to be silently dropped. + var prefix = (formatStr.match(/^[+\-( ]/) || [''])[0]; + var rest = formatStr.slice(prefix.length); + + // try adding tilde to trim trailing zeros; leave symbol-led specs ($, #) + // untrimmed, since the symbol isn't part of the prefix we stripped above + if (!/^[~,.0$#]/.test(rest) && /[&fps]/.test(rest)) return prefix + '~' + rest; return formatStr; }; diff --git a/test/jasmine/tests/lib_number_format_test.js b/test/jasmine/tests/lib_number_format_test.js index 21ddad84809..e0c40479f2b 100644 --- a/test/jasmine/tests/lib_number_format_test.js +++ b/test/jasmine/tests/lib_number_format_test.js @@ -53,6 +53,17 @@ describe('number format', function() { { format: '0f', number: float, exp: '12345.678901'}, { format: '1f', number: float, exp: '12345.678901'}, + // sign flag with an explicit precision must not be dropped (was silently + // ignored because adjustFormat produced the invalid spec "~+.2f") + { format: '+.2f', number: float, exp: '+12345.68'}, + { format: '+.0f', number: float, exp: '+12346'}, + { format: '-.4f', number: float, exp: '12345.6789'}, + + // symbol-led specs ($, #) are left untrimmed + { format: '$f', number: 1.5, exp: '$1.500000'}, + { format: '#f', number: 1.5, exp: '1.500000'}, + { format: '$s', number: 1500, exp: '$1.50000k'}, + // space-filled and default sign { format: '-13', number: float, exp: '-12345.678901'}, { format: '-14', number: float, exp: ' -12345.678901'},