2015-05-19 18 views
8

Trong Swift, làm cách nào để kiểm tra xem chuỗi có phải là giá trị kép hợp lệ không? Tôi đã sử dụng phần mở rộng sau đây từ this question (nhưng như một phao) nhưng nếu giá trị không thể được chuyển đổi, nó chỉ đơn giản trả về "0":Kiểm tra xem chuỗi có phải là giá trị kép hợp lệ trong Swift

extension String { 
    var doubleValue:Double? { 
     return (self as NSString).doubleValue 
    } 
} 

Lý tưởng nhất, tôi muốn nó trở lại nil để nó có thể được bị bắt trong một if-let, như vậy:

if let i = str.doubleValue { 
    object.price = i 
} else { 
    // Tell user the value is invalid 
} 
+0

if (số - sàn (số)> 0.000001) {// 0.000001 có thể thay đổi tùy thuộc vào mức độ chính xác bạn cần // giá trị gấp đôi } Thử điều này ra? Nó đến từ đây http://stackoverflow.com/questions/25552648/check-if-number-is-decimal-with-swift – Wraithseeker

Trả lời

10

Nó thực sự hiệu quả hơn không để tạo ra một định dạng số mỗi khi chúng ta làm một sự chuyển đổi là:

extension String { 
    struct NumFormatter { 
     static let instance = NumberFormatter() 
    } 

    var doubleValue: Double? { 
     return NumFormatter.instance.number(from: self)?.doubleValue 
    } 

    var integerValue: Int? { 
     return NumFormatter.instance.number(from: self)?.intValue 
    } 
} 
+2

Nếu đi tuyến đường này, bất kỳ lý do gì để không làm cho cấu trúc trở thành thành viên hạng nhất của toàn bộ phần mở rộng lớp ? Sau đó, bạn có thể dễ dàng mở rộng chuỗi để hỗ trợ 'integerValue',' boolValue', v.v. và chia sẻ cùng một 'Formatter'. –

+1

@BlakeMerryman đồng ý, cập nhật mã mẫu – andriys

+1

Lưu ý cho những người khác: NSNumberFormatter() đã được đổi tên thành NumberFormatter trong Swift 3 để tên cấu trúc sẽ cung cấp cho bạn lỗi. Tất cả những gì bạn phải làm là thay đổi tên của nó. –

19

update: Xcode 7.1.1 • Swift 2.1

Bạn có thể sử dụng hai initialiser đúp (string :) để tạo ra một phần mở rộng và sử dụng nó để kiểm tra xem chuỗi của bạn là một đôi có giá trị như sau:

extension String { 
    var doubleValue: Double? { 
     return Double(self) 
    } 
    var floatValue: Float? { 
     return Float(self) 
    } 
    var integerValue: Int? { 
     return Int(self) 
    } 
} 

Testing

let str = "b" 
if let value = str.doubleValue { 
    print(value) 
} else { 
    print("invalid input") 
} 
+3

Tôi sẽ đề nghị bạn cache NSNumberFormatter, nếu bạn sử dụng phương thức này rất nhiều (ví dụ trên một tableViewCell) bạn sẽ được hưởng lợi từ bộ nhớ đệm nó. – EmilioPelaez

+0

@EmilioPelaez Làm thế nào bạn sẽ đi về bộ nhớ đệm nó? – Fengson

+0

@Fengson câu hỏi của ông đã được thực hiện khi câu trả lời là trong Swift 1 và tại thời điểm đó không có đôi (_ string :) initializer. câu trả lời này cho thấy làm thế nào để làm điều đó trong Swift 3.x và sau đó https://stackoverflow.com/a/27705739/2303865 –

-5

đây là chức năng của tôi:

func je_numerik(text:Character)->Bool //en znak 
{ 
    if((text=="0")||(text=="1")||(text=="2")||(text=="3")||(text=="4")||(text=="5")||(text=="6")||(text=="7")||(text=="8")||(text=="9")){ 
     return true 
    } 
    else 
    { 
     return false 
    } 
} 

func je_stevilka(text: String)->Bool 
{ 
    var pika:Character 
    pika="." 

    var je_stevilka=true 
    //var znaki = Character(text) 
    var znaki=Array(text) 
    var stevilo_znakov=znaki.count 

    if(stevilo_znakov==0) 
    { 
     je_stevilka=false 
    } 
    else 
    { 
     if(stevilo_znakov==1) 
     { 
      if(je_numerik(znaki[0])) 
      { 
       je_stevilka=true 
      } 
      else 
      { 
       je_stevilka=false 
      } 
     } 
     else 
     { 

      if((je_numerik(znaki[0])) && (!((znaki[0]=="0")&&((znaki[1]=="0"))))&&(!((znaki[0]=="0")&&((je_numerik(znaki[1])))))) 
      { 

       var je_pika=false 
       for var i = 0; i < stevilo_znakov; i++ 
       { 
        if(je_numerik(znaki[i])||(znaki[i]==pika)) 
        { 
         if(znaki[i]==pika) 
         { 
          if(je_pika) 
          { 
           je_stevilka=false 
          } 
          else 
          { 
           je_pika=true 
           if(stevilo_znakov==(i+1)) 
           { 
            je_stevilka=false 
           } 
          } 
         } 
        } 
        else 
        { 
         je_stevilka=false 
        } 
       } 
      } 
      else 
      { 
       je_stevilka=false 
      } 
     } 
    } 

    return je_stevilka 
} 

Chỉ cần gọi nó như thế này:

var check_if_is_number=je_stevilka(numberText) 
+0

đó là một mô hình xấu để sử dụng trường hợp rắn cho nhà phát triển nhanh chóng, kiểm tra trường hợp lạc đà. –

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