স্ট্রিংতে অ-সংখ্যাসূচক অক্ষরগুলি কেটে ফেলা হচ্ছে


114

আরে আমি এএসপি.নেট সি # তে একটি স্ট্রিংতে অ-সংখ্যাসূচক অক্ষরগুলি খুঁজে বের করতে চাইছি

সুতরাং 40,595 পা

40595 দিয়ে শেষ হবে

ধন্যবাদ


3
এখানে আপনার উত্তর আছে: stackoverflow.com/questions/262448/...

উত্তর:


234

অনেকগুলি উপায় রয়েছে, তবে এটি করা উচিত (যদিও এটি বড় আকারের স্ট্রিংগুলির সাথে কীভাবে সম্পাদন করে তা জানেন না):

private static string GetNumbers(string input)
{
    return new string(input.Where(c => char.IsDigit(c)).ToArray());
}

21
আপনার সম্ভবত এটিরIsDigit পরিবর্তে ব্যবহার করা উচিত IsNumber: "এই পদ্ধতিটি [ IsNumber] নির্ধারণ করে যে Charকোনওটি কোনও সংখ্যাসূচক ইউনিকোড বিভাগের কিনা । ডিজিটের সাথে সংখ্যার সাথে অক্ষর, ভগ্নাংশ, সাবস্ক্রিপ্টস, সুপারস্প্রিপ্টস, রোমান সংখ্যাসমূহ, মুদ্রার সংখ্যা এবং ঘেরযুক্ত সংখ্যা অন্তর্ভুক্ত রয়েছে This IsDigitপদ্ধতির সাথে বৈসাদৃশ্য , যা নির্ধারণ করে যে Charকোনওটি একটি মূলত -10 সংখ্যার কিনা "" msdn.microsoft.com/en-us/library/yk2b3t2y.aspx
— লুক এইচ

2
@ ট্রেভরব্রুকস মনে করুন আপনি কেবল এই শর্তগুলি প্রসারিত করতে পারেন:input.Where(c => char.IsDigit(c) || char.IsWhiteSpace(c))
— ফ্রেডরিক মের্ক

6
এটি আরও সরল করতে পারে return new string(input.Where(char.IsDigit).ToArray());। আমি কেবল এটিকে আরও পঠনযোগ্য করে
— তুলেছি

2
চমৎকার উত্তর. এর উদ্দেশ্যটি পরিষ্কার করার জন্য, কেবল 'গেটনম্বার্স' থেকে 'গেটডিজিটস' এ ফাংশনটির নাম পরিবর্তন করার বিষয়টি বিবেচনা করতে পারে।
— জেটেক

2
একটি দুর্দান্ত এক্সটেনশন পদ্ধতিও তৈরি করে।
— রবার্তো বোনিনি

61

একটি নিয়মিত প্রকাশের জন্য ভাল ফিট মনে হয়।

var s = "40,595 p.a.";
var stripped = Regex.Replace(s, "[^0-9]", "");

"[^0-9]"দ্বারা প্রতিস্থাপন করা যেতে পারে @"\D"তবে আমি এর পাঠযোগ্যতা পছন্দ করি [^0-9]।


1
আপনি যতক্ষণ না ওভারহেডের সাথে নিয়মিত মত প্রকাশের সাথে যুক্ত
— রয়েছেন

4
কৌতূহলের বাইরে, এই উত্তর এবং ফ্রেড্রিক মুরকের উত্তরটির মধ্যে পারফরম্যান্স ওভারহেড কী?
— স্কুবা স্টিভ

এটি সম্ভবত ধীর but
— জোনাস এলফস্ট্রাম

1
আপনি যোগ করতে পারেন হিসাবে এটি ইসডিগিট () ব্যবহার করার চেয়ে আরও নমনীয়। দশমিক জায়গাগুলির সাথে সংখ্যার অনুমতি দিতে চাইলে রেগেজকে অক্ষরগুলি।
— রিচার্ড মুর

10
আমি ১০,০০,০০০ জিইউইডি থেকে তৈরি স্ট্রিংয়ের সাথে রেজেক্স বনাম লিনকুইয়ের একটি সহজ তুলনা করেছি (যার ফলে ৩,6০০,০০০ চরিত্রের স্ট্রিং রয়েছে)। রেজেেক্স ধারাবাহিকভাবে অর্ধেক সেকেন্ডের কাছাকাছি ছিল, অন্যদিকে লিনকিউ ধারাবাহিকভাবে দ্বিতীয় সেকেন্ডের 1/10 তে ছিল। মূলত লিনকুইটি গড়ে গড়ে 5 বা তার বেশি গতিযুক্ত ছিল।
— ক্রিস প্র্যাট

8

একটি এক্সটেনশন পদ্ধতি আরও ভাল পদ্ধতির হবে:

public static string GetNumbers(this string text)
    {
        text = text ?? string.Empty;
        return new string(text.Where(p => char.IsDigit(p)).ToArray());
    }

আমি পছন্দ if (text == null) return string.Empty;উপর text = text ?? string.Empty;। এইভাবে আমরা কর্মক্ষমতা হ্রাস করি না।
— হুমান

6

হয় নিয়মিত এক্সপ্রেশন ব্যবহার করুন যা কেবল 0-9 ক্যাপচার করে এবং বাকিটি ফেলে দেয়। একটি নিয়মিত প্রকাশ একটি অপারেশন যা প্রথমবারের জন্য অনেক বেশি ব্যয় হতে চলেছে। বা এর মতো কিছু করুন:

var sb = new StringBuilder();
var goodChars = "0123456789".ToCharArray();
var input = "40,595";
foreach(var c in input)
{
  if(goodChars.IndexOf(c) >= 0)
    sb.Append(c);
}
var output = sb.ToString();

এরকম কিছু আমি মনে করি, যদিও আমি সংকলন করি নি ..

লিনকিউ হ'ল ফ্রেড্রিক যেমন বলেছেন, তেমনি একটি বিকল্পও


4

অন্য বিকল্প ...

private static string RemoveNonNumberDigitsAndCharacters(string text)
{
    var numericChars = "0123456789,.".ToCharArray();
    return new String(text.Where(c => numericChars.Any(n => n == c)).ToArray());
}

2
নেতিবাচক কি? (-) মাইনাস কি এর থেকে আলাদা হওয়া উচিত?
— Seabizkit

0

আচ্ছা, আপনি কি জানেন যে অঙ্কগুলি কী: 0123456789, তাই না? আপনার স্ট্রিং চরিত্র অনুসারে অক্ষরকে অতিক্রম করুন; অক্ষরটি যদি একটি অঙ্ক হয় তবে এটি একটি অস্থায়ী স্ট্রিংয়ের শেষের দিকে তাকান, অন্যথায় উপেক্ষা করুন। সি # স্ট্রিংয়ের জন্য উপলব্ধ অন্যান্য সহায়ক পদ্ধতি থাকতে পারে তবে এটি একটি সাধারণ পদ্ধতি যা সর্বত্র কাজ করে works


0

নিয়মিত এক্সপ্রেশন ব্যবহার করে কোডটি এখানে:

string str = "40,595 p.a.";

StringBuilder convert = new StringBuilder();

string pattern = @"\d+";
Regex regex = new Regex(pattern);

MatchCollection matches = regex.Matches(str);

foreach (Match match in matches)
{
convert.Append(match.Groups[0].ToString());
}

int value = Convert.ToInt32(convert.ToString()); 

রেজেক্স পাওয়ার জন্য আমাকে কী করতে হবে এই ত্রুটিটি পেয়ে কাজ করা 'রেজেক্স' নামটি বর্তমান প্রসঙ্গে নেই
— স্টিভিবি

System.Text.RegularExpressions ব্যবহার করে;
— dhirschl

0

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

এটি আমাকে পরিবর্তে এই সহায়ক পদ্ধতিগুলি ব্যবহার করতে চালিত করেছিল। প্রথমটি ওপিকে উত্তর দেয়, অন্যরা যারা বিপরীত সম্পাদনা করতে চায় তাদের জন্য দরকারী হতে পারে:

    /// <summary>
    /// Strips out non-numeric characters in string, returning only digits
    /// ref.: /programming/3977497/stripping-out-non-numeric-characters-in-string
    /// </summary>
    /// <param name="input">the input string</param>
    /// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
    /// <returns>the input string numeric part: for example, if input is "XYZ1234A5U6" it will return "123456"</returns>
    public static string GetNumbers(string input, bool throwExceptionIfNull = false)
    {
        return (input == null && !throwExceptionIfNull) 
            ? input 
            : new string(input.Where(c => char.IsDigit(c)).ToArray());
    }

    /// <summary>
    /// Strips out numeric and special characters in string, returning only letters
    /// </summary>
    /// <param name="input">the input string</param>
    /// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
    /// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZAU"</returns>
    public static string GetLetters(string input, bool throwExceptionIfNull = false)
    {
        return (input == null && !throwExceptionIfNull) 
            ? input 
            : new string(input.Where(c => char.IsLetter(c)).ToArray());
    }

    /// <summary>
    /// Strips out any non-numeric/non-digit character in string, returning only letters and numbers
    /// </summary>
    /// <param name="input">the input string</param>
    /// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
    /// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZ1234A5U6"</returns>
    public static string GetLettersAndNumbers(string input, bool throwExceptionIfNull = false)
    {
        return (input == null && !throwExceptionIfNull) 
            ? input 
            : new string(input.Where(c => char.IsLetterOrDigit(c)).ToArray());
    }

অতিরিক্ত তথ্যের জন্য, আমার ব্লগে এই পোস্টটি পড়ুন ।



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.