বর্তমান দশমিক বিভাজক কোনটি?


29

বলুন আমার কাছে একটি পসিক্স শেল স্ক্রিপ্ট রয়েছে

  1. আমি নিয়ন্ত্রণ করি না এমন বিভিন্ন সিস্টেম / পরিবেশে চালানো দরকার এবং
  2. লোকাল সেটিংসকে সম্মান করে এমন একটি প্রোগ্রাম দ্বারা নির্গত স্ট্রিং থেকে দশমিক বিভাজককে সরিয়ে ফেলতে হবে।

আমি কীভাবে সর্বাধিক সাধারণভাবে দশমিক বিভাজক সনাক্ত করতে পারি?


কী ধরণের স্ক্রিপ্ট? কোথায় চলছে? আপনার প্রশ্নটি আপডেট করুন, যাতে এটির উত্তর দেওয়া যায়।
এক্স টিয়ান

@ এক্সটিয়ান একটি জেনেরিক শেল স্ক্রিপ্ট, এটি ইউনিক্স / লিনাক্স সিস্টেমে চলছে। My আমি আমার ইচ্ছাকৃতভাবে সবচেয়ে সাধারণ উপায়ে প্রশ্ন উত্থাপন করেছি কারণ আমি আমার সাধারণ উত্তর সম্পর্কে আগ্রহী, যেমন আমি আমার প্রশ্নের শেষ লাইনে উল্লেখ করেছি।
gboffi

1
@ স্টাফেনচেজেলাস একটি পসিক স্ক্রিপ্ট! সত্য, আমি ভুলে গিয়েছিলাম যে আমি tcsh... ব্যবহার করতাম, ওহ আমার, আপনি অবশ্যই বলতে পারেন যে আমি বয়স্ক হয়েছি !!!
জিবিফফি

1
আপনি কি LC_ALL=Cপরিবেশের অধীনে স্ট্রিং-নির্গত প্রোগ্রামটি চালাতে পারবেন না ?
gel

@ অ্যাঞ্জেল ওহ হ্যাঁ, অবশ্যই আমি পারতাম ...
জিবিফফি

উত্তর:


43

জিজ্ঞাসা করুন locale:

locale decimal_point

এটি বর্তমান লোকেল সেটিংস ব্যবহার করে দশমিক পয়েন্ট আউটপুট দেবে।

আপনার যদি হাজার হাজার বিভাজক প্রয়োজন:

locale thousands_sep

2
এবং কমপক্ষে localeGNU এর সাথে libc, locale -k LC_NUMERICLC_NUMERIC বিভাগে সমস্ত লোকাল সেটিংস তালিকা করতে।
স্টাফেন চেজেলাস

3
তা অংশ @Kusalananda POSIX
স্টিফেন কিট

3
@ মুরু printf "%'f"এটি printfবাস্তবায়ন করবে যা সমর্থন করে %f
স্টিফেন কিট

2
@muru শুধুমাত্র builtin যে আমি জানি, যে করতে পারেন আউটপুট একটি দশমিক বিভাজক হয় printfএবং কিছু শেল (যেমন, dash) আন্তর্জাতিক আউটপুট সমর্থন করি না। অন্য উত্তরে স্টাফেন চেজেলাস একটি মন্তব্যে ব্যাখ্যা করেছেন, এটি
পসিক্স

1
পছন্দ করেছেন এটা ঠিক আজব যে আমি এর আগে এসে পৌঁছেছি না। এটি এমন কোনও সহায়তা করে না যে আমি এমন একটি সিস্টেমে রয়েছি যেখানে এর ব্যবহার localeসমর্থিত নয়।
কুসালানন্দ

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 শেল দিয়ে ব্যবহারকারীর লোকেল ফর্ম্যাট থেকে কোনও লোকাল ফর্ম্যাট থেকে কোনও নম্বর রূপান্তর করতে, আপনি এটি এর মতো করতে পারেন:

$ 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
@ জিবিফফি, এটি কিছু আন্তর্জাতিকীকরণ printfবাস্তবায়নে কাজ করবে যা সমর্থন করে %f, তবে সবকটিই নয়। %fসমর্থন পসিক্স দ্বারা বাধ্যতামূলক নয়। printfএর dashউদাহরণস্বরূপ সবসময় ব্যবহার.
Stéphane Chazelas

পুনরায় dashআন্তর্জাতিকীকরণ করা হয়নি ... আমি সবেমাত্র পেয়েছি ... সুতরাং সর্বাধিক সাধারণ সমাধানটি অবলম্বন করছে locale decimal_point, তাই না?
gboffi

@ জিবিফফি, সম্ভবত জিএনইউ awkপসিক্স মোডে থাকার সাথে বর্তমান লোকালে সংখ্যার ব্যাখ্যা করতে পারে (যদিও হাজার বিভাজকটি পরিচালনা করে না)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.