|
2 | 2 |
|
3 | 3 | var d3 = require('@plotly/d3'); |
4 | 4 | var utcFormat = require('d3-time-format').utcFormat; |
| 5 | +var d3Format = require('d3-format').format; |
5 | 6 | var isNumeric = require('fast-isnumeric'); |
6 | 7 |
|
7 | 8 | var numConstants = require('../constants/numerical'); |
8 | 9 | var MAX_SAFE = numConstants.FP_SAFE; |
9 | 10 | var MIN_SAFE = -MAX_SAFE; |
10 | 11 | var BADNUM = numConstants.BADNUM; |
11 | 12 |
|
12 | | -var lib = module.exports = { |
13 | | - _numberFormat: d3.format // simply to test d3.format before switching to d3-format |
| 13 | +var lib = module.exports = {}; |
| 14 | + |
| 15 | +lib.adjustFormat = function adjustFormat(formatStr) { |
| 16 | + if( |
| 17 | + !formatStr || |
| 18 | + /^\d[.]\df/.test(formatStr) || |
| 19 | + /[.]\d%/.test(formatStr) |
| 20 | + ) return formatStr; |
| 21 | + |
| 22 | + if(formatStr === '0.f') return '~f'; |
| 23 | + if(/^\d%/.test(formatStr)) return '~%'; |
| 24 | + if(/^\ds/.test(formatStr)) return '~s'; |
| 25 | + |
| 26 | + // try adding tilde to the start of format in order to trim |
| 27 | + if(!(/^[~,.0$]/.test(formatStr)) && /[&fps]/.test(formatStr)) return '~' + formatStr; |
| 28 | + |
| 29 | + return formatStr; |
| 30 | +}; |
| 31 | + |
| 32 | +var seenBadFormats = {}; |
| 33 | +lib.warnBadFormat = function(f) { |
| 34 | + var key = String(f); |
| 35 | + if(!seenBadFormats[key]) { |
| 36 | + seenBadFormats[key] = 1; |
| 37 | + lib.warn('encountered bad format: "' + key + '"'); |
| 38 | + } |
| 39 | +}; |
| 40 | + |
| 41 | +lib.noFormat = function(value) { |
| 42 | + return String(value); |
| 43 | +}; |
| 44 | + |
| 45 | +lib.numberFormat = function(formatStr) { |
| 46 | + var fn; |
| 47 | + try { |
| 48 | + fn = d3Format(lib.adjustFormat(formatStr)); |
| 49 | + } catch(e) { |
| 50 | + lib.warnBadFormat(formatStr); |
| 51 | + return lib.noFormat; |
| 52 | + } |
| 53 | + |
| 54 | + return fn; |
14 | 55 | }; |
15 | 56 |
|
16 | 57 | lib.nestedProperty = require('./nested_property'); |
@@ -1122,7 +1163,7 @@ function templateFormatString(string, labels, d3locale) { |
1122 | 1163 | if(format) { |
1123 | 1164 | var fmt; |
1124 | 1165 | if(format[0] === ':') { |
1125 | | - fmt = d3locale ? d3locale.numberFormat : d3.format; |
| 1166 | + fmt = d3locale ? d3locale.numberFormat : lib.numberFormat; |
1126 | 1167 | value = fmt(format.replace(TEMPLATE_STRING_FORMAT_SEPARATOR, ''))(value); |
1127 | 1168 | } |
1128 | 1169 |
|
|
0 commit comments