2016-10-27 6 views
5

В предыдущей версии моего кода, который я использовал, чтобы установить соответствующий формат локали, как этоd3.time.format.multi в V4.x

format = { 
    "decimal": ".", 
    "thousands": "", 
    "grouping": [3], 
    "currency": ["€", ""], 
    "dateTime": "%a %b %e %X %Y", 
    "date": "%d-%m-%Y", 
    "time": "%H:%M:%S", 
    "periods": ["AM", "PM"], 
    "days": ["Domenica", "Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato"], 
    "shortDays": ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa"], 
    "months": ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"], 
    "shortMonths": ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"] 
} 

, а затем

var localeFormatter = d3.locale(format); 

// set time tick format 
var tickFormat = localeFormatter.timeFormat.multi([ 
    ["%H:%M", function (d) { return d.getMinutes(); }], 
    ["%H:%M", function (d) { return d.getHours(); }], 
    ["%a %d", function (d) { return d.getDay() && d.getDate() != 1; }], 
    ["%b %d", function (d) { return d.getDate() != 1; }], 
    ["%B", function (d) { return d.getMonth(); }], 
    ["%Y", function() { return true; }] 
]); 

я, наконец, хранить эти параметры формата клеща, так что я могу использовать их в своих графиках

D3Preferences['localTimeTickFormat'] = tickFormat; 

После обновления выпустить v4.2.8 d3.locale ушел и я не может понять, как добиться такого же результата.

Может кто-нибудь указать мне в правильном направлении? Документация d3 не помогло мне

+0

Просто, чтобы понять это: для вашего второго фрагмента, который должен быть v3-кодом, он должен быть 'localeFormatter.time.format.multi', поскольку' timeFormat' уже v4. – altocumulus

+2

То, что вы на самом деле ищете, не является заменой для 'd3.locale', а' d3.time.format.multi', который теперь немного отличается. Проверьте документацию модуля [d3-time-format] (https://github.com/d3/d3-time-format#d3-time-format) (третий абзац, начинающийся * «Вы можете реализовать более сложные условные форматы времени. .. "*) для объяснения. – altocumulus

ответ

0

Simplely вы можете сделать это, как этот

d3.formatDefaultLocale(format); 

, а затем

var tickFormat=function(date){ 
    if(date.getMinutes()) return d3.timeFormat('%H:%M')(date); 
    if(date.getHours()) return d3.timeFormat('%H:%M')(date); 
    if(date.getDay()&&date.getDate()!=1) return d3.timeFormat('%a %d')(date); 
    if(date.getDate()!=1) return d3.timeFormat('%b %d')(date); 
    if(date.getMonth()) return d3.timeFormat('%B')(date); 
    return d3.timeFormat('%Y')(date); 

}

Это работает для меня.

0

С .multi осуждается, ваша tickFormat() функции теперь для обработки фильтрации логики, а также, как это:

// Establish the desired formatting options using locale.format(): 
var formatDay = d3.timeFormat("%a %d"), 
    formatWeek = d3.timeFormat("%b %d"), 
    formatMonth = d3.timeFormat("%B"), 
    formatYear = d3.timeFormat("%Y"); 

// Define filter conditions 
function tickFormat(date) { 
    return (d3.timeMonth(date) < date ? (d3.timeWeek(date) < date ? formatDay : formatWeek) 
    : d3.timeYear(date) < date ? formatMonth 
    : formatYear)(date); 
} 

Here's an updated version of Mike's original bl.ock (один из которых вы, вероятно, полученного localeFormatter.timeFormat.multi()), настроено на использование условной логики @altocumulus упоминается выше.