سؤال

علي شار في c#:

char foo = '2';

الآن أريد الحصول على 2 إلى int.أجد أن تحويل.ToInt32 العوائد الفعلية عشري قيمة شار وليس عدد 2.التالية سوف تعمل:

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

int.تحليل يعمل فقط على سلاسل كذلك.

لا يوجد وظيفة الأم في C# من شار إلى الباحث دون أن يجعل من سلسلة ؟ أعرف أن هذا هو تافهة ولكن يبدو من الغريب أنه لا يوجد مواطن مباشرة إجراء عملية التحويل.

هل كانت مفيدة؟

المحلول

وأجوبة مثيرة للاهتمام ولكن مستندات تقول بشكل مختلف:

<اقتباس فقرة>   

استخدم الأساليب GetNumericValue ل   تحويل كائن Char التي تمثل   رقم لنوع قيمة رقمية. استعمال   Parse وTryParse لتحويل   حرف في سلسلة إلى Char   موضوع. استخدام ToString لتحويل Char   الاعتراض على كائن String.

http://msdn.microsoft.com/en-us/ مكتبة / system.char.aspx

نصائح أخرى

وهذا سيتم تحويلها إلى int:

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

وهذا يعمل لأن كل حرف يتم تمثيل داخليا من قبل عدد. الأحرف '0' إلى '9' يتم تمثيل أرقام متتالية، حتى العثور على الفرق بين النتائج "2" الأحرف "0" وعدد 2.

وقد أي شخص يعتبر تستخدم 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
}

وان الكثير أكثر أمانا وأقل عرضة للخطأ

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

ويمكنك إنشاء أسلوب ثابت للخروج منه:

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

وهذا في محاولة

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

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

وافتراضيا استخدام UNICODE لذلك أقترح باستخدام طريقة خاطئة ل

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

وعلى الرغم من أن القيم الرقمية تحت هي نفسها بالنسبة للأرقام وأحرف لاتينية الأساسية.

وهذا يحول إلى عدد صحيح و مقابض unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

يمكنك قراءة المزيد هنا.

والطريقة الحقيقية هي:

<اقتباس فقرة>   

وكثافة العمليات theNameOfYourInt = (الباحث) .Char.GetNumericValue (theNameOfYourChar)؛

و"theNameOfYourInt" - وكثافة العمليات التي تريد شار إلى أن تتحول إلى

.

و"theNameOfYourChar" - شار تريد أن تستخدم لذلك سيتم تحويلها إلى عدد صحيح

وترك كل شيء آخر أن يكون.

المبدأ:

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

ثنائي من ASCII charecters 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 LSB (باستخدام المعامل و مع 8'b00001111 أن يساوي 15) تحصل على العدد الفعلي (0000 = 0,0001=1,0010=2,...)

الاستخدام:

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

ومقارنة بعض الطرق بناء على نتيجة عند الحرف ليست أرقام 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 

وأنا باستخدام ضغط Framework 3.5، وليس لديها "char.Parse" الأسلوب. أعتقد أنها ليست سيئة إلى استخدام فئة تحويل. (انظر CLR عبر C #، جيفري ريختر)

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);

ويعمل مع شار ASCII أو يونيكود شار

وأنا أتفق معChad غرانت

وكذلك الحق إذا كنت تحويل إلى سلسلة ثم يمكنك استخدام هذه القيمة كما رقمية كما قال في السؤال

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

وحاولت خلق مثال أكثر بسيطة ومفهومة

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

وchar.GetNumericValue (ت) يعود كما المزدوج والمتحولين إلى (الباحث)

والمزيد Advenced استخدام كصفيف

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

ولقد شاهدت العديد من الإجابات ولكن يبدو أنها مربكة بالنسبة لي. لا نستطيع ببساطة استخدام نوع الصب.

لالسابقين: -

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

وهذا عمل بالنسبة لي:

int bar = int.Parse("" + foo);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top