2015-05-19 6 views
8

W Swift, jak sprawdzić, czy ciąg znaków jest prawidłową podwójną wartością? Używam następujące rozszerzenia z this question (ale jako float), ale jeśli wartość nie może być przekształcony, po prostu zwraca wartość „0”:Sprawdź, czy łańcuch jest prawidłową podwójną wartością w Swift

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

Idealnie chciałabym to powrót nil więc może być złowionych w if-let, tak:

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

if (liczba - podłoga (liczba)> 0,000001) {// 0,000001 mogą być zmieniane w zależności od poziomu precyzji trzeba // podwójna wartość } Try to na zewnątrz? Pochodzi stąd http://stackoverflow.com/questions/25552648/check-if-number-is-decimal-with-swift – Wraithseeker

Odpowiedz

10

To jest rzeczywiście więcej nie wydajne, aby utworzyć numer formatowania za każdym razem robimy konwersję:

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

Jeśli idziesz tą trasą, z jakiegokolwiek powodu, aby nie uczynić tej struktury członkiem najwyższej klasy w całym rozszerzeniu klasy ? Następnie możesz łatwo przedłużyć ciąg znaków, aby również obsługiwać 'integerValue',' boolValue', itd. I udostępniać ten sam 'Formatter'. –

+1

@BlakeMerryman zgadzam się, zaktualizowany kod przykładowy – andriys

+1

Uwaga dla innych: NSNumberFormatter() został przemianowany na NumberFormatter w Swift 3, więc nazwa struct da ci błędy. Wszystko, co musisz zrobić, to zmienić jego nazwę. –

19

zmiana: Xcode 7.1.1 • Swift 2.1

można użyć dwukrotnie initialiser double (ciąg :) stworzyć wewnętrzny używać go w celu sprawdzenia, czy ciąg jest ważny podwójnie następująco:

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

Proponuję cache NSNumberFormatter, jeśli używasz tej metody dużo (na przykład na tableViewCell) możesz skorzystać z buforowania go. – EmilioPelaez

+0

@EmilioPelaez W jaki sposób chciałbyś go buforować? – Fengson

+0

@Fengson jego pytanie zostało wykonane, gdy odpowiedź była w Swift 1 i wtedy nie było żadnego inicjatora Double (_ string :). ta odpowiedź pokazuje, jak to zrobić w Swift 3.x i nowszych https://stackoverflow.com/a/27705739/2303865 –

-5

Oto moja funkcja:

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 
} 

Wystarczy nazwać tak:

var check_if_is_number=je_stevilka(numberText) 
+0

jest to zły wzór, aby użyć przypadku węża dla szybkiego autora, sprawdź skrzynkę wielbłąda. –