2009-09-28 25 views
13

मुझे यकीन है कि मेरे आवेदन में कुछ संख्या किसी भी विभाजक के बिना मुद्रित कर रहे हैं करना चाहते हैं, तब समूह आदि कोई बात नहीं क्या मौजूदा माहौल है। ऐसा लगता है कि निम्नलिखित दो तरीकों एक ही परिणाम (वहाँ संभवतः अधिक कर रहे हैं) का उत्पादन:ToString ("0") बनाम ToString (CultureInfo.InvariantCulture)

123456789.ToString("0"); 
123456789.ToString(CultureInfo.InvariantCulture); 

आप किसी भी बढ़त मामलों या quirks के बारे में पता कर रहे हैं? कौन सा "सही" है? आप किस का उपयोग करेंगे?

मैं एक दूसरे का उपयोग करते थे, लेकिन हाल ही में मैं पहली बार एक मिल गया है और इसे का उपयोग, क्योंकि यह अतिरिक्त using System.Globalization की आवश्यकता नहीं है शुरू कर दिया।

उत्तर

0

आप मैं व्यक्तिगत रूप से लगता है कि पहला विकल्प आपके पास "क्या कोई स्वरूपण, कोई फर्क नहीं पड़ता" निर्दिष्ट करने के लिए यह सुनिश्चित करना चाहते हैं कर रहे हैं:

123456789.ToString("0"); 

बेहतर मंशा का। नकारात्मकता यह होगी कि यदि संस्कृति आपके द्वारा उपयोग किए जा रहे संख्यात्मक प्रकार के लिए "0" की प्रारूप स्ट्रिंग को ओवरराइड करती है।

+0

ओह, मैं अब जानते हैं कि आप प्रारूप तार ओवरराइड कर सकते हैं? मुझे इसे देखने की ज़रूरत है। –

+0

क्या आप ओवरलोडिंग के बारे में निश्चित हैं? एमएसडीएन (http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx) कहता है: "किसी भी अन्य एकल चरित्र [उन मानकों में से एक] रनटाइम पर FormatException फेंकता है।" –

+0

मुझे यकीन नहीं था कि यह मामला था या नहीं। मुझे लगता है कि एमएसडीएन लाइब्रेरी की एक त्वरित यात्रा ने मुझे दिखाया होगा :)। –

2

मैं इसे देखना के रूप में, पहले एक इच्छा प्रारूप कम से कम एक चरित्र कंप्यूटर के डिफ़ॉल्ट संस्कृति उपयोग करने के साथ एक संख्या है। दूसरा InvariantCulture नियमों के आधार पर एक संख्या के रूप में स्वरूपित होगा।

बॉबी

+0

अगर मैं गलत हूं तो मुझे सही करें: मैंने सोचा कि कोई अंक समूह, विभाजक आदि 123456789 पर लागू नहीं होता है। टॉस्ट्रिंग ("0")? –

+0

उह ... यह वास्तव में नहीं करता है। मैंने इसे "एन 0" जैसे फ़ॉर्मेटिंग प्रतीक के लिए गलत कर दिया है, जो वर्तमान संस्कृति नियमों को लागू करता है। आप सही हैं, क्योंकि 0 एक प्रत्यक्ष स्वरूपण है, यह _any_ संस्कृति जानकारी लागू नहीं करता है। हालांकि, कोई भी 123456789 का उपयोग कर सकता है। ToString(); । – Bobby

5

दो तरीकों समान नहीं होते हैं: पहला CurrentCulture उपयोग कर रहा है। यह कुछ संस्कृतियों में अतिरिक्त बिंदु/कॉमा का कारण बन सकता है (मेरे पास उदाहरण नहीं हैं)।

आप InvariantCulture का उपयोग करते हैं आपको विश्वास है कि हमेशा एक ही स्वरूपण प्रयोग किया जाता है।

संपादित करें: और, यदि आप CodeAnalysis का उपयोग करते हैं, तो आप शिकायत करेंगे जब आप CultureInfo का उपयोग नहीं करते हैं।

+0

मैंने वर्तमान थ्रेड संस्कृति को संशोधित करके पहले व्यक्ति का परीक्षण किया, और इससे इसे प्रभावित नहीं हुआ। मुझे लगता है कि "0" का अर्थ है: कम से कम एक अंक + कोई अंक समूह या विभाजक नहीं। अगर मैं कुछ अंक समूह या विभाजक चाहता था, तो मुझे लगता है कि मुझे कुछ "000,000" करना होगा। –

+2

लेकिन आप सही हैं: InvariantCulture "ध्वनियां" अधिक स्पष्ट है। यहां तक ​​कि एमएसडीएन भी कहता है "... यह अंग्रेजी भाषा से जुड़ा हुआ है लेकिन किसी भी देश/क्षेत्र के साथ नहीं है"। हम्म, जब मैं और अधिक सोचता हूं, ToString (CultureInfo.InvariantCulture), इसका मतलब है कि "जी" का उपयोग करके स्वरूपित संख्या। यह सब केवल काम करने के लिए होता है क्योंकि "जी" किसी भी समूह का उपयोग नहीं कर रहा है। लेकिन (मैंने इसे देखा) आविष्कार संस्कृति में कुछ समूह निर्दिष्ट हैं। उदाहरण के लिए, 12345789.ToString ("N", CultureInfo.InvariantCulture) आज़माएं। –

17

जवाब के आधार पर और चर्चा यहाँ, मैं कुछ और अधिक जांच किया था। यहाँ मैं क्या मिला है:

  • जब आप किसी भी तर्क के बिना 12345678.ToString() उपयोग करते हैं, .नेट सामान्य सामान्य फॉर्मेट स्पेसिफायर "जी" जो NumberFormatInfo.NegativeSign, NumberFormatInfo द्वारा केवल प्रभावित होता है उपयोग करता है। NumberDecimalSeparator, NumberFormatInfo.NumberDecimalDigits और NumberFormatInfo.PositiveSign। मेरे लिए यह कहता है कि किसी भी संस्कृति में 12345678.ToString() हमेशा "12345678" उत्पन्न करना चाहिए।

  • आप अलग अंक करना चाहते हैं, तो आप सांख्यिक फॉर्मेट स्पेसिफायर का उपयोग "एन" (या, ज़ाहिर है, एक कस्टम प्रारूप स्ट्रिंग प्रदान करने के लिए) की जरूरत है। अंक समूह भी "सी" और "पी" पर लागू होता है।

  • अपरिवर्तनीय संस्कृति वास्तव में अंकों (अंकों द्वारा 3, निश्चित रूप से) समूहीकरण और एक अंकों विभाजक निर्दिष्ट करता है। तो कारण है कि 123456789.ToString(CultureInfo.InvariantCulture) "123456789" उत्पन्न करता है, इनवेरिएंट संस्कृति की वजह से नहीं है, लेकिन यह डिफ़ॉल्ट सामान्य संख्यात्मक प्रारूप निर्दिष्ट "जी" के कारण है।

तो मैं कहूँगा कि यह निष्कर्ष निकाला कि यह किसी भी अतिरिक्त तर्क के बारे में चिंता नहीं और बस का उपयोग पूरी तरह से ठीक है है:

12345678.ToString() 

मुझे लगता है कि सभी मामलों से यह सबसे अच्छा क्योंकि इसका मतलब है कि आमतौर पर आपको ToString() पर कॉल करने की आवश्यकता नहीं होती है क्योंकि अधिकांश प्रिंट/लेखन फ़ंक्शन सभी प्रकार के तर्क स्वीकार करते हैं और आपके लिए ToString() करते हैं।

1

2 लाइनें अलग-अलग चीजें करती हैं। पहली पंक्ति स्थानीय संस्कृति के साथ संख्या को स्वरूपित करती है और दूसरा इसे फॉर्मेटिंग के बिना स्ट्रिंग में परिवर्तित करता है लेकिन CultureInfo.InvariantCulture का उपयोग करता है।

आप इस तरह के तरीकों (ToString, ToLower ...) के साथ CultureInfo.InvariantCulture का उपयोग यह सुनिश्चित करने के लिए करते हैं कि जब किसी भी सॉफ़्टवेयर (डेटाबेस, किसी अन्य लाइब्रेरी ...) द्वारा मान का उपयोग किया जाता है, इससे कोई फर्क नहीं पड़ता कि उनकी संस्कृति क्या है , यह वही मूल्य होगा और जब वे इस मूल्य को उठा सकते हैं, तो वे इसे संसाधित करना जारी रख सकते हैं। हालांकि यदि आप इसका उपयोग नहीं करते हैं तो अन्य सॉफ़्टवेयर को यह पता लगाना होगा कि आपकी संस्कृति क्या है। क्या आपका मतलब अल्पविराम के साथ दशमलव विभाजक या कुछ और था ...?

सभी और सभी संस्कृतिInfo.InvariantCulture का उपयोग करते हैं जब आप पुस्तकालयों, डेटाबेस के बीच मूल्यों का आदान-प्रदान/उपयोग करना चाहते हैं और अपने आवेदन के उपयोगकर्ताओं को दिखाने के लिए CultureInfo.CurrentCulture का उपयोग करना चाहते हैं।

// for softwares 
string mystring1 = 1234.ToString("0", CultureInfo.InvariantCulture); 

// for your application users 
string mystring2 = 1234.ToString("0", CultureInfo.CurrentCulture); 
1

(~ 5 साल बाद ...)

मैं इस सटीक सवाल को देख रहा था, लेकिन जब से वहाँ कोई स्वीकार किए जाते हैं और यहां तक ​​कि इस सवाल का जवाब जनवरी zich हालांकि था मैंने सोचा कि मैं एक साथ एक छोटे से डाल सही है इसका परीक्षण करने के लिए उदाहरण।

मैं यह भी कहने के लिए कहूंगा कि .ToString(), .ToString ("0"), और .ToString (कोई संस्कृति जानकारी) (जहां तक ​​पूर्णांक और दशमलव का संबंध है)

var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures) 
    .Except(CultureInfo.GetCultures(CultureTypes.SpecificCultures)); 

foreach(var c in cultures){ 
    var num = (int.MinValue);/* 
    var num = (int.MaxValue);/* 
    var num = (decimal.MinValue);/* 
    var num = (decimal.MaxValue);/* 
--*/ 

    var s1 = num.ToString("0") ; 
    var s2 = num.ToString(c); 
    if(s1 != s2){ 
     var s = string.Format("{2}: {0} {1}",s1,s2,c); 
     s.Dump(); 
    } 
} 

LinqPad snippet

0

.ToString() और .ToString (CultureInfo.InvariantCulture) हमेशा पूर्णांकों के लिए एक ही परिणाम दे।

कोड के नीचे देता है "809 संस्कृतियों परीक्षण किया है, 0 मतभेद पाया" मेरे पीसी पर परिणाम:

var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures).ToArray(); 
var numbers = new[] { 0, -1, 1, int.MinValue, int.MaxValue }; 

var diffsFound = 0; 
foreach (var culture in cultures) 
{ 
    foreach (var number in numbers) 
    { 
     var s1 = number.ToString(); 
     var s2 = number.ToString(culture); 
     if (s1 != s2) 
     { 
      Console.WriteLine($"{culture.DisplayName}: {s1} != {s2}"); 
      diffsFound++; 
     } 
    } 
} 

Console.WriteLine($"{cultures.Length} cultures tested, {diffsFound} differences found."); 
संबंधित मुद्दे