जंग में int करने के लिए एक स्ट्रिंग कन्वर्ट?


187

नोट: इस प्रश्न में पदावनत पूर्व 1.0 कोड शामिल है! उत्तर सही है, हालांकि।

A को Rust में बदलने के strलिए int, मैं यह कर सकता हूं:

let my_int = from_str::<int>(my_str);

एक ही रास्ता मैं कैसे एक कन्वर्ट करने के लिए पता है Stringएक करने के लिए intयह का एक टुकड़ा पाने के लिए और उसके बाद का उपयोग करें from_strतो जैसे उस पर:

let my_int = from_str::<int>(my_string.as_slice());

वहाँ एक रास्ता सीधे एक कन्वर्ट करने के लिए है Stringएक करने के लिए int?


1
यह भी देखें: गैर-दशमलव (यानी, हेक्स) के लिए stackoverflow.com/q/32381414/500207
अहमद फ़सीह

2
कुछ हद तक स्पष्ट है, लेकिन किसी को भी 2014 के बाद इस सवाल का अच्छी तरह से पता है, और सोच रहा है कि from_str गुंजाइश क्यों नहीं है, यह प्रस्ताव में नहीं है। use std::str::FromStr;ठीक करता है। यदि आप चाहें तो from_str से अधिक। doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_str
7l-l04

जवाबों:


260

आप सीधे str::parse::<T>()विधि का उपयोग करके एक इंट में परिवर्तित कर सकते हैं ।

let my_string = "27".to_string();  // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap();

आप या तो टर्बोफिश ऑपरेटर के साथ पार्स करने का प्रकार निर्दिष्ट कर सकते हैं ( ::<>) जैसा कि ऊपर दिखाया गया है या स्पष्ट प्रकार के एनोटेशन के माध्यम से:

let my_int: i32 = my_string.parse().unwrap();

के रूप में टिप्पणी में उल्लेख किया है, parse()एक रिटर्न Result। यह परिणाम होगा Errयदि स्ट्रिंग निर्दिष्ट प्रकार के रूप में पार्स नहीं की जा सकती (उदाहरण के लिए, स्ट्रिंग "peter"को पार्स नहीं किया जा सकता है i32)।


35
ध्यान दें कि parseएक रिटर्न देता हैResult , इसलिए आपको वास्तविक अभिन्न प्रकार को प्राप्त करने के लिए उचित रूप से निपटने की आवश्यकता है।
शेपमास्टर

54
let my_u8: u8 = "42".parse::<u8>().unwrap();
let my_u32: u32 = "42".parse::<u32>().unwrap();

// or, to be safe, match the `Err`
match "foobar".parse::<i32>() {
  Ok(n) => do_something_with(n),
  Err(e) => weep_and_moan(),
}

str::parse::<u32>एक रिटर्न देता है Result<u32, core::num::ParseIntError>और Result::unwrap"परिणाम का अनावरण करता है, Okयदि [,] पैनिक की सामग्री को पैदावार दी जाती है, यदि मूल्य Errए है, तो पैनिक मैसेज द्वारा प्रदान किया जाता है Err।"

str::parseएक सामान्य कार्य है , इसलिए कोण कोष्ठक में प्रकार।


9
यदि आप चर के प्रकार को निर्दिष्ट करते हैं ( let my_u8: u8), तो आपको कोण कोष्ठक में मूल्य की आवश्यकता नहीं है। यह भी ध्यान दें कि प्रचलित रस्ट शैली इंगित करती है कि :बाईं ओर चिपकना चाहिए।
शमपास्टर

5
विशेष रूप से, मेरा मतलब थाlet my_u32: u32 = "42".parse().unwrap()
शेकमास्टर

9

यदि आपको अपना स्ट्रिंग मिलता है stdin().read_line, तो आपको पहले इसे ट्रिम करना होगा।

let my_num: i32 = my_num.trim().parse()
   .expect("please give me correct string number!");

6

हाल ही में रात के साथ, आप यह कर सकते हैं:

let my_int = from_str::<int>(&*my_string);

यहाँ क्या हो रहा है कि Stringअब एक में dereferenced जा सकता है str। हालाँकि, फ़ंक्शन एक चाहता है &str, इसलिए हमें फिर से उधार लेना होगा। संदर्भ के लिए, मेरा मानना ​​है कि इस विशेष पैटर्न ( &*) को "क्रॉस-उधार" कहा जाता है।


ठीक है, मैं नाइटलीज़ पर नहीं हूं, लेकिन मैं इसे एक उत्तर के रूप में स्वीकार करूंगा क्योंकि मैंने वास्तव Stringमें एक बिंदु पर हस्तक्षेप करने की कोशिश की थी और आशा है कि यह काम करेगा।
mtahmed

2
वैकल्पिक रूप से, आप के my_sttring.as_slice()रूप में व्यक्त कर सकते हैं my_string[](वर्तमान slicing_syntaxमें फीचर-गेटेड है, लेकिन शायद इसका कुछ रूप भाषा में समाप्त हो जाएगा)।
टेम्पेस्टेडप्ट

2

आप FromStrविशेषता की from_strविधि का उपयोग कर सकते हैं , जिसे इसके लिए लागू किया गया है i32:

let my_num = i32::from_str("9").unwrap_or(0);

0

नहीं। वहाँ क्यों होना चाहिए? यदि आपको इसकी आवश्यकता नहीं है तो बस स्ट्रिंग को छोड़ दें।

&strसे अधिक उपयोगी है Stringजब आपको केवल एक स्ट्रिंग पढ़ने की आवश्यकता होती है, क्योंकि यह केवल डेटा के मूल टुकड़े में एक दृश्य है, इसके मालिक नहीं। आप इसे अधिक आसानी से पास कर सकते हैं String, और यह प्रतिलिपि करने योग्य है, इसलिए इसे इनवोक किए गए तरीकों से नहीं खाया जाता है। इस संबंध में यह अधिक सामान्य है: यदि आपके पास एक है String, तो आप इसे पास कर सकते हैं जहां एक &strकी उम्मीद है, लेकिन अगर आपके पास है &str, तो आप इसे केवल उन कार्यों के लिए पास कर सकते हैं जो अपेक्षा कर रहे हैंString जब आप एक नया आवंटन करते हैं।

आप इन दोनों के बीच के अंतरों पर अधिक जानकारी प्राप्त कर सकते हैं और आधिकारिक स्ट्रिंग्स गाइड में उनका उपयोग कब कर सकते हैं


ठीक है, "क्यों होना चाहिए" का एक स्पष्ट कारण, मेरी राय में, यह है कि मुझे .as_slice()हर बार मुझे from_strएक स्ट्रिंग पर करने की आवश्यकता नहीं होगी । उदाहरण के लिए, कमांड लाइन की दलीलें, एक जगह है जहाँ मुझे from_strउन्हें intएस आदि के रूप में व्याख्या करने के लिए सभी
आर्गों

as_slice()स्ट्रिंग हैंडलिंग का केवल एक छोटा पहलू है। उदाहरण के लिए, आप स्लाइसिंग सिंटैक्स ( s[]) या शोषक Derefज़बरदस्ती ( &*s) का उपयोग कर सकते हैं । यहां तक ​​कि एक प्रस्ताव भी है जो सिर्फ लिखने की अनुमति देगा &s
व्लादिमीर मतावेव

Ooooh! &sएक तार के लिए क्या करेंगे ? क्या यह strपीठ देगा? क्या आप मुझे प्रस्ताव के बारे में बता सकते हैं?
mtahmed

1
सबसे पहले, strयह नहीं है कि आप किसके साथ काम कर रहे हैं; यह है &str। वे अलग (लेकिन संबंधित) हैं। पहले वाला एक गतिशील आकार का प्रकार है जिसे आप लगभग कभी सीधे उपयोग नहीं करेंगे, जबकि बाद वाला एक स्ट्रिंग टुकड़ा है जो वसा सूचक है। प्रस्ताव को deref coercions कहा जाता है ; यह से मजबूर करने की अनुमति होगी &Tकरने के लिए &Uकरता है, तो T: Deref<U>String: Deref<str>पहले से ही, आप बस &strसे प्राप्त करने में सक्षम होंगे । यह अभी भी चर्चा में है, लेकिन मुझे संदेह है कि यह 1.0 से पहले होगा - बहुत कम समय बचा है। String&
व्लादिमीर मतावेव

-1

तो मूल रूप से आप एक स्ट्रिंग को एक पूर्णांक अधिकार में बदलना चाहते हैं! यहाँ है जो मैं ज्यादातर उपयोग करता हूं और आधिकारिक दस्तावेज में भी इसका उल्लेख किया गया है।

fn main() {

    let char = "23";
    let char : i32 = char.trim().parse().unwrap();
    println!("{}", char + 1);

}

यह स्ट्रिंग और स्ट्रॉ दोनों के लिए काम करता है। आशा है कि यह भी मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.