2015-05-19 3 views
8

В Swift можно проверить, является ли строка допустимым двойным значением? Я использую следующее расширение от this question (но как поплавок), но если значение не может быть преобразован, он просто возвращает «0»:Проверьте, является ли строка допустимым двойным значением в Swift

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

В идеале, я хотел бы, чтобы вернуться nil так что он может быть пойманы в if-let, например, так:

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

если (количество - пол (номер)> 0,000001) {// 0,000001 может быть изменен в зависимости от уровня точности вам нужно // двойное значение } Try это? Это произошло здесь http://stackoverflow.com/questions/25552648/check-if-number-is-decimal-with-swift – Wraithseeker

ответ

10

Это действительно более эффективным, чтобы не создавать число форматировщик каждый раз, когда мы делаем преобразование:

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

Если вы идете по этому маршруту, любая причина не делает структуру первоклассной частью всего расширения класса ? Затем вы можете легко расширить строку, чтобы также поддерживать 'integerValue',' boolValue' и т. Д. И использовать один и тот же «Formatter». –

+1

@BlakeMerryman согласен, обновленный пример кода – andriys

+1

Примечание для других: NSNumberFormatter() был переименован в NumberFormatter в Swift 3, поэтому имя структуры даст вам ошибки. Все, что вам нужно сделать, это изменить свое имя. –

19

обновление: Xcode 7.1.1 • Swift 2.1

Вы можете использовать двойной инициализатора Double (строка :), чтобы создать расширение и использовать его, чтобы проверить, если ваша строка является допустимым двойной следующим образом:

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

Тестирование

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

Я бы предложил вам кеш-память NSNumberFormatter, если вы используете этот метод много (например, на tableViewCell) вам будет полезно кэшировать его. – EmilioPelaez

+0

@EmilioPelaez Как бы вы его кэшировали? – Fengson

+0

@Fengson его вопрос был сделан, когда ответ был в Swift 1, и в то время не было двойного (_ string :) инициализатора. этот ответ показывает, как это сделать в Swift 3.x и более поздних версиях https://stackoverflow.com/a/27705739/2303865 –

-5

Вот моя функция:

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 
} 

Просто назвать это так:

var check_if_is_number=je_stevilka(numberText) 
+0

это плохой шаблон для использования футляра змейки для быстрого разработчика, проверьте корпус верблюда. –

Смежные вопросы