2016-10-27 40 views
5

w poprzedniej wersji mojego kodu użyłem, aby ustawić odpowiedni format lokalizacji takd3.time.format.multi w 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"] 
} 

a następnie

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; }] 
]); 

końcu przechowywane te ustawienia formatu kleszcz więc mogę korzystać z nich w moich wykresów

D3Preferences['localTimeTickFormat'] = tickFormat; 

Po aktualizacji do wydania v4.2.8 d3.locale nie ma, a ja nie potrafię wymyślić, jak osiągnąć ten sam rezultat.

Czy ktoś może wskazać mi właściwy kierunek? Dokumentacja d3 nie pomogło mi

+0

Trzeba to wyjaśnić: aby drugi fragment kodu V3 był "localeFormatter.time.format.multi" jako 'timeFormat' jest już w wersji 4. – altocumulus

+2

Czego naprawdę szukasz, nie zastępuje 'd3.locale', ale' d3.time.format.multi', który jest teraz obsługiwany nieco inaczej. Sprawdź dokumentację modułu [format d3-time] (https://github.com/d3/d3-time-format#d3-time-format) (zaczynając od trzeciego akapitu) "Możesz zaimplementować bardziej rozbudowane formaty czasu warunkowego. .. "*) dla wyjaśnienia. – altocumulus

Odpowiedz

0

Simplely można to zrobić jak ten

d3.formatDefaultLocale(format); 

a następnie

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); 

}

To działa na mnie.

0

Z .multi przestarzałe, czynność tickFormat() ma teraz obsługiwać filtrowanie logiki, a także, jak to:

// 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 (jeden z którego prawdopodobnie pochodzi localeFormatter.timeFormat.multi()), ustawione na korzystanie z warunkowego logiki @altocumulus wspomnienia powyżej.