संस्कृतिइन्फो.इंटरवेन्टकल्चर का क्या अर्थ है?


177

मेरे पास पाठ का एक स्ट्रिंग है जैसे:

var foo = "FooBar";

मैं एक दूसरी स्ट्रिंग की घोषणा करना चाहता हूं, जिसे मैं barअपने पहले और चौथे चरित्र के बराबर बनाता हूं foo, इसलिए मैं ऐसा करता हूं:

var bar = foo[0].ToString() + foo[3].ToString();

यह उम्मीद के अनुसार काम करता है, लेकिन ReSharper मुझे Culture.InvariantCultureअपने कोष्ठक के अंदर डालने की सलाह दे रहा है , इसलिए यह पंक्ति इस तरह समाप्त होती है:

var bar = foo[0].ToString(CultureInfo.InvariantCulture)
        + foo[3].ToString(CultureInfo.InvariantCulture);

इसका क्या मतलब है, और यह प्रभावित करेगा कि मेरा कार्यक्रम कैसे चलता है?


2
इस SO प्रश्न को देखें: stackoverflow.com/questions/8492449/…
msigman

38
5 सेकंड के जवाब की तलाश करने वालों के लिए: CultureInfo.InvariantCulture का अर्थ है "मुझे परवाह नहीं है, मैं पहली जगह में संस्कृति को शामिल नहीं करना चाहता। अब मुझे गूंगा चीज़ का उपयोग करने दें।"
एंड्रयू

5
@ क्या आप एमएस के सभी डॉक्स, pls को फिर से लिख सकते हैं?
येट्रिक्स

3
@ येट्रिक्स हाँ, ज़रूर बात। मुझे खुशी होगी! कौन चुका रहा है?
एंड्रयू

जवाबों:


154

सभी संस्कृतियाँ दिनांक और दशमलव / मुद्रा मानों के लिए समान प्रारूप का उपयोग नहीं करती हैं।

आपके लिए यह तब मायने रखेगा जब आप इनपुट वैल्यू (रीड) को कंवर्ट कर रहे हैं DateTime, जिसे स्ट्रिंग्स टू float, doubleया के रूप में स्टोर किया जाता है decimal। यह भी मायने रखेगा कि यदि आप डिस्प्ले या स्टोरेज के लिए उपरोक्त डेटा प्रकारों को स्ट्रिंग्स (लिखने) में प्रारूपित करने का प्रयास करते हैं ।

यदि आप जानते हैं कि आपकी विशिष्ट तिथियां और दशमलव / मुद्रा मान किस समय से पहले होंगे, तो आप उस विशिष्ट CultureInfoसंपत्ति (यानी CultureInfo("en-GB")) का उपयोग कर सकते हैं । उदाहरण के लिए यदि आप उपयोगकर्ता इनपुट की अपेक्षा करते हैं।

CultureInfo.InvariantCultureसंपत्ति यदि आप स्वरूपण कर रहे हैं या एक स्ट्रिंग कि उपयोगकर्ता की स्थानीय सेटिंग की सॉफ्टवेयर स्वतंत्र का एक टुकड़ा द्वारा parseable होना चाहिए को पार्स किया जाता है।

डिफ़ॉल्ट मान CultureInfo.InstalledUICultureतो डिफ़ॉल्ट कल्चरइन्फो है जो निष्पादन ओएस की सेटिंग्स पर निर्भर करता है। यही कारण है कि आपको हमेशा यह सुनिश्चित करना चाहिए कि संस्कृति की जानकारी आपके इरादे के अनुकूल हो ( एक अच्छे दिशानिर्देश के लिए मार्टिन का जवाब देखें)।


3
"एन-यूएस" हालांकि, मुझे लगता है कि यह वास्तव में आपके सिस्टम सेटिंग्स पर निर्भर हो सकता है।
ट्रैकर 1

44
डिफ़ॉल्ट मान नहीं है en-US। यह स्थानीय संस्कृति है। और InvariantCultureइसका उपयोग तब किया जाता है जब आप संस्कृति तटस्थ स्वरूपण चाहते हैं जो स्थानीय प्रणाली से स्वतंत्र है। उदाहरण के लिए जब पाठ आधारित फ़ाइल स्वरूपों के साथ काम करना।
कोडइन्चोस

23
@CodesInChaos टिप्पणी में जोड़ने के लिए: दावा है कि डिफ़ॉल्ट मान CultureInfo ("एन-यूएस") बस गलत है। इसके अलावा, कथन The CultureInfo.InvariantCulture प्रॉपर्टी का उपयोग तब किया जाता है जब आप निश्चित समय से पहले सुनिश्चित नहीं होते हैं कि आपकी तिथियां और दशमलव / मुद्रा मान किस संस्कृति के प्रारूप में हैं। वर्तमान, इनवेरिएंट या विशिष्ट संस्कृति का उपयोग करना एक ऐसी चीज है जो एक सचेत निर्णय होना चाहिए, और यदि आपको यह गलत लगता है तो आप अपने (गैर-यूएस) उपयोगकर्ताओं को अलग कर सकते हैं। यदि आप "अनिश्चित" हैं तो आपको अपरिवर्तनीय संस्कृति का उपयोग नहीं करना चाहिए। आपको समय से पहले सुनिश्चित होना चाहिए।
मार्टिन लीवरेज

3
-1 अन्य टिप्पणियों में उल्लिखित मुद्दों के कारण। मार्टिन का उत्तर अधिक सहायक है क्योंकि यह आपको बताता है कि प्रत्येक संस्कृति का उपयोग कब करना है और क्या नहीं।
एड ग्रीव्स

"यदि आप विशेष रूप से अमेरिकी अंग्रेजी में काम कर रहे हैं, तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।": गलत है, आप विशेष रूप से अमेरिकी अंग्रेजी में काम कर सकते हैं, लेकिन सॉफ्टवेयर "एन-जीबी" या "डी" पर चल सकता है। -de "सर्वर है, तो यह एक फर्क होगा, के साथ साथ यह ग्राहक की संस्कृति ले जा सकते हैं (यदि आप कहते हैं कि इतना web.config फ़ाइल में), और कहा कि नहीं हो सकता है" en-US "या तो ...
स्टीफन स्टीगर

151

जब संख्याओं, तिथियों और समयों को स्ट्रिंग्स में स्वरूपित किया जाता है या स्ट्रिंग्स से पार्स किया जाता है तो यह निर्धारित करने के लिए एक संस्कृति का उपयोग किया जाता है कि यह कैसे किया जाता है। जैसे प्रमुख en-USसंस्कृति में आपके पास ये स्ट्रिंग प्रतिनिधित्व हैं:

  • 1,000,000.00 - दो अंकों के अंश के साथ एक मिलियन
  • 1/29/2013 - इस पोस्टिंग की तारीख

मेरी संस्कृति में ( da-DK) मानों में यह स्ट्रिंग प्रतिनिधित्व है:

  • 1.000.000,00 - दो अंकों के अंश के साथ एक मिलियन
  • 29-01-2013 - इस पोस्टिंग की तारीख

विंडोज ऑपरेटिंग सिस्टम में उपयोगकर्ता यह भी अनुकूलित कर सकता है कि नंबर और दिनांक / समय को कैसे स्वरूपित किया जाए और वह अपने ऑपरेटिंग सिस्टम की संस्कृति की तुलना में किसी अन्य संस्कृति को भी चुन सकता है। उपयोग किया जाने वाला स्वरूपण उपयोगकर्ता का विकल्प है कि यह कैसा होना चाहिए।

इसलिए जब आप उदाहरण के लिए ToStringया String.Formatस्ट्रिंग का उपयोग करके DateTime.Parseया Decimal.Parseडिफ़ॉल्ट रूप से उपयोग करने के लिए उपयोगकर्ता के लिए प्रदर्शित होने के लिए एक मान को प्रारूपित करते हैं तो इसका उपयोग करना है CultureInfo.CurrentCulture। यह उपयोगकर्ता को स्वरूपण को नियंत्रित करने की अनुमति देता है।

हालाँकि, बहुत सारे स्ट्रिंग स्वरूपण और पार्सिंग वास्तव में अनुप्रयोग और उपयोगकर्ता के बीच लेकिन एप्लिकेशन और कुछ डेटा प्रारूप (जैसे XML या CSV फ़ाइल) के बीच बदले गए तार नहीं हैं। उस स्थिति में आप उपयोग नहीं करना चाहते हैं CultureInfo.CurrentCultureक्योंकि यदि विभिन्न संस्कृतियों के साथ स्वरूपण और पार्सिंग किया जाता है तो यह टूट सकता है। उस स्थिति में आप उपयोग करना चाहते हैं CultureInfo.InvariantCulture(जो कि en-USसंस्कृति पर आधारित है)। यह सुनिश्चित करता है कि मान समस्याओं के बिना गोल कर सकते हैं।

कारण यह है कि ReSharper आप चेतावनी देता है कि कुछ आवेदन लेखकों इस तरह के अंतर जो अनपेक्षित परिणामों को जन्म दे सकती से अनजान हैं, लेकिन वे इस खोज में कभी नहीं है क्योंकि उनके है CultureInfo.CurrentCultureहै en-USजो के रूप में ही व्यवहार है CultureInfo.InvariantCulture। हालाँकि, जैसे ही एप्लिकेशन का उपयोग किसी अन्य संस्कृति में किया जाता है, जहाँ प्रारूपण के लिए एक संस्कृति का उपयोग करने का अवसर होता है और दूसरे के लिए एप्लिकेशन को पार्स करने का अवसर टूट सकता है।

तो इसे योग करने के लिए:

  • CultureInfo.CurrentCultureयदि आप किसी उपयोगकर्ता स्ट्रिंग को प्रारूपित या पार्स कर रहे हैं तो (डिफ़ॉल्ट) का उपयोग करें ।
  • उपयोग करें CultureInfo.InvariantCultureयदि आप एक स्ट्रिंग को स्वरूपित या पार्स कर रहे हैं जो सॉफ्टवेयर के एक टुकड़े से पार्स करने योग्य होना चाहिए।
  • शायद ही कभी एक विशिष्ट राष्ट्रीय संस्कृति का उपयोग किया जाता है क्योंकि उपयोगकर्ता यह नियंत्रित करने में असमर्थ है कि प्रारूपण और पार्सिंग कैसे किया जाता है।

1
अंतिम बिंदु के संबंध में, "शायद ही कभी एक विशिष्ट राष्ट्रीय संस्कृति का उपयोग किया जाता है ...", क्या मुद्रा स्वरूपण एक अपवाद होगा? उदाहरण के लिए, यदि मेरे पास Decimalअमेरिकी डॉलर में एक निश्चित मूल्य वाला एक चर है, तो क्या मैं यह सुनिश्चित करने के लिए एक अपवाद का उपयोग करना en-USऔर संस्कृति के रूप में उपयोग करना चाहूंगा, यह सुनिश्चित करने के लिए कि मुझे एक परिणाम नहीं मिलता है जो यूरो में एक नंबर की तरह दिखता है? मैंने कोशिश की CultureInfo.InvariantCulture , लेकिन यह मुद्रा मार्कर के लिए मिला ¤, इसलिए मुझे यकीन नहीं है कि यह सही तरीका है।
जेफ बी

1
@JeffBridgman: मेरी सलाह सिर्फ सामान्य सलाह है और आपके विशिष्ट मामले पर लागू नहीं हो सकती है। हालाँकि, मुझे लगता है कि जिस तरह से आप दशमलव बिंदु (कॉमा या डॉट) प्रदर्शित करते हैं, वह कुछ ऐसा होना चाहिए जो उपयोगकर्ता नियंत्रित करता है (उदाहरण के लिए उपयोग करें CultureInfo.CurrentCulture)। यदि आप एक नंबर को प्रदर्शित करने के अलावा मुद्रा की आवश्यकता है, तो शायद आपको यह करना चाहिए कि एक सुसंगत तरीके से, अर्थात एक का उपयोग नहीं करना चाहिए CultureInfoऔर इसके बजाय तीन अक्षर मुद्रा कोड का उपयोग करना चाहिए USD 1,234.56। फिर आप किसी संस्कृति की मुद्रा को मैप करने की समस्याओं में नहीं पड़ते।
मार्टिन लेविस

26

Microsoft के अनुसार:

CultureInfo.InvariantCulture संपत्ति न तो तटस्थ है और न ही विशिष्ट संस्कृति है। यह तीसरे प्रकार की संस्कृति है जो संस्कृति-असंवेदनशील है। यह अंग्रेजी भाषा से जुड़ा है, लेकिन किसी देश या क्षेत्र के साथ नहीं।

( http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx से )

तो InvariantCulture संस्कृति "एन-यूएस" के लिए similair है, लेकिन बिल्कुल समान नहीं है। यदि आप लिखते हैं:

var d = DateTime.Now;
var s1 = d.ToString(CultureInfo.InvariantCulture);   // "05/21/2014 22:09:28"
var s2 = d.ToString(new CultureInfo("en-US"));       // "5/21/2014 10:09:28 PM"

तब s1 और s2 में सिमिलर प्रारूप होगा, लेकिन InvariantCulture प्रमुख शून्य और "en-US" AM या PM का उपयोग करता है।

इसलिए आंतरिक उपयोग के लिए InvariantCulture बेहतर है, जब आप उदाहरण के लिए किसी पाठ-फ़ाइल या पार्स डेटा को एक तारीख बचाता है। और एक निर्दिष्ट कल्चरइन्फो बेहतर है जब आप अंतिम उपयोगकर्ता को डेटा (दिनांक, मुद्रा ...) प्रस्तुत करते हैं।


3
मैंने पुष्टि करने के लिए आपका उदाहरण कोड चलाया: InvariantCulture ISO 8601 वर्ष-पहले-पहले प्रारूप का अनुसरण करने के बजाय अमेरिकी MM / dd / yyyy का उपयोग करता है। इसके बावजूद यह मानव उपभोग के बजाय पोर्टेबल भंडारण और यांत्रिक प्रसंस्करण के लिए अभिप्रेत है। कैसे भ्रमित
मैक्स Barraclough

4

संख्याओं (दशमलव अंक, मात्रा में अल्पविराम) जैसी चीजों के लिए, वे आमतौर पर विशिष्ट संस्कृति में पसंद किए जाते हैं।

इसे करने का एक उपयुक्त तरीका इसे संस्कृति के स्तर (जर्मन के लिए) पर इस तरह सेट किया जाएगा:

Thread.CurrentThread.CurrentCulture.NumberFormat = new CultureInfo("de").NumberFormat;

4

JetBrains एक उचित स्पष्टीकरण प्रदान करते हैं ,

"पाठ के लिए डेटा संरचनाओं का तदर्थ रूपांतरण वर्तमान संस्कृति पर काफी हद तक निर्भर है, और कोड के एक मशीन पर निष्पादित होने पर अनपेक्षित परिणाम हो सकते हैं, जिसका स्थानीय मूल डेवलपर से भिन्न होता है। अस्पष्टता को रोकने के लिए, Rehaharper आपको चेतावनी देता है। कोड में कोई भी उदाहरण जहां इस तरह की समस्या हो सकती है। "

लेकिन अगर मैं एक ऐसी साइट पर काम कर रहा हूं जो मुझे पता है कि केवल अंग्रेजी में होगी, तो मैं सिर्फ सुझाव को नजरअंदाज करता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.