2015-05-20 14 views
10

tôi cần phải trích xuất số từ chuỗi và đặt chúng vào một mảng mới trong Swift.Swift Làm thế nào để có được số nguyên từ chuỗi và chuyển đổi nó thành số nguyên

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

Tôi đã thử lặp từng ký tự và tôi không có ý tưởng so sánh giữa các ký tự và int.

+0

kiểm tra bài này cho làm thế nào để chuyển đổi một mục chuỗi thành int http: //stackoverflow.com/questions/24115141/swift-converting-string-to-int – Schuere

+0

let a: Int? = str.toInt() mang lại cho tôi một giá trị nil .. – alphonse

Trả lời

11

tiên, chúng ta chia chuỗi vì vậy chúng tôi có thể xử lý các mặt hàng duy nhất. Sau đó, chúng tôi sử dụng NSCharacterSet để chỉ chọn các số.

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

cảm ơn bạn, nhưng tôi đang tìm kiếm một cách dễ dàng hơn. Cảm ơn bạn! – alphonse

+0

Đó là cách dễ dàng hơn và tốt hơn để đạt được những gì bạn đang tìm kiếm. Để đơn giản hóa và dễ sử dụng trong ứng dụng của bạn, bạn không thể tạo một phần mở rộng của lớp String và tạo một phương thức có tên là 'extractNumbers' –

+3

Trong Swift 2, việc chia tách không còn hoạt động trên các chuỗi. xem 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) 
    } 
} 

Bí quyết ở đây là bạn có thể kiểm tra xem một chuỗi là một số nguyên (nhưng bạn không thể kiểm tra nếu một nhân vật là). Bằng cách lặp mặc dù mọi ký tự của chuỗi, hãy sử dụng phép nội suy chuỗi để tạo chuỗi từ ký tự và kiểm tra xem chuỗi ký tự đó có được gán thành một số nguyên hay không.
Nếu có thể, hãy thêm nó vào mảng.

// 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) 
    } 
} 

Ở đây chúng tôi chia chuỗi tại bất kỳ không gian nào và tạo một mảng của mỗi chuỗi con nằm trong chuỗi dài.
Chúng tôi một lần nữa kiểm tra tất cả các chuỗi để xem nếu nó là (hoặc có thể được đúc như) một số nguyên.

+0

cảm ơn rất nhiều! nhưng nó nhận ra 10 như 1 và 0. Làm thế nào tôi có thể nhận được số 10? – alphonse

+0

Luôn luôn có một khoảng trống giữa một số nguyên và bất kỳ thứ gì khác? – milo526

+0

không, ví dụ 10eggs, không có dấu cách giữa số và từ .. – alphonse

5

Sử dụng "chức năng helper regex" từ Swift extract regex matches:

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

bạn có thể đạt được điều đó một cách dễ dàng với

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] 

Các mô hình "\d+" trận đấu một hoặc chữ số thập phân hơn.


Tất nhiên tương tự có thể được thực hiện mà không cần dùng một hàm helper nếu bạn thích rằng vì lý do gì:

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] 

giải pháp thay thế mà không biểu thức thông thường:

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] 
+0

cảm ơn cho câu trả lời, bur Tôi đang tìm kiếm không sử dụng function.but Cảm ơn bạn rất nhiều. – alphonse

+0

@alphonse: Xem cập nhật. –

+0

cảm ơn bạn rất nhiều! – alphonse

0

Cám ơn tất cả mọi người đã trả lời câu hỏi của tôi.

tôi đang tìm kiếm một khối mã mà chỉ sử dụng nhanh chóng ngữ pháp, bởi vì tôi đang học ngữ pháp chỉ bây giờ ..

tôi nhận được câu trả lời cho question.Maybe của tôi nó không phải là một cách dễ dàng hơn để giải quyết, nhưng nó chỉ sử dụng ngôn ngữ nhanh.

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("") 

Điều đó sẽ giúp bạn có được một chuỗi với tất cả các số sau đó bạn chỉ có thể làm điều này:

let int = Int(intString) 

Chỉ cần chắc chắn rằng bạn Unwrap nó kể từ let int = Int(intString) là một tùy chọn.

+0

@flashadvanced Bạn nghĩ gì về câu trả lời này? –

1

Điều chỉnh từ @ flashadvanced's answer, Tôi nhận thấy rằng điều sau đây ngắn hơn và đơn giản hơn đối với tôi.

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) 

Cố gắng ở trong sân chơi và nó hoạt động

Hy vọng nó sẽ giúp :)

2

Swift 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

Bạn thật tuyệt vời. – BEm

Các vấn đề liên quan