C # में int को कन्वर्ट करें


148

मुझे c # में एक चार है:

char foo = '2';

अब मैं 2 को इंट में लाना चाहता हूं। मुझे लगता है कि Convert.ToInt32 चार का वास्तविक दशमलव मान लौटाता है और संख्या 2 नहीं। निम्नलिखित काम करेगा:

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

int.parse केवल स्ट्रिंग्स पर भी काम करता है।

वहाँ एक स्ट्रिंग बनाने के बिना एक चर से int करने के लिए C # में कोई मूल कार्य नहीं है? मुझे पता है कि यह तुच्छ है लेकिन यह सिर्फ अजीब लगता है कि रूपांतरण करने के लिए सीधे देशी कुछ भी नहीं है।

जवाबों:


143

दिलचस्प जवाब लेकिन डॉक्स अलग तरीके से कहते हैं:

किसी संख्या को एक संख्यात्मक मान प्रकार में प्रदर्शित करने वाली किसी वस्तु GetNumericValueको परिवर्तित करने के तरीकों का उपयोग करें Char। का प्रयोग करें Parseऔर TryParseएक में एक स्ट्रिंग में एक चरित्र कन्वर्ट करने के लिए Char वस्तु। ToStringकिसी Char वस्तु को किसी Stringवस्तु में बदलने के लिए उपयोग करें ।

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


आह! तो वहाँ कुछ देशी है! अजीब बात है कि यह दोगुना रिटर्न देता है। मुझे यह उत्तर बेहतर लगा। इस पर ध्यान दिलाने के लिए धन्यवाद।
कीता

92
@ कीथ: डबल वापसी करने का एक कारण है: char.GetNumericValue('¼')पैदावार 0.25। यूनिकोड की खुशियाँ ... ;-)
हेंजी

1
यह एक ऐसा प्रश्न नहीं है जो वास्तविक प्रश्न का उत्तर देता है, चार.गनेटमैरिकवैल्यू ('ओ'), चार.गनेट न्यूमेरिकवैल्यू ('डब्ल्यू') और कोई भी गैर संख्यात्मक अंक हमेशा वापस आएगा -1 - जेरेमी न्यूटन ने सही उत्तर पोस्ट किया है
जंग खाए कील

2
मूल प्रश्न के मामले में @RustyNail - विशेष रूप से पूछते हुए कि वह जानता है कि चार एक नंबर का प्रतिनिधित्व करता है - यह सही उत्तर है
डॉन चीडल

@mmcrae मुझे ऐसा नहीं लगता है - मूल प्रश्न के लिए पूछता है charकरने के लिए intउपयोग किए बिना stringपहले।
नेटमैज

163

यह इसे एक इंट में बदल देगा:

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

यह काम करता है क्योंकि प्रत्येक चरित्र को आंतरिक रूप से एक संख्या द्वारा दर्शाया जाता है। वर्ण '0' से '9' को लगातार संख्याओं द्वारा दर्शाया जाता है, इसलिए वर्ण '0' और '2' के बीच के अंतर को संख्या 2 में खोजते हैं।


5
यह एक निश्चित वर्ण सेट मानता है।
एरिकशोफर

8
नहीं, यह तब तक नहीं है, जब तक कि अंक क्रम में हैं (जो संकलक को वर्ण की आवश्यकता होती है) यह काम करेगा, चाहे वे किसी भी मूल्य पर शुरू करें।
जेरेमी रुटेन

2
यह ठीक है, सिवाय इसके कि आपको अभी भी पहले बाउंड-चेकिंग करने की आवश्यकता है, और उस बिंदु पर मुझे यकीन नहीं है कि क्या int.parse (foo.ToString ()) तेज है।
मैथ्यू फ्लैशेन

7
@ एरिक पुरालेख लेकिन यह C # में एक सुरक्षित धारणा है: charहमेशा UTF-16 है।
शाम

2
@ छोटा बिंदु और पुराना अब पुराना है, लेकिन जब से आपने इसे पोस्ट किया है, हमारे पास कोर आ चुका है, जो UTF-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
बिल्कुल सही दृष्टिकोण। यदि आप गैर-अंतर इनपुट फेंकना चाहते हैं, तो दूसरा चुनें, यदि आप कुछ और करना चाहते हैं।
Jay Bazuzi

यह सामान्य रूपांतरण विधि के लिए एक अच्छा तरीका है। एक तरफ के रूप में, .NET कैसे ब्लोटवेयर को बढ़ावा देता है, इसका एक और उदाहरण है। (मेरा मतलब है कि यूनिट-टेस्ट ट्रायपर्स () और टोस्ट्रिंग () - आप नहीं कर सकते, व्यावहारिक रूप से नहीं)।
लॉगआउट

5
@logout नहीं, यह एक उदाहरण है कि कैसे StackOverflow पर एक उत्तर ब्लोटवेयर को बढ़ावा देता है। यह वास्तव में अनावश्यक रूप से फूला हुआ है, और मुझे समझ में नहीं आता है कि यह क्यों '0'चार से घटाना बेहतर माना जाता है ।
रोमन स्टार्कोव

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

और आप इसमें से एक स्थिर विधि बना सकते हैं:

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

यह वही है जिसे मैं देख रहा था। आप शायद समझा सकते हैं कि आप शून्य से शून्य के साथ क्या कर रहे हैं।
Xonatron

10

इसे इस्तेमाल करे

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

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

आपकी टिप्पणी कहती है '9', लेकिन आपका कोड है 9, जो संकलन नहीं करेगा।
svick

7

डिफ़ॉल्ट रूप से आप UNICODE का उपयोग करते हैं इसलिए मैं दोषपूर्ण विधि का उपयोग करने का सुझाव देता हूं

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

भले ही अंक के तहत संख्यात्मक मान अंकों और बुनियादी लैटिन वर्णों के लिए समान हैं।



4

वास्तविक तरीका यह है:

intNameOfYourInt = (int) .Char.GetNumericValue (NameOfYourChar);

"TheNameOfYourInt" - वह इंट जो आप चाहते हैं कि आपके चार्ट को बदल दिया जाए।

"TheNameOfYourChar" - जिस चार का आप उपयोग करना चाहते हैं, वह एक इंट में तब्दील हो जाएगा।

बाकी सब छोड़ो।


2

सिद्धांत:

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

0-9 ASCII के बाइनरी को बाइनरी किया गया है:

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.Parse" विधि नहीं है। मुझे लगता है कि कन्वर्ट क्लास का उपयोग करना बुरा नहीं है। (सीएलआर, जेफरी रिक्टर के माध्यम से सीएलआर देखें)

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 char या Unicode char के साथ काम करता है


-4

यह मेरे लिए काम किया:

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

5
int.Parse(foo.ToString())कम पठनीय होने के अलावा, यह कैसे अलग है ?
svick

-5

मैंने कई उत्तर देखे हैं लेकिन वे मुझे भ्रमित करने वाले लगते हैं। क्या हम केवल टाइप कास्टिंग का उपयोग नहीं कर सकते।

पूर्व के लिए: -

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

1
यह अक्षर 2 के ASCII कोड को
लौटाएगा

फिर कैसे char.GetNumericValue (यह एक डबल मान लौटाता है) का उपयोग करके और इसे इंट में डालना है।
शिक्षार्थी

हाँ, यह वही है जो @Chad अनुदान के स्वीकृत उत्तर का प्रस्ताव करता है
४:१२ पर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.