वर्तमान दशमलव विभाजक कौन सा है?


29

कहो कि मेरे पास एक POSIX शेल स्क्रिप्ट है

  1. विभिन्न प्रणालियों / वातावरणों पर चलने की आवश्यकता है जिन्हें मैं नियंत्रित नहीं करता हूं, और
  2. दशमलव विभाजक को एक स्ट्रिंग से निकालने की जरूरत है जो एक प्रोग्राम द्वारा उत्सर्जित होती है जो स्थानीय सेटिंग्स का सम्मान करती है।

मैं सबसे सामान्य तरीके से दशमलव विभाजक का पता कैसे लगा सकता हूं?


किस तरह की स्क्रिप्ट? यह कहां चल रहा है? कृपया अपना प्रश्न अपडेट करें, ताकि इसका उत्तर दिया जा सके।
एक्स टियान

@ XTian एक सामान्य शेल स्क्रिप्ट, जो एक यूनिक्स / लिनक्स सिस्टम पर चल रही है। Ately मैंने जानबूझकर प्रश्न को सबसे सामान्य तरीके से प्रस्तुत किया क्योंकि मुझे सबसे सामान्य उत्तर में दिलचस्पी है, जैसा कि मैंने अपने प्रश्न की अंतिम पंक्ति में निर्दिष्ट किया है।
gboffi

1
@ स्टीफनचेलजेलस एक पोसिक्स स्क्रिप्ट! ईमानदारी से, मैं भूल गया कि मैं tcsh... में उपयोग करता था, ओह मेरी, आप निश्चित रूप से कह सकते हैं कि मैं OLD हूँ !!!
gboffi

1
क्या आप LC_ALL=Cपर्यावरण के तहत स्ट्रिंग-उत्सर्जित कार्यक्रम नहीं चला सकते हैं?
Ángel

@ ...
Ngel

जवाबों:


43

पूछो locale:

locale decimal_point

यह वर्तमान स्थानीय सेटिंग्स का उपयोग करके दशमलव बिंदु को आउटपुट करेगा।

यदि आपको हजारों विभाजक चाहिए:

locale thousands_sep

2
और कम से कम localeजीएनयू से libc, locale -k LC_NUMERICLC_NUMERIC श्रेणी की सभी स्थानीय सेटिंग्स को सूचीबद्ध करने के लिए।
स्टीफन चेजालस

3
@ कुसलानंद यह POSIX का हिस्सा है ।
स्टीफन किट

3
@ एमआरयू printf "%'f"इसे करेगा, printfकार्यान्वयन के लिए जो समर्थन करते हैं %f
स्टीफन किट

2
@muru केवल builtin है कि मैं के बारे में पता है कि कर सकते हैं उत्पादन एक दशमलव विभाजक, है printfऔर कुछ खोल (जैसे, dash) अंतर्राष्ट्रीय उत्पादन का समर्थन नहीं करते। एक अन्य जवाब में स्टीफन चेज़लस ने एक टिप्पणी में बताया, कि यह POSIX द्वारा आवश्यक नहीं है
gboffi

1
@StephenKitt तो यह है। यह सिर्फ इतना अजीब है कि मैं इसके पहले नहीं आया हूं। यह मदद नहीं करता है कि मैं एक ऐसी प्रणाली पर हूँ जहाँ वह उपयोग localeसमर्थित नहीं है।
Kusalananda

6

यदि यह एक zshशेल स्क्रिप्ट है, तो आप मॉड्यूल $langinfoमें विशेष साहचर्य सरणी का उपयोग कर सकते हैं zsh/langinfo:

zmodload zsh/langinfo
radix=$langinfo[RADIXCHAR]

(मानक के नक्शे nl_langinfo(RADIXCHAR), man nl_langinfoविवरण के लिए अपने सिस्टम पर देखें; $langinfo[THOUSEP]हजार विभाजक के लिए)।

एक bashस्क्रिप्ट में (और यह भी काम करेगा zsh), आपको बिलिन का उपयोग करके एक अलग प्रक्रिया को फोर्क किए बिना इसे प्राप्त करने में सक्षम होना चाहिए printf:

printf -v radix %.1f 1 && radix=${radix:1:1}

Ksh93 शेल के साथ उपयोगकर्ता के लोकल फॉर्मेट के नंबर को C लोकेल फॉर्मेट में बदलने के लिए, आप ऐसा कर सकते हैं:

$ locale title
German locale for Germany
$ x=1.123.456,78 ksh -c 'typeset -F x="$x"; LC_ALL=C; printf "%.23g\n" "$x"'
1123456.78

सबसे सामान्य, यह हो सकता है? tmp=$(printf %.1f 0);tmp=${tmp#0};radix=${tmp%0}
gboffi

1
@goffi, जो कुछ अंतर्राष्ट्रीयकृत printfकार्यान्वयनों में काम करेगा जो समर्थन करते हैं %f, लेकिन सभी नहीं। %fPOSIX द्वारा समर्थन अनिवार्य नहीं है। printfके dashउदाहरण के लिए हमेशा का उपयोग करता है.
स्टीफन Chazelas

फिर से dashअंतर्राष्ट्रीयकरण नहीं किया ... मैंने पाया है कि ... तो सबसे सामान्य समाधान का सहारा ले रहा है locale decimal_point, है ना?
gboffi

@ बाग़ी, शायद। GNU awk, POSIX मोड में (जब हजार विभाजक नहीं संभालता है) के साथ वर्तमान लोकेल में संख्याओं की व्याख्या कर सकता है।
स्टीफन चेजालस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.