हम एक संख्या को प्रारूपित करना चाहते हैं ताकि परिणामी स्ट्रिंग की लंबाई X हो (हमारे मामले में यह 3 की लंबाई है)। यदि संख्या बहुत कम या बहुत बड़ी है, तो हम घातांक संकेतन के साथ ठीक हैं, हालांकि हम इसके बिना एक संख्या प्रदर्शित करना पसंद करते हैं।

ठीक यही g अंकन https://github.com/d3/d3-format के लिए है

हालांकि, d3 किसी तरह यह तय करता है कि आउटपुट नंबर e नोटेशन में है या नहीं। यदि आप पहली गैर-शून्य संख्या के सामने 5 से अधिक शून्य डालते हैं, तो यह e अंकन को चुनता है। हम इसे कम संख्या में बदलना चाहते हैं।

d3.format(".2g")(0.0000020852945934254138)
>> "0.0000021"
d3.format(".2g")(0.00000020852945934254138)
>> "2.1e-7"

क्या इस व्यवहार को संशोधित करने का कोई तरीका है ताकि हम एक निश्चित लंबाई से अधिक स्ट्रिंग प्राप्त कर सकें?

5
Jan Vorcak 3 जुलाई 2018, 18:58

1 उत्तर

सबसे बढ़िया उत्तर

इस मामले में निर्णय D3 पर निर्भर नहीं करता है।

D3, जाहिर है, एक जावास्क्रिप्ट लाइब्रेरी है। आंतरिक रूप से, d3.format Number का उपयोग करता है। प्रोटोटाइप.टूप्रेसिजन (). हम इसे सोर्स कोड में देख सकते हैं :

export default {
    //...
    "g": function(x, p) { return x.toPrecision(p); },
    //...
}

इसलिए, व्यवहार का वर्णन करने के लिए (अर्थात, पसंद कैसे बनाया जाता है), हमें Number.prototype.toPrecision() के लिए ECMAScript दस्तावेज़ों को देखना होगा। हम इसे §20.1.3.5। इस प्रश्न के लिए सबसे प्रासंगिक हिस्सा यह है कि उपखंड 12.c में, -6 पर ध्यान दें:

२०.१.३.५ Number.prototype.toPrecision (सटीक)

महत्व के दशमलव बिंदु से पहले एक अंक और महत्व के दशमलव बिंदु के बाद या सटीक महत्वपूर्ण अंकों के साथ दशमलव निश्चित अंकन में एक अंक के साथ दशमलव घातीय संकेतन में दर्शाए गए इस संख्या मान वाली एक स्ट्रिंग लौटाएं। यदि परिशुद्धता अपरिभाषित है, तो इसके बजाय ToString (7.1.12) को कॉल करें। विशेष रूप से, निम्न चरणों का पालन करें:

[...]

12.सी. यदि ई <-6 या ई पी, तो

[...]

सात। s, m, कोड इकाई 0x0065 (लैटिन छोटा अक्षर E), c, और d का संयोजन लौटाएं।

जैसा कि हम देख सकते हैं, 0.000001 (अर्थात, 1e-6) से छोटी संख्याओं को घातांक संकेतन का उपयोग करके लौटाया जाएगा।

आइए इसे जांचें:

console.log(d3.format("g")(0.000001))
<script src="https://d3js.org/d3.v5.min.js"></script>

जैसा कि हम देख सकते हैं, 0.000001 को नियमित दशमलव अंकन के रूप में लॉग किया जाएगा, न कि 1e-6 के रूप में।

इस तथ्य पर ध्यान दें कि यदि कोई सटीक सेट नहीं है d3.format उस विनिर्देशक डिफ़ॉल्ट के लिए 6 महत्वपूर्ण आंकड़े (इसलिए 0.00000100000), और इसके विपरीत जो ज्यादातर लोग उन पांच शून्य को 1 के दाईं ओर रखते हैं। महत्वपूर्ण आंकड़े हैं

यदि आप 1 तक केवल अंक दिखाना चाहते हैं, तो आइए सटीक सेट करें:

console.log(d3.format(".1g")(0.000001))
<script src="https://d3js.org/d3.v5.min.js"></script>

यह स्पष्ट है, आइए देखें कि क्या होता है यदि हम 0.0000001 का उपयोग करते हैं, जो कि 1e-7 है:

console.log(d3.format("g")(0.0000001))
<script src="https://d3js.org/d3.v5.min.js"></script>

जैसा कि आप देख सकते हैं कि यह 0.0000001 के बजाय 1.00000e-7 लौटाता है। और वही कोड, सटीक के रूप में 1 का उपयोग करके:

console.log(d3.format(".1g")(0.0000001))
<script src="https://d3js.org/d3.v5.min.js"></script>

निष्कर्ष

मुझे ऐसा लगता है कि आप केवल D3 का उपयोग करके उस व्यवहार को नहीं बदल सकते। आपकी संख्या (0.00000020852945934254138) 1e-6 से छोटी है, और इसलिए यहां घातांक संकेतन अपेक्षित है। इसे बदलने के लिए आपको अपना स्वयं का अनुकूलित फ़ंक्शन लिखना होगा।

4
Gerardo Furtado 16 जुलाई 2018, 08:08