দশমিক পয়েন্টের সাথে একটি ডাবলকে আমি কীভাবে একটি স্ট্রিং পার্স করব?


230

আমি এর মতো একটি স্ট্রিং পার্স করতে চাই "3.5" একটি ডাবল । যাহোক,

double.Parse("3.5") 

ফলন 35 এবং

double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint) 

নিক্ষেপ a FormatException

এখন আমার কম্পিউটারের লোকেল জার্মানিতে সেট করা আছে, যেখানে দশমিক বিভাজক হিসাবে কমা ব্যবহৃত হয়। এটি এর সাথে কিছু করতে পারেdouble.Parse()"3,5" ইনপুট হিসাবে প্রত্যাশার তবে আমি নিশ্চিত নই।

দশমিক সংখ্যাযুক্ত একটি স্ট্রিংকে আমি কীভাবে পার্স করতে পারি যা আমার বর্তমান লোকালে বর্ণিত ফর্ম্যাট হতে পারে বা নাও পারে?


দশমিক কমা অবশ্যই আউটপুটকে প্রভাবিত করবে।
ক্রিসএফ

12
দ্বিগুণ সম্পর্কে ভুলে যাবেন না ry ট্রাইপার্স () পদ্ধতিটি যদি এটি আপনার পরিস্থিতির জন্য উপযুক্ত হয়।
কাইল গ্যাগনেট

উত্তর:


414
double.Parse("3.5", CultureInfo.InvariantCulture)

আমি XmlConvertক্লাসটি ব্যবহার করতে পছন্দ করি ... এটির চেয়ে আরও ভাল, খারাপ, এবং / অথবা ব্যবহারের চেয়ে আলাদা কি আপনার কোনও ধারণা আছে CultureInfo.InvariantCulture?
ক্রিসডাব্লু

1
ঠিক আছে, XmlConvertকোডটিতে একটি একক দ্বৈত মানকে বিশ্লেষণ করার জন্য সত্যই ব্যবহৃত হয় না। আমি ব্যবহার করতে পছন্দ করি double.Parseবা Convert.ToDoubleএটি আমার উদ্দেশ্যটি সুস্পষ্ট করে তোলে।
মেহরদাদ আফশারি

4
এর অর্থ ডাবল। পার্স ডিফল্ট সংস্কৃতি ব্যবহার করে যার দশমিক বিন্দু হিসাবে বিন্দু থাকতে পারে না ??
আহমেদ

3
যদি 12345678.12345678 রূপান্তর করা হয়, এটি খুব রূপান্তরিত হয় 12345678.123457
PUG

4
আমার পক্ষে কাজ করেনি: কমা এবং রিটার্ন এবং
এন্টি

75

আমি সাধারণত ব্যবহারকারী ইনপুট পার্স করার জন্য একটি বহু সংস্কৃতি ফাংশন ব্যবহার করি, বেশিরভাগ কারণ যদি কেউ নামপ্যাডে অভ্যস্ত হয় এবং এমন সংস্কৃতি ব্যবহার করে যা দশমিক বিভাজক হিসাবে কমা ব্যবহার করে, সেই ব্যক্তিটি কমাটির পরিবর্তে নামপ্যাডের বিন্দুটি ব্যবহার করবে।

public static double GetDouble(string value, double defaultValue)
{
    double result;

    //Try parsing in the current culture
    if (!double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.CurrentCulture, out result) &&
        //Then try in US english
        !double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out result) &&
        //Then in neutral language
        !double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture, out result))
    {
        result = defaultValue;
    }

    return result;
}

সাবধান থাকুন, @ নিকি মন্তব্যগুলি সত্য। আমার প্রতিরক্ষার জন্য, আমি এই ফাংশনটি একটি নিয়ন্ত্রিত পরিবেশে ব্যবহার করি যেখানে আমি জানি যে সংস্কৃতিটি এন-ইউএস, এন-সিএ বা ফ্রি-সিএ হতে পারে। আমি এই ফাংশনটি ব্যবহার করি কারণ ফরাসি ভাষায়, আমরা একটি দশমিক বিভাজক হিসাবে কমা ব্যবহার করি, তবে যে কেউ কখনও অর্থায়নে কাজ করেছিল সে সর্বদা নামপ্যাডে দশমিক বিভাজক ব্যবহার করবে, তবে এটি একটি পয়েন্ট, কমা নয়। এমনকি সিআর-সিএ সংস্কৃতিতেও, আমি সংখ্যাকে পার্স করতে হবে যা দশমিক বিভাজক হিসাবে একটি পয়েন্ট থাকবে।


18
আমি নিশ্চিত না যে এটি একটি ভাল ধারণা। আপনি যদি সংস্কৃতিটি না জানেন তবে আপনি নির্ভরযোগ্যভাবে একটি ডাবল পার্স করতে পারবেন না: জার্মানিতে, দ্বিগুণ মানগুলিতে '' 'থাকতে পারে তবে সেগুলিকে সেখানে হাজারো বিভাজক হিসাবে বিবেচনা করা হয়। সুতরাং লেগেটের ক্ষেত্রে, গেটডুবল ("3.5") একটি জার্মান লোকালয়ে 35 এবং ফেরত পরিবেশ-এ পরিবেশে ফিরে আসবে।
নিকি

না, পিয়েরে আলেন ঠিক যেমনটি লিখেছেন ঠিক তেমনি। যদি আপনার সংস্কৃতি বলে যে "বিন্দু হাজার হাজার" বিভাজক, তবে "3.5" "35" হিসাবে দেখা হবে এবং এটি ভাল। তবে আপনি যদি "ডট" এর কোনও নিয়ম হিসাবে সংস্কৃতি না থেকে থাকেন তবে অক্ষরটি দশমিক পয়েন্ট হিসাবে পার্স করা হয় এবং এটিও কার্যকর হয়। আমি এনইউএস সংস্কৃতি চেষ্টা করা এড়ানো যেতাম, তবে এটি ব্যক্তিগত পছন্দ।
xryl669

আপনি যদি কমা সহ সংস্কৃতিতে নামপ্যাড ব্যবহার করেন তবে ডট কীটি কমা সেট করা হবে।
ক্রেজিবারান

নামপ্যাড দশমিক বিভাজক কীবোর্ড লেআউটের উপর নির্ভর করে (এবং আঞ্চলিক সেটিংস নয় - অন্তত উইন্ডোজ 7 এ) (আমি লেখার জন্য হাঙ্গেরিয়ান ব্যবহার করি, ই-মেইল ... এবং কোড লিখতে এন-ইউএস, সুতরাং এটি বিন্দু হতে পারে বা কমা। আমি কাস্টমাইজড আঞ্চলিক সেটিংসও ব্যবহার করি যেখানে আমি দশমিক বিভাজককে ',' থেকে '' থেকে পরিবর্তন করেছি এবং ';' থেকে ',' থেকে বিভাজককে তালিকাবদ্ধ করেছি। আপনি জানেন, সিএসভির কারণ ... আমাদের সকলের জন্য বহু ভাগ্য রইল শুভকামনা -সংস্কৃতি অ্যাপ্লিকেশন;)
স্টিভেন স্পার্ক

25

আমি কোনও মন্তব্য লিখতে পারি নি, তাই আমি এখানে লিখছি:

ডাবল.পার্স ("3.5", সংস্কৃতিInfo.InvariantC সংস্কৃতি) কোনও ভাল ধারণা নয়, কারণ কানাডায় আমরা 3.5 এর পরিবর্তে 3,5 লিখি এবং ফলস্বরূপ এই ফাংশনটি 35 দেয় 35

আমি উভয়ই আমার কম্পিউটারে পরীক্ষা করেছি:

double.Parse("3.5", CultureInfo.InvariantCulture) --> 3.5 OK
double.Parse("3,5", CultureInfo.InvariantCulture) --> 35 not OK

এটি একটি সঠিক উপায় যা পিয়েরে-আলাইন ভিজিয়েন্ট উল্লেখ করেছেন

public static double GetDouble(string value, double defaultValue)
{
    double result;

    // Try parsing in the current culture
    if (!double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.CurrentCulture, out result) &&
        // Then try in US english
        !double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out result) &&
        // Then in neutral language
        !double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture, out result))
    {
        result = defaultValue;
    }
    return result;
}

1
পুনরায়: "... কারণ কানাডায় আমরা 3.5 এর পরিবর্তে 3,5 লিখি" আপনি কি সে সম্পর্কে নিশ্চিত? দশমিক চিহ্ন অনুসারে : "যে দেশগুলিতে একটি বিন্দু"। "দশমিক চিহ্ন হিসাবে ব্যবহৃত হয় সেগুলির মধ্যে রয়েছে ... কানাডা (ইংরাজী ব্যবহার করার সময়)" । এটি কি উইন্ডোজের একটি ফরাসী সংস্করণ ব্যবহার সম্পর্কে বেশি নয়?
পিটার মর্টেনসেন

ফরাসি সংস্করণের কারণে বাইবে। মন্ট্রিলে আমরা লিখি 3,5 3.5 নয়
মালুস জানু

সুতরাং আপনার যুক্তি অনুসারে, সর্বদা তাদের মধ্যে 1 জনই কি সত্য ফিরে আসে?
ব্যাটম্যাকি


এখনও একটি ত্রুটি আছে। গেটডুবলের মতো ইনপুট স্ট্রিংয়ের জন্য ("10% ,,,,,, 0", 0.0)। উল্লিখিত ফাংশনটি 100 প্রদান করে
ক্রেইভার

21
Double.Parse("3,5".Replace(',', '.'), CultureInfo.InvariantCulture)

পার্স করার আগে কমাটি একটি বিন্দুর সাথে প্রতিস্থাপন করুন। দশমিক বিভাজক হিসাবে কমাযুক্ত দেশগুলিতে কার্যকর। ব্যবহারকারীর ইনপুটকে একটি কমা বা বিন্দুতে সীমাবদ্ধ করার বিষয়ে ভাবুন।


1
+133 ভোট রয়েছে তার চেয়ে অনেক বেশি সঠিক উত্তর ... এটি "," বা "উভয় সিস্টেমে বাঁচতে দেয়। দশমিক বিভাজক ...
বদিবয়

@ বদিবয় আপনি এই উত্তরটির কি ভুল তা ব্যাখ্যা করতে পারেন? আমি যেমন বুঝতে পারি ইনভারেন্টাল কালচার সবসময় থাকে '। দশমিক বিভাজক হিসাবে সুতরাং এটি উভয় সিস্টেমের জন্য কাজ করা উচিত।
অ্যালেক্স পি।

@ Alex11223 আপনি ঠিক বলেছেন। এই কারণেই আমি বলেছিলাম যে এই উত্তরটি আরও জনপ্রিয় আর ভাল। পিএস: বন্ধুত্বপূর্ণভাবে এই কোডটি কথা বলার সময়ও যদি আপনার তালিকাভুক্ত SEPARATOR হিসাবে ("1,234,560.01)", "থাকে তবে এটি কীভাবে সমাধান করবেন তা আমি জানি না। :)
বদিবয়

4
এটি কোনও ভাল উত্তর নয় কারণ কিছু সংস্কৃতিতে, হাজার হাজার বিভাজক এবং এটি ব্যবহার করা যেতে পারে। আপনি যদি এটিকে কোনও বিন্দুতে প্রতিস্থাপন করেন তবে আপনার বেশ কয়েকটি বিন্দুর সমাপ্তি ঘটবে এবং পার্স ব্যর্থ হবে: ডাবল P পার্স ((12345.67) St । '।), CultureInfo.InvariantCulture) কারণ (12345.67) .ToString ( "এন", নতুন CultureInfo ( "স্বীকারোক্তি")) প্রতিস্থাপন (', ',' ') "12.345.67" হিসাবে ফরম্যাট করা হবে
codingdave

1,234.56 -> 1.234.56 পার্সার নয়। আরেকটি ধারণা হ'ল সংখ্যায় 'রয়েছে কিনা তা পরীক্ষা করা।' এবং ',' এবং প্রতিস্থাপন ',' খালি স্ট্রিং সহ এবং কেবল যদি ',' উপস্থাপিত উপস্থাপনা এটি 'এ প্রতিস্থাপন করুন'।
জিডোকাল

16

কৌশলটি হ'ল আক্রমণকারী সংস্কৃতি ব্যবহার করা, সমস্ত সংস্কৃতিতে ডটকে পার্স করা।

double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.NumberFormatInfo.InvariantInfo);

11

দেখুন, উপরের প্রতিটি উত্তর যা ধ্রুব স্ট্রিং দ্বারা স্ট্রিং প্রতিস্থাপন লেখার প্রস্তাব দেয় কেবলমাত্র ভুল হতে পারে। কেন? কারণ আপনি উইন্ডোজের অঞ্চল সেটিংসকে সম্মান করেন না! উইন্ডোজ ব্যবহারকারীকে যে বিচ্ছিন্ন চরিত্রটি চায় সেগুলি সেট করার স্বাধীনতা দেওয়ার আশ্বাস দেয়। এস / তিনি কন্ট্রোল প্যানেলটি খুলতে পারবেন, অঞ্চল প্যানেলে যেতে পারবেন, উন্নত ক্লিক করুন এবং যে কোনও সময় চরিত্র পরিবর্তন করতে পারবেন। এমনকি আপনার প্রোগ্রাম চলাকালীন। এই চিন্তা করুন। একটি ভাল সমাধান এ সম্পর্কে সচেতন হতে হবে।

সুতরাং, আপনাকে প্রথমে নিজেকে জিজ্ঞাসা করতে হবে, এই সংখ্যাটি কোথা থেকে আসছে, আপনি পার্স করতে চান। যদি এটি নেট ফ্রেমওয়ার্কের ইনপুট থেকে আসে তবে কোনও সমস্যা নেই, কারণ এটি একই ফর্ম্যাটে থাকবে। তবে সম্ভবত এটি বাইরে থেকে আসছিল, সম্ভবত কোনও বাহ্যিক সার্ভার থেকে, সম্ভবত কোনও পুরানো ডিবি থেকে এসেছে যা কেবল স্ট্রিংয়ের বৈশিষ্ট্য সমর্থন করে। সেখানে, ডিবি অ্যাডমিনকে একটি নিয়ম দেওয়া উচিত ছিল যে বিন্যাসে নম্বরগুলি সংরক্ষণ করতে হবে। আপনি যদি উদাহরণস্বরূপ জানেন যে এটি মার্কিন ফর্ম্যাট সহ একটি ইউএস ডিবি হবে আপনি এই টুকরো কোডটি ব্যবহার করতে পারেন:

CultureInfo usCulture = new CultureInfo("en-US");
NumberFormatInfo dbNumberFormat = usCulture.NumberFormat;
decimal number = decimal.Parse(db.numberString, dbNumberFormat);

এটি বিশ্বের যে কোনও জায়গায় সূক্ষ্মভাবে কাজ করবে। এবং দয়া করে 'কনভার্ট.টক্সএক্সএক্সএক্সএক্সএক্সএক্স' ব্যবহার করবেন না। 'রূপান্তর' শ্রেণিটি কোনও দিকনির্দেশের রূপান্তরগুলির ভিত্তি হিসাবে বিবেচিত thought এছাড়াও: আপনি ডেটটাইমসের জন্যও অনুরূপ প্রক্রিয়াটি ব্যবহার করতে পারেন।


একমত! সংস্কৃতি বৈশিষ্ট্যগুলি ম্যানুয়ালি বাস্তবায়িত করার চেষ্টা অবশেষে এমন একটি ক্ষেত্রে ফলস্বরূপ ঘটবে যা আপনি প্রত্যাশা করেননি এবং একটি বড় মাথা ব্যাথার কারণ হতে পারে। নেট। এটি সঠিকভাবে পরিচালনা করা যাক।
খলোস

2
একটি বড় সমস্যা হ'ল ব্যবহারকারীরা যখন দশমিক
বিভাজককে

3
string testString1 = "2,457";
string testString2 = "2.457";    
double testNum = 0.5;
char decimalSepparator;
decimalSepparator = testNum.ToString()[1];

Console.WriteLine(double.Parse(testString1.Replace('.', decimalSepparator).Replace(',', decimalSepparator)));
Console.WriteLine(double.Parse(testString2.Replace('.', decimalSepparator).Replace(',', decimalSepparator)));

2

এই বিষয়ে আমার দুটি সেন্ট, একটি জেনেরিক, ডাবল রূপান্তর পদ্ধতি সরবরাহ করার চেষ্টা করছে:

private static double ParseDouble(object value)
{
    double result;

    string doubleAsString = value.ToString();
    IEnumerable<char> doubleAsCharList = doubleAsString.ToList();

    if (doubleAsCharList.Where(ch => ch == '.' || ch == ',').Count() <= 1)
    {
        double.TryParse(doubleAsString.Replace(',', '.'),
            System.Globalization.NumberStyles.Any,
            CultureInfo.InvariantCulture,
            out result);
    }
    else
    {
        if (doubleAsCharList.Where(ch => ch == '.').Count() <= 1
            && doubleAsCharList.Where(ch => ch == ',').Count() > 1)
        {
            double.TryParse(doubleAsString.Replace(",", string.Empty),
                System.Globalization.NumberStyles.Any,
                CultureInfo.InvariantCulture,
                out result);
        }
        else if (doubleAsCharList.Where(ch => ch == ',').Count() <= 1
            && doubleAsCharList.Where(ch => ch == '.').Count() > 1)
        {
            double.TryParse(doubleAsString.Replace(".", string.Empty).Replace(',', '.'),
                System.Globalization.NumberStyles.Any,
                CultureInfo.InvariantCulture,
                out result);
        }
        else
        {
            throw new ParsingException($"Error parsing {doubleAsString} as double, try removing thousand separators (if any)");
        }
    }

    return result;
}

এর সাথে প্রত্যাশা অনুযায়ী কাজ করে:

  • 1.1
  • 1,1
  • 1.000.000.000
  • 1.000.000.000
  • 1,000,000,000.99
  • 1.000.000.000,99
  • 5,000,111.3
  • 5.000.111,3
  • 0.99,000,111,88
  • 0,99.000.111.88

কোনো ডিফল্ট রূপান্তর বাস্তবায়িত হয়, তাই এটি বিশ্লেষণ করতে চেষ্টা ব্যর্থ হবে 1.3,14, 1,3.14বা অনুরূপ ক্ষেত্রে।


1
এক হাজার হিসাবে উদ্দিষ্ট "1,000" ব্যর্থ হবে।
Defkon1

1

নিম্নলিখিত কোডটি কোনও পরিস্থিতিতে কাজ করে। এটি কিছুটা পার্সিং করছে।

List<string> inputs = new List<string>()
{
    "1.234.567,89",
    "1 234 567,89",
    "1 234 567.89",
    "1,234,567.89",
    "123456789",
    "1234567,89",
    "1234567.89",
};
string output;

foreach (string input in inputs)
{
    // Unify string (no spaces, only .)
    output = input.Trim().Replace(" ", "").Replace(",", ".");

    // Split it on points
    string[] split = output.Split('.');

    if (split.Count() > 1)
    {
        // Take all parts except last
        output = string.Join("", split.Take(split.Count()-1).ToArray());

        // Combine token parts with last part
        output = string.Format("{0}.{1}", output, split.Last());
    }

    // Parse double invariant
    double d = double.Parse(output, CultureInfo.InvariantCulture);
    Console.WriteLine(d);
}

2
1.234.567.890 1234567.890
ড্যান ভোগেল

আমি চেষ্টা করি নি, তবে আপনি যদি বিভিন্ন সংস্কৃতির এসওগুলিতে অ্যাপটি কার্যকর করেন তবে এই কোডটি কৌশলটি তৈরি করবে না, আমি মনে করি: /
দানি বিশপ

1

আমি মনে করি 100% সঠিক রূপান্তর সম্ভব নয়, যদি কোনও ব্যবহারকারীর ইনপুট থেকে মান আসে। উদাহরণস্বরূপ মানটি যদি 123.456 হয় তবে এটি একটি দলবদ্ধ হতে পারে বা এটি দশমিক পয়েন্ট হতে পারে। আপনার যদি সত্যিই 100% প্রয়োজন হয় তবে আপনার ফর্ম্যাটটি বর্ণনা করতে হবে এবং এটি সঠিক না হলে একটি ব্যতিক্রম ছুঁড়ে ফেলতে হবে।

তবে আমি জানডাব্লু কোডটি উন্নত করেছি, সুতরাং আমরা ১০০% এর থেকে আরও কিছুটা এগিয়ে। পিছনে ধারণাটি হ'ল, যদি শেষ বিভাজক একটি গ্রুপসেপেটর হয় তবে এটি দ্বিগুণের চেয়ে পূর্ণসংখ্যার ধরণ হবে।

যোগ কোড প্রথম হয় যদি এর getdouble

void Main()
{
    List<string> inputs = new List<string>() {
        "1.234.567,89",
        "1 234 567,89",
        "1 234 567.89",
        "1,234,567.89",
        "1234567,89",
        "1234567.89",
        "123456789",
        "123.456.789",
        "123,456,789,"
    };

    foreach(string input in inputs) {
        Console.WriteLine(GetDouble(input,0d));
    }

}

public static double GetDouble(string value, double defaultValue) {
    double result;
    string output;

    // Check if last seperator==groupSeperator
    string groupSep = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator;
    if (value.LastIndexOf(groupSep) + 4 == value.Count())
    {
        bool tryParse = double.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CurrentCulture, out result);
        result = tryParse ? result : defaultValue;
    }
    else
    {
        // Unify string (no spaces, only . )
        output = value.Trim().Replace(" ", string.Empty).Replace(",", ".");

        // Split it on points
        string[] split = output.Split('.');

        if (split.Count() > 1)
        {
            // Take all parts except last
            output = string.Join(string.Empty, split.Take(split.Count()-1).ToArray());

            // Combine token parts with last part
            output = string.Format("{0}.{1}", output, split.Last());
        }
        // Parse double invariant
        result = double.Parse(output, System.Globalization.CultureInfo.InvariantCulture);
    }
    return result;
}

1
        var doublePattern = @"(?<integer>[0-9]+)(?:\,|\.)(?<fraction>[0-9]+)";
        var sourceDoubleString = "03444,44426";
        var match = Regex.Match(sourceDoubleString, doublePattern);

        var doubleResult = match.Success ? double.Parse(match.Groups["integer"].Value) + (match.Groups["fraction"].Value == null ? 0 : double.Parse(match.Groups["fraction"].Value) / Math.Pow(10, match.Groups["fraction"].Value.Length)): 0;
        Console.WriteLine("Double of string '{0}' is {1}", sourceDoubleString, doubleResult);

0

সমস্ত পার্সে একটি লোকেল নির্দিষ্ট করার পরিবর্তে, আমি একটি অ্যাপ্লিকেশন প্রশস্ত লোকেল সেট করতে পছন্দ করি, যদিও স্ট্রিং ফর্ম্যাটগুলি অ্যাপ্লিকেশন জুড়ে সামঞ্জস্য না করে, এটি কাজ নাও করতে পারে।

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("pt-PT");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("pt-PT");

আপনার অ্যাপ্লিকেশন শুরুতে এটি সংজ্ঞায়িত করে সমস্ত ডাবল পার্স দশমিক ডিলিমিটার হিসাবে কমা প্রত্যাশা করে। আপনি একটি উপযুক্ত লোকেল সেট করতে পারেন যাতে দশমিক এবং কয়েক হাজার বিভাজক আপনার পার্সিং করা স্ট্রিংগুলির সাথে ফিট করে।


0

দশমিক বিভাজকটি কী সন্ধান করবেন তা নির্দিষ্ট করে বলা কঠিন, তবে আপনি যদি করেন তবে এটিই আমি ব্যবহার করছি:

    public static double Parse(string str, char decimalSep)
    {
        string s = GetInvariantParseString(str, decimalSep);
        return double.Parse(s, System.Globalization.CultureInfo.InvariantCulture);
    }

    public static bool TryParse(string str, char decimalSep, out double result)
    {
        // NumberStyles.Float | NumberStyles.AllowThousands got from Reflector
        return double.TryParse(GetInvariantParseString(str, decimalSep), NumberStyles.Float | NumberStyles.AllowThousands, System.Globalization.CultureInfo.InvariantCulture, out result);
    }

    private static string GetInvariantParseString(string str, char decimalSep)
    {
        str = str.Replace(" ", "");

        if (decimalSep != '.')
            str = SwapChar(str, decimalSep, '.');

        return str;
    }
    public static string SwapChar(string value, char from, char to)
    {
        if (value == null)
            throw new ArgumentNullException("value");

        StringBuilder builder = new StringBuilder();

        foreach (var item in value)
        {
            char c = item;
            if (c == from)
                c = to;
            else if (c == to)
                c = from;

            builder.Append(c);
        }
        return builder.ToString();
    }

    private static void ParseTestErr(string p, char p_2)
    {
        double res;
        bool b = TryParse(p, p_2, out res);
        if (b)
            throw new Exception();
    }

    private static void ParseTest(double p, string p_2, char p_3)
    {
        double d = Parse(p_2, p_3);
        if (d != p)
            throw new Exception();
    }

    static void Main(string[] args)
    {
        ParseTest(100100100.100, "100.100.100,100", ',');
        ParseTest(100100100.100, "100,100,100.100", '.');
        ParseTest(100100100100, "100.100.100.100", ',');
        ParseTest(100100100100, "100,100,100,100", '.');
        ParseTestErr("100,100,100,100", ',');
        ParseTestErr("100.100.100.100", '.');
        ParseTest(100100100100, "100 100 100 100.0", '.');
        ParseTest(100100100.100, "100 100 100.100", '.');
        ParseTest(100100100.100, "100 100 100,100", ',');
        ParseTest(100100100100, "100 100 100,100", '.');
        ParseTest(1234567.89, "1.234.567,89", ',');    
        ParseTest(1234567.89, "1 234 567,89", ',');    
        ParseTest(1234567.89, "1 234 567.89",     '.');
        ParseTest(1234567.89, "1,234,567.89",    '.');
        ParseTest(1234567.89, "1234567,89",     ',');
        ParseTest(1234567.89, "1234567.89",  '.');
        ParseTest(123456789, "123456789", '.');
        ParseTest(123456789, "123456789", ',');
        ParseTest(123456789, "123.456.789", ',');
        ParseTest(1234567890, "1.234.567.890", ',');
    }

এটি যে কোনও সংস্কৃতির সাথে কাজ করা উচিত। এটি সঠিকভাবে স্ট্র্যাপগুলি বিশ্লেষণ করতে ব্যর্থ হয় যা একাধিক দশমিক বিভাজক থাকে, যা অদলবদলের পরিবর্তে প্রতিস্থাপনের পরিবর্তে কার্যকর হয়।


0

আমি @ জ্যানডাব্লু এর কোডও উন্নত করেছি ...

মেডিক্যাল যন্ত্রপাতি থেকে ফলাফলগুলি ফর্ম্যাট করার জন্য আমার এটি দরকার এবং তারা "> 1000", "23.3e02", "350E-02", এবং "নেজিটিভ" প্রেরণ করে।

private string FormatResult(string vResult)
{
  string output;
  string input = vResult;

  // Unify string (no spaces, only .)
  output = input.Trim().Replace(" ", "").Replace(",", ".");

  // Split it on points
  string[] split = output.Split('.');

  if (split.Count() > 1)
  {
    // Take all parts except last
    output = string.Join("", split.Take(split.Count() - 1).ToArray());

    // Combine token parts with last part
    output = string.Format("{0}.{1}", output, split.Last());
  }
  string sfirst = output.Substring(0, 1);

  try
  {
    if (sfirst == "<" || sfirst == ">")
    {
      output = output.Replace(sfirst, "");
      double res = Double.Parse(output);
      return String.Format("{1}{0:0.####}", res, sfirst);
    }
    else
    {
      double res = Double.Parse(output);
      return String.Format("{0:0.####}", res);
    }
  }
  catch
  {
    return output;
  }
}

-2
System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;

string _pos = dblstr.Replace(".",
    ci.NumberFormat.NumberDecimalSeparator).Replace(",",
        ci.NumberFormat.NumberDecimalSeparator);

double _dbl = double.Parse(_pos);

-3

আমি মনে করি এটি সেরা উত্তর:

public static double StringToDouble(string toDouble)
{
    toDouble = toDouble.Replace(",", "."); //Replace every comma with dot

    //Count dots in toDouble, and if there is more than one dot, throw an exception.
    //Value such as "123.123.123" can't be converted to double
    int dotCount = 0;
    foreach (char c in toDouble) if (c == '.') dotCount++; //Increments dotCount for each dot in toDouble
    if (dotCount > 1) throw new Exception(); //If in toDouble is more than one dot, it means that toCount is not a double

    string left = toDouble.Split('.')[0]; //Everything before the dot
    string right = toDouble.Split('.')[1]; //Everything after the dot

    int iLeft = int.Parse(left); //Convert strings to ints
    int iRight = int.Parse(right);

    //We must use Math.Pow() instead of ^
    double d = iLeft + (iRight * Math.Pow(10, -(right.Length)));
    return d;
}

আপনার কোড ব্যাখ্যা করা এবং আরও বিশদ সরবরাহ করা সহায়ক হবে।
চার্লি ফিশ

এখানে কী ব্যাখ্যা করব? সবকিছু মন্তব্যে রয়েছে
এন্ডোরফাইনেক্স

-3

নীচে কম দক্ষ, তবে আমি এই যুক্তিটি ব্যবহার করি। দশমিক পয়েন্টের পরে যদি আপনার দুটি অঙ্ক থাকে তবে এটি বৈধ।

double val;

if (temp.Text.Split('.').Length > 1)
{
    val = double.Parse(temp.Text.Split('.')[0]);

    if (temp.Text.Split('.')[1].Length == 1)
        val += (0.1 * double.Parse(temp.Text.Split('.')[1]));
    else
        val += (0.01 * double.Parse(temp.Text.Split('.')[1]));
}
else
    val = double.Parse(RR(temp.Text));

-5

সংখ্যাটি গুণিত করুন এবং তারপরে আপনি এর আগে যা গুণ করেছিলেন তার দ্বারা এটি ভাগ করুন।

উদাহরণ স্বরূপ,

perc = double.Parse("3.555)*1000;
result = perc/1000
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.