চরকে সি # তে রূপান্তর করুন


148

আমার সি তে একটি চর আছে:

char foo = '2';

এখন আমি 2 এন্টি তে পেতে চাই। আমি দেখতে পেয়েছি যে কনভার্ট. টোইন্ট 32 চরের আসল দশমিক মানটি প্রদান করে এবং 2 সংখ্যাটি নয়। নিম্নলিখিতটি কাজ করবে:

int bar = Convert.ToInt32(new string(foo, 1));

int.parse কেবল স্ট্রিংগুলিতেও কাজ করে।

C # তে কোনও স্ট্রিং না করে কোনও চর থেকে ইনট পর্যন্ত যাওয়ার কোনও নেটিভ ফাংশন নেই? আমি জানি এটি তুচ্ছ, তবে এটাকে একেবারেই অদ্ভুত বলে মনে হচ্ছে যে সরাসরি রূপান্তর করার জন্য দেশীয় কিছুই নেই।

উত্তর:


143

আকর্ষণীয় উত্তর কিন্তু দস্তাবেজগুলি আলাদাভাবে বলে:

কোনও সংখ্যাকে সংখ্যাসূচক মানের ধরণের উপস্থাপন করে এমন GetNumericValueকোনও Charবস্তুকে রূপান্তর করতে পদ্ধতিগুলি ব্যবহার করুন । স্ট্রিংয়ের একটি অক্ষরকে একটি বস্তুতে রূপান্তর করতে Parseএবং ব্যবহার করুন । কোনও বস্তুকে কোনও বস্তুতে রূপান্তর করতে ব্যবহার করুন ।TryParseCharToStringCharString

http://msdn.microsoft.com/en-us/library/system.char.aspx


Ahh! তাই দেশীয় কিছু আছে! অদ্ভুত যে এটি একটি ডাবল ফেরত দেয়। আমি এই উত্তরটি আরও ভাল পছন্দ করি। এটা ইশারা জন্য ধন্যবাদ।
কীথা

92
@ কিথা: এর দ্বিগুণ ফিরে আসার কারণ রয়েছে: char.GetNumericValue('¼')0.25 ফলন দেয়। ইউনিকোডের আনন্দ ... ;-)
হেইনজি

1
এটি এমন কোনও উত্তর নয় যা প্রকৃত প্রশ্নের উত্তর দেয়, Char.GetNumericValue ('o'), Char.GetNumericValue ('w') এবং কোনও অ-সংখ্যাসূচক চরটি সর্বদা ফিরে আসবে -1 - জেরেমি রুটেন সঠিক উত্তর পোস্ট করেছেন
জাস্টি নেল

2
@RustyNail মূল প্রশ্ন ক্ষেত্রে - বিশেষভাবে যেখানে তিনি গৃহস্থালির কাজ জানেন জিজ্ঞাসা একটি সংখ্যা প্রতিনিধিত্ব করে - এই সঠিক উত্তর হল
ডন জন্য Cheadle

@ মিমক্র্রে আমি এমনটি ভাবি না - আসল প্রশ্নটি প্রথমটি ব্যবহার charনা intকরেই জিজ্ঞাসা করে string
নেটমেজ

163

এটি এটিকে একটি ইনটিতে রূপান্তরিত করবে:

char foo = '2';
int bar = foo - '0';

এটি কাজ করে কারণ প্রতিটি অক্ষর অভ্যন্তরীণভাবে একটি সংখ্যা দ্বারা প্রতিনিধিত্ব করা হয়। '0' থেকে '9' পর্যন্ত অক্ষরগুলি ধারাবাহিক সংখ্যা দ্বারা প্রতিনিধিত্ব করা হয়, সুতরাং '0' এবং '2' অক্ষরের মধ্যে পার্থক্যটি খুঁজে বের করে এবং সংখ্যাটি 2 হয়।


5
এটি একটি নির্দিষ্ট চরিত্র সেট ধরে।
এরিকশাফার

8
না এটি হয় না, যতক্ষণ না ডিজিটগুলি ক্রমযুক্ত থাকে (যা সংকলকগুলির চারসেটের প্রয়োজন) এটি কাজ করবে, তারা যে মান শুরু করে তা বিবেচনা করে না।
জেরেমি রুটেন

2
এটি ঠিক আছে, ব্যতীত আপনার প্রথমে বাউন্ডস-চেকিং করা দরকার এবং এই মুহুর্তে আমি নিশ্চিত না যে int.parse (foo.ToString ()) দ্রুত কিনা।
ম্যাথু ফ্ল্যাশেন

7
@ এরিকশাফার তবে এটি সি # তে একটি নিরাপদ অনুমান: charসর্বদা ইউটিএফ -16।
এসভিক

2
@ এসভিক ছোট পয়েন্ট এবং এখন পুরানো, তবে আপনি যখন এটি পোস্ট করেছেন তখন থেকেই আমরা কোর বেরিয়ে এসেছি, যা ইউটিএফ -8 ব্যবহার করে। এখনও একটি নিরাপদ অনুমান, যদিও।
জোয়েল কোহোর্ন

84

কেউ এর ব্যবহার int.Parse()এবং এটি int.TryParse()পছন্দ করে

int bar = int.Parse(foo.ToString());

আরও ভাল এই মত

int bar;
if (!int.TryParse(foo.ToString(), out bar))
{
    //Do something to correct the problem
}

এটি অনেক বেশি নিরাপদ এবং ত্রুটিযুক্ত প্রবণ


2
একেবারে সঠিক পন্থা। আপনি যদি অন্তর্নির্মিত ইনপুট নিক্ষেপ করতে চান তবে প্রথমটি চয়ন করুন, দ্বিতীয়টি যদি আপনি অন্য কিছু করতে চান।
জে বাজুজি

জেনেরিক রূপান্তর পদ্ধতির জন্য এটি একটি ভাল পদ্ধতির। একদিকে যেমন, NET ব্লাটওয়্যারকে কীভাবে প্রচার করে। (আমি বোঝাতে চাই এবং ইউনিট-পরীক্ষা ট্রাইপার্স () এবং টোস্ট্রিং () - আপনি পারবেন না, ব্যবহারিকভাবে না)।
লগআউট করুন

5
@ লগআউট না, স্ট্যাকওভারফ্লোতে একটি উত্তর ব্লাটওয়্যারকে কীভাবে উত্সাহ দেয় তা এটি একটি উদাহরণ। এটি প্রকৃতপক্ষে অযৌক্তিকভাবে প্রস্ফুটিত, এবং কেন আপনি এটিকে '0'চর থেকে বিয়োগের চেয়ে উচ্চতর হিসাবে বিবেচিত হন তা আমি বুঝতে পারি না ।
রোমান স্টারকভ

26
char c = '1';
int i = (int)(c-'0');

এবং আপনি এটি থেকে একটি স্থিতিশীল পদ্ধতি তৈরি করতে পারেন:

static int ToInt(this char c)
{
    return (int)(c - '0');
}

এই আমি খুঁজছিলাম ছিল। আপনি বিয়োগ শূন্য অংশ নিয়ে কী করছেন তা আপনি ব্যাখ্যা করতে পারেন।
জোনাট্রন

10

এটা চেষ্টা কর

char x = '9'; // '9' = ASCII 57

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9

আপনার মন্তব্য বলে '9', কিন্তু আপনার কোড আছে 9, যা সংকলন করবে না।
এসভিক

7

ডিফল্টরূপে আপনি ইউনিকোড ব্যবহার করেন তাই আমি ত্রুটিযুক্ত পদ্ধতিটি ব্যবহার করার পরামর্শ দিই

int bar = int.Parse(foo.ToString());

যদিও এর অধীনে সংখ্যাসূচক মানগুলি সংখ্যা এবং বেসিক ল্যাটিন অক্ষরের জন্য সমান for



4

আসল উপায় হ'ল:

int theNameOfYourInt = (int) .Char.GetNumericValue (theNameOfYourChar);

"TheNameOfYourInt" - আপনি নিজের চরটি রূপান্তরিত করতে চান।

"TheNameOfYourChar" - আপনি যে চরটি ব্যবহার করতে চান তা তাই এটি কোনও ইনটায় রূপান্তরিত হবে।

বাকি সব ছেড়ে দিন।


2

নীতি:

char foo = '2';
int bar = foo & 15;

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

0   -   0011 0000
1   -   0011 0001
2   -   0011 0010
3   -   0011 0011
4   -   0011 0100
5   -   0011 0101
6   -   0011 0110
7   -   0011 0111
8   -   0011 1000
9   -   0011 1001

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

ব্যবহার:

public static int CharToInt(char c)
{
    return 0b0000_1111 & (byte) c;
}

2
যদিও এই কোড স্নিপেট একটি সমাধান সহ সমাধান হতে পারে, সত্যিই আপনার পোস্টের গুণমান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
yivi

2

আমি @ চাদ গ্রান্টের সাথে একমত

এছাড়াও আপনি যদি স্ট্রিংয়ে রূপান্তর করেন তবে আপনি সেই মানটি প্রশ্নের হিসাবে বর্ণিত হিসাবে সংখ্যাসূচক হিসাবে ব্যবহার করতে পারেন

int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2

আমি আরও সহজ এবং বোধগম্য উদাহরণ তৈরি করার চেষ্টা করেছি

char v = '1';
int vv = (int)char.GetNumericValue(v); 

Char.GetNumericValue (v) দ্বিগুণ হিসাবে প্রত্যাবর্তন করে এবং (int) এ রূপান্তর করে

অ্যারে হিসাবে আরও অ্যাডভান্সড ব্যবহার

int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();

0

অক্ষর যখন ASCII সংখ্যা নয় তখন ফলাফলের উপর ভিত্তি করে কয়েকটি পদ্ধতির তুলনা:

char c = '\n';                              
Debug.Print($"{c & 15}");                   // 10
Debug.Print($"{c ^ 48}");                   // 58
Debug.Print($"{c - 48}");                   // -38
Debug.Print($"{(uint)c - 48}");             // 4294967258
Debug.Print($"{char.GetNumericValue(c)}");  // -1 

0

আমি কমপ্যাক্ট ফ্রেমওয়ার্ক 3.5 ব্যবহার করছি এবং "চর.পার্স" পদ্ধতিটি নেই। আমি মনে করি কনভার্ট ক্লাসটি ব্যবহার করা খারাপ নয়। (সি #, জেফরি রিখটারের মাধ্যমে সিএলআর দেখুন)

char letterA = Convert.ToChar(65);
Console.WriteLine(letterA);
letterA = 'あ';
ushort valueA = Convert.ToUInt16(letterA);
Console.WriteLine(valueA);
char japaneseA = Convert.ToChar(valueA);
Console.WriteLine(japaneseA);

এএসসিআইআই চর বা ইউনিকোড চর নিয়ে কাজ করে


-4

এটি আমার পক্ষে কাজ করেছে:

int bar = int.Parse("" + foo);

5
int.Parse(foo.ToString())কম পাঠযোগ্য হওয়া বাদে কীভাবে এর থেকে আলাদা ?
এসভিক

-5

আমি অনেক উত্তর দেখেছি তবে সেগুলি আমার কাছে বিভ্রান্ত বলে মনে হচ্ছে। আমরা কেবল টাইপ কাস্টিং ব্যবহার করতে পারি না?

প্রাক্তন: -

int s;
char i= '2';
s = (int) i;

1
এটি 2 বর্ণের ASCII কোডটি প্রত্যাবর্তন করবে, 2 মান নয়
cavpollo

তারপরে কিভাবে Char.GetNumericValue (এটি একটি দ্বৈত মান প্রদান করে) ব্যবহার করে এবং এটি পূর্বে কাস্ট করে about
শিখর

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