তাত্পর্যপূর্ণ স্বরলিপি থেকে একটি সংখ্যা পার্স করুন


88

আমার দশমিক ডেটা টাইপের "1.2345E-02" স্ট্রিংটি (এক্সফেনশনাল নোটেশনে প্রকাশিত একটি সংখ্যা) পার্স করা দরকার তবে Decimal.Parse("1.2345E-02")কেবল একটি ত্রুটি ছুঁড়ে ফেলা উচিত

উত্তর:



50

আপনি উল্লেখ করলে এটি কাজ করে NumberStyles.Float:

decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float);
Console.WriteLine(x); // Prints 0.012345

এটি সম্পূর্ণরূপে নিশ্চিত নই কেন এটি ডিফল্টরূপে সমর্থিত নয় - ডিফল্টটি ব্যবহার করা হয় NumberStyles.Number, যা AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint এবং AllowTh হাজার হাজার শৈলী ব্যবহার করে। সম্ভবত এটি কার্য সম্পাদন সম্পর্কিত; আমি মনে করি যে কোনও অভিজাতকে উল্লেখ করা তুলনামূলকভাবে বিরল।


আমি ডাবল দিয়ে এই কাজটি করার চেষ্টা করছি তবে মনে হয় এটি হবে না। নিশ্চিত না কেন পারল না ..?
JanT

@ জান্ট: "এটি হবে না" এবং "এটি করতে পারে না" এর চেয়ে বেশি কোনও তথ্য না দিয়ে আমি সত্যিই আরও সাহায্য করতে পারি না। আমি আপনাকে পরামর্শ দিয়েছি যে আপনি কী চেষ্টা করেছেন এবং ঠিক কী ঘটেছে তা প্রদর্শন করে আপনাকে আরও বিস্তারিতভাবে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন।
জন স্কিটি 5'19

আমি আপনার উত্তরের মতো কোড চালানোর চেষ্টা করেছি তবে ডেসিমেলের পরিবর্তে ডাবল ব্যবহার করেছি। তবে ইতিমধ্যে কার্যকর। চিয়ার্স
1919

4
@ জ্যান্ট আপনি নিজের কাজের অংশীদারি করতে পারলে ভালো লাগবে। আমার ঠিক একই সমস্যা আছে এবং তথ্যটি ব্যবহার করতে পারি। ধন্যবাদ!
রিক গ্লিমার

@ রিকগ্লিমার: আমি নিশ্চিত না যে আপনি কীভাবে জানবেন যে আপনার সমস্যাটি জান্টের মতো ঠিক তেমনই রয়েছে, কারণ তারা কখনই তারা যা করার চেষ্টা করছে তার বিশদ সরবরাহ করে নি। আমার কোডের decimalসাথে প্রতিস্থাপন করা doubleআমার পক্ষে ঠিক কাজ করে, যেমনটি আমি এটি আশা করতাম। আপনি প্রদান করতে পারে এমন বিবরণ আপনি করার চেষ্টা করছেন কি, কোড আপনি ব্যবহার করছেন, এবং ফলাফল, এটা অনেক সাহায্য করা আরো সহজ হবে।
জন স্কিটি

35

নম্বর স্টাইলগুলি নির্দিষ্ট করে দেওয়ার পাশাপাশি আমি আপনাকে সুপারিশ করব যে আপনি দশমিকটি ব্যবহার করুন ry ট্রাইপার্স ফাংশন যেমন:

decimal result;
if( !decimal.TryParse("1.2345E-02", NumberStyles.Any, CultureInfo.InvariantCulture, out result) )
{
     // do something in case it fails?
}

নাম্বার স্টাইলস এর বিকল্প হিসাবে.আপনি আপনার ফর্ম্যাটগুলির বিষয়ে নিশ্চিত হন তবে আপনি একটি নির্দিষ্ট সেট ব্যবহার করতে পারেন। যেমন:

NumberStyles.AllowExponent | NumberStyles.Float

4
তবে এটি AllowExporter সহ ফ্লোট ব্যবহার করার প্রয়োজন নেই কারণ ফ্লোট = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowDecimalPoint | মঞ্জুরিপ্রদানকারী
লুকা

@ Luukkmoch সত্যিই আপনি ঠিক বলেছেন। অন্যদের হিসাবে অভ্যাস জোর করা (যে কোনওটি বাদে) এটি অন্তর্ভুক্ত করে না। অতিরিক্ত বা যদিও সম্পাদন করতে আঘাত করা উচিত নয়।
Sverrir সিগমুন্দরসন


9

নির্বাচিত উত্তর সম্পর্কে সতর্ক থাকুন: একটি সাবটিলিটি নির্দিষ্ট করে আছে সিস্টেম রয়েছে G গ্লোবালাইজেশন স্টাইলস ফ্ল্যাট P পার্স যা কোনও সিস্টেমের দিকে নিয়ে যেতে পারে For

উদাহরণস্বরূপ, ফরাসি স্বরলিপিতে, "1.2345E-02" অবৈধ, আপনাকে প্রথমে এটি "1,2345E-02" তে রূপান্তর করতে হবে।

উপসংহারে, এর লাইনে কিছু ব্যবহার করুন:

Decimal.Parse(valueString.Replace('.',','), System.Globalization.NumberStyles.Float);

4
আপনি একদম ঠিক বলছেন. অন্য কেউ কেন এনেছিল তা আমি বুঝতে পারি না।
Carles Alcolea


4

আমি খুঁজে পেয়েছি যে NumberStyles.Floatকিছু ক্ষেত্রে, স্ট্রিং প্রক্রিয়াজাতকরণের নিয়মগুলি পরিবর্তিত করে এবং এর থেকে পৃথক আউটপুট তৈরি হয় NumberStyles.Number(এর দ্বারা ব্যবহৃত ডিফল্ট বিধিগুলিdecimal.Parse )।

উদাহরণস্বরূপ, নিম্নলিখিত কোডগুলি FormatExceptionআমার মেশিনে একটি উত্পন্ন করবে :

CultureInfo culture = new CultureInfo("");
culture.NumberFormat.NumberDecimalDigits = 2;
culture.NumberFormat.NumberDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = ",";
Decimal.Parse("1,234.5", NumberStyles.Float, culture); // FormatException thrown here

আমি ইনপুটটি ব্যবহার করার পরামর্শ দেব NumberStyles.Number | NumberStyles.AllowExponent, কারণ এটি ক্ষতিকারক সংখ্যার অনুমতি দেবে এবং decimalনিয়মের আওতায় স্ট্রিংটি প্রক্রিয়া করবে ।

CultureInfo culture = new CultureInfo("");
culture.NumberFormat.NumberDecimalDigits = 2;
culture.NumberFormat.NumberDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = ",";
Decimal.Parse("1,234.5",NumberStyles.Number | NumberStyles.AllowExponent, culture); // Does not generate a FormatException

পোস্টারের প্রশ্নের উত্তর দেওয়ার জন্য পরিবর্তে সঠিক উত্তরটি হওয়া উচিত:

decimal x = decimal.Parse("1.2345E-02", NumberStyles.Number | NumberStyles.AllowExponent);
Console.WriteLine(x);

1

নাম্বার স্টাইল ব্যবহার করার বিষয়ে সতর্কতা Aএই:

"6.33E + 03" প্রত্যাশা অনুযায়ী 6330 এ রূপান্তর করে। জার্মান ভাষায়, দশমিক পয়েন্টগুলি কমা দ্বারা প্রতিনিধিত্ব করা হয়, তবে 6,33E + 03 633000 এ রূপান্তর করে! এটি আমার গ্রাহকদের জন্য সমস্যা, যেহেতু সংস্কৃতি যা ডেটা উত্পন্ন করে তা জানা যায়নি এবং ডেটাতে পরিচালিত সংস্কৃতি থেকে আলাদা হতে পারে। আমার ক্ষেত্রে, আমার কাছে সর্বদা বৈজ্ঞানিক স্বরলিপি রয়েছে, তাই আমি বিশ্লেষণের আগে আমি সর্বদা কমাটি দশমিক বিন্দুতে প্রতিস্থাপন করতে পারি তবে আপনি যদি স্বেচ্ছাসেবী সংখ্যাগুলির সাথে কাজ করছেন তবে 1,234,567 এর মতো সুন্দর-ফর্ম্যাট সংখ্যার মতো সেই পদ্ধতির কাজ হয় না।


0

আপনার বিন্দুগুলি প্রতিস্থাপন করতে হবে না (যথাক্রমে কমা) কেবলমাত্র ইনপুটটি আইফোর্মেটপ্রাইডার নির্দিষ্ট করে:

float d = Single.Parse("1.27315", System.Globalization.NumberStyles.Float, new CultureInfo("en-US"));
float d = Single.Parse("1,27315", System.Globalization.NumberStyles.Float, new CultureInfo("de-DE"));

0

আপনি যদি চেক এবং রূপান্তর করতে চান তবে এটি ব্যবহার করুন value

string val = "1.2345E-02";
double dummy;
bool hasExponential = (val.Contains("E") || val.Contains("e")) && double.TryParse(val, out dummy);
if (hasExponential)
{
    decimal d = decimal.Parse(val, NumberStyles.Float);
}

আশা করি এটি কাউকে সাহায্য করবে।


0

এর NumberStyleজন্য ডিফল্ট decimal.Parse(String)হ'ল NumberStyles.Numberতাই আপনি যদি কেবল এক্সপোশনগুলিকে অনুমতি দেওয়ার জন্য কার্যকারিতা যুক্ত করতে চান তবে আপনি কিছুটা দিক দিয়ে বা এতে অন্তর্ভুক্ত করতে পারেন NumberStyles.AllowExponent

decimal d = decimal
    .Parse("1.2345E-02", NumberStyles.Number | NumberStyles.AllowExponent);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.