চরকে কীভাবে ইনটে রূপান্তর করবেন?


123

সঠিক ভাবে একটি রূপান্তর করতে কি charকরতে int? এটি দেয় 49:

int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works

আমি স্ট্রিংয়ে রূপান্তর করতে চাই না এবং তারপরে পার্স করতে চাই।


1
এই প্রশ্নের সম্ভাব্য সদৃশ ।
— আরবিটি

উত্তর:


282

আমি আশ্চর্য হয়েছি যে কেউ স্থির পদ্ধতিটি ঠিক এর মধ্যে নির্মিত হয়নি System.Char...

int val = (int)Char.GetNumericValue('8');
// val == 8

18
ভাল জায়গা! +1 টি খুব অদ্ভুত যে এটা একটা ফেরৎ double, যদিও
— মার্ক Gravell

4
আমি সম্মত, কেন এটি 'ডাবল' ফেরায় আমি বুঝতে পারি না - একটি একক চরিত্র কীভাবে সম্ভবত একটি ভাসমান-পয়েন্ট সংখ্যা উপস্থাপন করতে পারে?
— জোয়েল মুয়েলার

49
অনেক ইউনিকোড অক্ষর আছে যা একটি অ-পূর্ণসংখ্যা সংখ্যা, যেমন, প্রতিনিধিত্ব করেন হয় U + এ 2153 ।
— ডিটিবি

26
@ ডিটিবি - আমি এটি বিবেচনা করি নি। Char.GetNumericValue('⅓')আসলেই ফিরে আসে 0.3333...। যে ইশারা জন্য ধন্যবাদ!
— জোয়েল মুয়েলার

1
পাদঃ দ্রষ্টব্য: বর্তমানে নেটএমএফ এ ফাংশন উপলব্ধ নেই।
— গিসমফেক্স

40

কিভাবে (জন্য char c)

int i = (int)(c - '0');

চরের মানটির বিয়োগফল কোনটি?

এপিআই প্রশ্ন (মন্তব্য), সম্ভবত একটি এক্সটেনশন পদ্ধতি পুনরায়?

public static class CharExtensions {
    public static int ParseInt32(this char value) {
        int i = (int)(value - '0');
        if (i < 0 || i > 9) throw new ArgumentOutOfRangeException("value");
        return i;
    }
}

তারপরে ব্যবহার করুন int x = c.ParseInt32();


1
আমার উল্লেখ করা উচিত ছিল, আমি এ সম্পর্কে জানতাম তবে অন্য কোনও উপায় আছে কি? আমি জানতে চেয়েছিলাম যে এটি করার জন্য কোনও এপিআই আছে কিনা?
— টিভিআর

4
আপনি যদি কোনও বাহ্যাভিয়ারের সাথে পরিচিত হন int.Parse, অর্থাত্ যদি কোনও ব্যতিক্রম অবৈধ ইনপুটটিতে ফেলে দেওয়া হয় তবে আপনাকে অতিরিক্ত সীমানা যাচাই করতে হবে:if (i < 0 || i > 9) throw new FormatException();
— ডার্ক ভোলমার

@ ব্যবহারকারী 386338 আমি ভয় করি যে এটি নেই।
— ইউজিন শেভেরদা

@ ইউজার 386338 - @ 0xA3 এর প্রতিক্রিয়া সহ একটি বিকল্প পুনরায় এপিআই দিয়ে আপডেট হয়েছে
— মার্ক গ্র্যাভেল

@ user386338 - একটি Inbuilt এপিআই পদ্ধতির জন্য Joel এর উত্তর দেখার
— মার্ক Gravell

21

প্রত্যেকে যা ভুলে যাচ্ছেন তা ব্যাখ্যা করছে যে এটি কেন হয়।

একটি চর মূলত একটি পূর্ণসংখ্যা, তবে ASCII সারণীতে একটি পয়েন্টার সহ। সমস্ত অক্ষরের একটি যথাযথ পূর্ণসংখ্যার মান রয়েছে কারণ এটি বিশ্লেষণ করার চেষ্টা করার সময় আপনি স্পষ্ট দেখতে পাচ্ছেন।

প্রাণয়ের স্পষ্টতই একটি আলাদা চরিত্র সেট রয়েছে, তার এইচএস কোড কেন কাজ করে না তা জানায়। একমাত্র উপায়

int val = '1' - '0';

কারণ এটি সারণীতে পূর্ণসংখ্যার মানটি দেখায় '0'যা তারপরে 'বেস মান' এটি থেকে আপনার নম্বরটি চর বিন্যাসে বিয়োগ করলে আপনাকে আসল নম্বর দেবে।


15
int i = (int)char.GetNumericValue(c);

তবুও অন্য একটি বিকল্প:

int i = c & 0x0f;

এটি পাশাপাশি এটি সম্পাদন করা উচিত।


4
int val = '1' - '0';

এটি আসকি কোডগুলি ব্যবহার করে করা যেতে পারে যেখানে '0' সর্বনিম্ন এবং সেখান থেকে সংখ্যা অক্ষরগুলি গণনা করা হয়


এটা অসাধারণ! imo এখানে সবচেয়ে মার্জিত সমাধান।
— আরবিসফট

3
int val = '1' - 48;

@ লুক লুক: '0' এর ASCII কোড 0x30 রয়েছে যা দশমিক 48 হয় তাই এটি '1' - '0' এর
— সমান

3

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

public static class CharExtensions
    {
        public static int CharToInt(this char c)
        {
            if (c < '0' || c > '9')
                throw new ArgumentException("The character should be a number", "c");

            return c - '0';
        }
    }

1
@ 0xA3 পরিসীমা চেকটি সাধারণভাবে পদ্ধতির শুরুতে হওয়া উচিত। শব্দার্থগতভাবে যদি আমরা রূপান্তর charকরতে intহয় তবে আমাদের ইনপুট প্যারামিটারের পরিসর পরীক্ষা করতে হবে, আউটপুট intমানটি নয়।
— ইউজিন শেভেরদা

ফলাফলের intমানটি পরীক্ষা করার দরকার নেই কারণ পদ্ধতির শুরুতে সংখ্যার চরগুলির পরিসীমা সম্পাদিত হয়েছিল, সুতরাং সঠিক ফলাফলের মানটি থাকবে, যদি নির্দিষ্ট চরটি সংখ্যা বর্ণের পরিসরে না থাকে তবে সেখানে ফেলে দেওয়া ব্যতিক্রম হবে। আপনি সরবরাহ করেছেন কিন্তু রেঞ্জ চেক হিসাবে একই যুক্তিটি পদ্ধতিটির শুরুতে সঞ্চালিত হয়।
— ইউজিন শেভেরদা

দুঃখিত, আমি আপনার কোড নমুনা ভুল পড়া ছিল। কখনও কখনও সর্বাধিক সুস্পষ্ট বিষয়গুলি দেখা শক্ত। আমি বাজি দিয়েছি যে কোডটি বলেছিল if (c < 0 || c > 9)...
— ডার্ক ভোলমার

1

এটি সম্পাদন করার সর্বাধিক সুরক্ষিত উপায় হ'ল আন্ত32 T ট্রাইপার্স পদ্ধতিটি। এখানে দেখুন: http://dotnetperls.com/int-tryparse


ট্রিপ পার্সে অক্ষরের জন্য নয় স্ট্রিংগুলির জন্য
— TVr

হ্যাঁ, তবে রূপান্তরটি সম্পাদন করার সবচেয়ে সুরক্ষিত
— উপায়টি হ'ল

1
একটি চরিত্রকে পূর্ণসংখ্যায় রূপান্তর করা কি সুরক্ষা বিষয়?
— জোয়েল মুয়েলার

1
এই ক্ষেত্রে 'সিকিউর' এর অর্থ হ'ল যদি আপনার চরটি আসলে আসকি নম্বর না হয় - এটি কোনও মাল্টি বাইট ইউনিকোড চরিত্র হতে পারে।
— রবিন বেনেট

1
int val = '1' & 15;

ASCII অধ্যায়ের 0-9 এর বাইনারিটি হ'ল:

0 - 00110000

1 - 00110001

2 - 00110010

3 - 00110011

4 - 00110100

5 - 00110101

6 - 00110110

7 - 00110111

8 - 00111000

9 - 00111001

এবং যদি আপনি তাদের প্রত্যেকটির মধ্যে প্রথম 4 টি এলএসবি নেন (বিটওয়াইড এবং 8'b00001111 যা 15 এর সমান হয়) ব্যবহার করে আপনি আসল নম্বর পাবেন (0000 = 0,0001 = 1,0010 = 2, ...)


প্রকারের ক্ষেত্রে এটি কীভাবে কাজ করে? আপনি একটি চর এবং কোনও int এর মধ্যে একটি বিটওয়াস অপারেটর ব্যবহার করছেন এবং তারপরে কোন int ফেরত দেবেন? লজিক্যাল অ্যান্ড চার এবং ইনট উভয়ের বাইনারি উপস্থাপনা ব্যবহার করে এবং একটি বাইনারি উপস্থাপনা ফিরিয়ে দেয় এবং তারপরে আপনি যখন ভেরিটটি সংজ্ঞা হিসাবে ব্যবহার করছেন তখন এটি সেই প্রতিনিধিত্বটি ব্যবহার করে?
— ইমেট মিটমোড হয়েছে

@ স্বীকৃত হ্যাঁ এবং আপনি উদাহরণস্বরূপ বাইট ব্যবহার করেন তবে এটি বাইট উপস্থাপনা ব্যবহার করে।
— টোমর ওলবার্গ

0

আপনি এরকম কিছু চেষ্টা করতে পারেন:

int val = Convert.ToInt32("" + '1');

কেন শুধু .ToString ()?
— Veikedo

@ ওয়েইকদো তিনি একটি স্ট্রিং নয়, একটি ইনট চান।
— ব্রিবা

6
আমি বলতে চাইছিConvert.ToInt32('1'.ToString())
— Veikedo

0

হেক্সাডেসিমাল উপস্থাপনা কভার করে এমন কিছু অন্যান্য উত্তরের একটি বর্ধন:

public int CharToInt(char c) 
{
    if (c >= '0' && c <= '9') 
    {
        return c - '0';
    }
    else if (c >= 'a' && c <= 'f') 
    {
        return 10 + c - 'a';
    }
    else if (c >= 'A' && c <= 'F') 
    {
        return 10 + c - 'A';
    }

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