2013-06-11 6 views
9

के साथ स्थानीयकरण योग्य या अनुकूलन योग्य कोड कैसे प्राप्त करें एसआई कोड का उपयोग करते हुए ग्राफ ड्राइंग करते समय हम जो चाहते हैं वह बहुत अधिक है। हमारे वाई-अक्ष मान बड़े मुद्रा मान होते हैं। उदाहरण: $ 10,411,504,201.20d3.format

कम से कम एक अमेरिकी लोकेल में इसका संक्षेप में, इसका अनुवाद $ 10.4B होना चाहिए।

लेकिन एसआई कोड के लिए d3.format के 'प्रकार का उपयोग करके यह $ 10.4G के रूप में प्रदर्शित होगा। कुछ स्थानीय लोगों के लिए यह अच्छा हो सकता है और कंप्यूटर-आधारित मानों से निपटने के दौरान अच्छा हो सकता है (उदाहरण: प्रोसेसर की गति, मेमोरी ...), लेकिन मुद्रा या अन्य गैर-कंप्यूटर प्रकारों के मूल्यों के साथ नहीं।

क्या एसआई-कोड के समान लोकेल-विशिष्ट कार्यक्षमता प्राप्त करने का कोई तरीका है जो जी के बजाय अरबों को बी में परिवर्तित करेगा ...?

(मुझे पता है यह ज्यादातर एक SI-कोड बात और डी 3 के लिए विशिष्ट नहीं है, लेकिन चूंकि मैं डी 3 का उपयोग कर रहा यह सबसे उपयुक्त टैग लगती है।)

+5

मैं भी एक बार इस मुद्दे में पड़ गए और कुछ भी इसे संभाल करने के लिए मुहावरेदार नहीं पा सके, तो मैं यह कर समाप्त हो गया: 'सी = d3.format ('एस');' ' siMod = समारोह (वैल) {वापसी si (वैल) .replace (/ जी /, 'बी')}; ' – meetamit

+0

सही, ऐसा लगता है कि मैं वही काम करूँगा। उम्मीद है कि इस प्रकार की कार्यक्षमता कभी-कभी डी 3 में बन जाती है। – lostdorje

+0

यह अभी भी डी 3 के ढांचे का हिस्सा नहीं है अभी तक सही है? अपने दस्तावेज़ों के आधार पर इसे अमेरिकी लोकेल में बदलने का कोई तरीका नहीं मिला। –

उत्तर

10

मैं अधिभावी d3.formatPrefix पसंद करते हैं। फिर आप अपने विज़ कोड के भीतर तारों को बदलने के बारे में भूल सकते हैं। D3.js. लोड करने के तुरंत बाद निम्न कोड निष्पादित करें

// Change D3's SI prefix to more business friendly units 
//  K = thousands 
//  M = millions 
//  B = billions 
//  T = trillion 
//  P = quadrillion 
//  E = quintillion 
// small decimals are handled with e-n formatting. 
var d3_formatPrefixes = ["e-24","e-21","e-18","e-15","e-12","e-9","e-6","e-3","","K","M","B","T","P","E","Z","Y"].map(d3_formatPrefix); 

// Override d3's formatPrefix function 
d3.formatPrefix = function(value, precision) { 
    var i = 0; 
    if (value) { 
     if (value < 0) { 
      value *= -1; 
     } 
     if (precision) { 
      value = d3.round(value, d3_format_precision(value, precision)); 
     } 
     i = 1 + Math.floor(1e-12 + Math.log(value)/Math.LN10); 
     i = Math.max(-24, Math.min(24, Math.floor((i - 1)/3) * 3)); 
    } 
    return d3_formatPrefixes[8 + i/3]; 
}; 

function d3_formatPrefix(d, i) { 
    var k = Math.pow(10, Math.abs(8 - i) * 3); 
    return { 
     scale: i > 8 ? function(d) { return d/k; } : function(d) { return d * k; }, 
     symbol: d 
    }; 
} 

function d3_format_precision(x, p) { 
    return p - (x ? Math.ceil(Math.log(x)/Math.LN10) : 1); 
} 

इस कोड को चलाने के बाद, SI उपसर्ग के साथ एक नंबर स्वरूपण का प्रयास करें:

d3.format(".3s")(1234567890) // 1.23B 

आप बहुत आसानी से इस कोड को बढ़ाने सकता है एक वस्तु में स्थान-विशिष्ट d3_formatPrefixes मूल्यों को शामिल करके विभिन्न स्थानों का समर्थन और उसके बाद के लिए उचित स्थान का चयन करें जो आपको आवश्यक लोकेल से मेल खाता है।

+2

'ई -3' 'एम' से कहीं ज्यादा बेहतर है। धन्यवाद! – ninjaPixel

+0

धन्यवाद! यह प्लॉटली अक्षीय लेबल स्वरूपण के साथ भी काम करता है। – kimsk

+0

मेरे यहां एक प्रश्न है (http://stackoverflow.com/q/41385010/1735836) आप मेरी मदद कर सकते हैं। ऐसा लगता है कि आपका उत्तर काम कर सकता है, लेकिन मुझे यकीन नहीं है और मुझे वास्तव में यह नहीं पता कि इसे कैसे कार्यान्वित किया जाए। – Patricia