2015-05-20 18 views
10

Dizedeki sayıları ayıklamak ve Swift'de yeni bir diziye koymam gerekiyor. Swift Dize ile tamsayı nasıl elde edilir ve tamsayıya dönüştürülür

var str = "I have to buy 3 apples, 7 bananas, 10eggs" 

ben döngü her karakter çalıştı ve ben Karakterler ve Int arasında karşılaştırmak için hiçbir fikrim yok.

+0

çek için bu yayını Umut işleri dize öğesini int http olarak nasıl dönüştürebilirim: //stackoverflow.com/questions/24115141/swift-converting-string-to-int – Schuere

+0

let a: Int? = str.toInt() bana bir nil değeri verir .. – alphonse

cevap

11

İlk olarak, tek öğeleri işleyebilmemiz için dizeyi böleriz. Daha sonra sadece sayıları seçmek için NSCharacterSet kullanıyoruz. "Regex yardımcı işlevini kullanma"

import Foundation 

let str = "I have to buy 3 apples, 7 bananas, 10eggs" 
let strArr = str.split(separator: " ") 

for item in strArr { 
    let components = 
    item.components(separatedBy: CharacterSet.decimalDigits.inverted) 
    let part: String = components.joined() 

    if let intVal = Int(part) { 
     print("this is a number -> \(intVal)") 
    } 
} 
+0

Teşekkürler, ama daha kolay bir yol arıyorum. Teşekkür ederim! – alphonse

+0

Aradığınızı elde etmenin daha kolay ve daha iyi yolu. Uygulamanızda basitleştirmek ve kolay kullanım için, String sınıfının bir uzantısı oluşturamaz ve 'extractNumbers' adlı bir yöntem oluşturamazsınız. –

+3

Swift 2'de, split artık Dizeler üzerinde çalışmaz. bir cevap için teşekkürler http://stackoverflow.com/a/30759312/2959462 –

1
// This will only work with single digit numbers. Works with “10eggs” (no space between number and word 
var str = "I have to buy 3 apples, 7 bananas, 10eggs" 
var ints: [Int] = [] 
for char:Character in str { 
    if let int = "\(char)".toInt(){ 
    ints.append(int) 
    } 
} 

burada hüner bir dize bir tamsayı olup olmadığını kontrol edebilirsiniz (ama bir karakter olup olmadığını kontrol edemez) olmasıdır. Dizenin her karakterini döndürerek, karakterden bir dize oluşturmak için dize enterpolasyonunu kullanın ve bu dize kasasının bir tamsayı olarak oluşturulup oluşturulmadığını kontrol edin.
Eğer varsa, diziye ekleyin.

// This will work with multi digit numbers. Does NOT work with “10 eggs” (has to have a space between number and word) 
var str = "I have to buy 3 apples, 7 bananas, 10 eggs" 
var ints: [Int] = [] 
var strArray = split(str) {$0 == " "} 
for subString in strArray{ 
    if let int = subString.toInt(){ 
    ints.append(int) 
    } 
} 

Burada herhangi boşlukta dize bölmek ve uzun dizede her alt dize dizisi oluşturun.
Yine bir tamsayı olup olmadığını (veya bir tam sayı olarak alınabileceğini) görmek için her dizgiyi kontrol ediyoruz.

+0

çok teşekkürler! ama 10 ve 1 gibi 10'u tanır. – alphonse

+0

Bir tam sayı ile başka bir şey arasında her zaman bir boşluk var mı? – milo526

+0

hayır, örneğin, 10eggs, sayı ve kelime arasında boşluk yok .. – alphonse

5

Swift extract regex matches den:

func matchesForRegexInText(regex: String!, text: String!) -> [String] { 

    let regex = NSRegularExpression(pattern: regex, 
     options: nil, error: nil)! 
    let nsString = text as NSString 
    let results = regex.matchesInString(text, 
     options: nil, range: NSMakeRange(0, nsString.length)) 
     as! [NSTextCheckingResult] 
    return map(results) { nsString.substringWithRange($0.range)} 
} 

Eğer

let str = "I have to buy 3 apples, 7 bananas, 10eggs" 
let numbersAsStrings = matchesForRegexInText("\\d+", str) // [String] 
let numbersAsInts = numbersAsStrings.map { $0.toInt()! } // [Int] 

println(numbersAsInts) // [3, 7, 10] 

desen "\d+" maçlarda bir veya daha fazla ondalık rakam ile kolayca elde edebilirsiniz. İsterseniz aynı Tabii


bir yardımcı işlevi kullanılmadan yapılabileceğini Sebebi ne olursa olsun:

let str = "I have to buy 3 apples, 7 bananas, 10eggs" 

let digits = "" 
let numbers = split(str, allowEmptySlices: false) { !contains(digits, $0) } 
    .map { $0.toInt()! } 
println(numbers) // [3, 7, 10] 
: Normal ifadeler olmadan

let str = "I have to buy 3 apples, 7 bananas, 10eggs" 
let regex = NSRegularExpression(pattern: "\\d+", options: nil, error: nil)! 
let nsString = str as NSString 
let results = regex.matchesInString(str, options: nil, range: NSMakeRange(0, nsString.length)) 
    as! [NSTextCheckingResult] 
let numbers = map(results) { nsString.substringWithRange($0.range).toInt()! } 
println(numbers) // [3, 7, 10] 

Alternatif çözüm

+0

bakın, bur function.but kullanarak değil arıyorum Çok teşekkür ederim. – alphonse

+0

@alphonse: Güncellemeye bakın. –

+0

çok teşekkür ederim! – alphonse

0

Soruma cevap veren herkes için teşekkürler. Bunun çözümü için daha kolay bir yol değildir benim question.Maybe bir cevap buluyorsun

ben ancak şimdi dilbilgisi öğreniyorum çünkü sadece hızlı dilbilgisi kullanan bir kod bloğu arıyordu .., ama sadece hızlı dil kullanır. sen iyi bir sayı ile bir dize alacak

var article = "I have to buy 3 apples, 7 bananas, 10 eggs" 
var charArray = Array(article) 

var unitValue = 0 
var total = 0 
for char in charArray.reverse() { 

    if let number = "\(char)".toInt() { 
     if unitValue==0 { 
      unitValue = 1 
     } 
     else { 
      unitValue *= 10 
     } 
     total += number*unitValue 
    } 
    else { 
     unitValue = 0 
    } 
} 
println("I bought \(total) apples.") 
9
let str = "Hello 1, World 62" 
let intString = str.componentsSeparatedByCharactersInSet(
    NSCharacterSet 
     .decimalDigitCharacterSet() 
     .invertedSet) 
    .joinWithSeparator("") 

o zaman bunu sadece yapabilirsiniz:

let int = Int(intString) 

Sadece bir isteğe bağlıdır let int = Int(intString) beri paketini emin olun.

+0

@flashadvanced Bu cevap hakkında ne düşünüyorsunuz? –

1

@ flashadvanced'in answer, adresinden uyarlanması Aşağıdakilerin daha kısa ve benim için daha kolay olduğunu buldum.

let str = "I have to buy 3 apples, 7 bananas, 10eggs" 
let component = str.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) 
let list = component.filter({ $0 != "" }) // filter out all the empty strings in the component 
print(list) 

oyun toprağa Yargılandı ve

yardımcı olur :) Swift

2

2,2

let strArr = str.characters.split{$0 == " "}.map(String.init) 

     for item in strArr { 
      let components = item.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) 

       let part = components.joinWithSeparator("") 

        if let intVal = Int(part) { 
         print("this is a number -> \(intVal)") 
         } 
       } 
9

Swift 3

let string = "0kaksd020dk2kfj2123" 
if let number = Int(string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) { 
    // Do something with this number 
} 
+2

Harikasınız. – BEm

İlgili konular