Подтвердить что ты не робот

Проверьте, является ли строка допустимым двойным значением в Swift

В Swift можно проверить, является ли строка допустимым двойным значением? Я использовал следующее расширение из этого вопроса (но как float), но если значение не может быть преобразовано, оно просто возвращает "0":

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
}
4b9b3361

Ответ 1

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

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

редактирование/обновление: Xcode 9 или более поздняя версия • Swift 4 или более поздняя версия

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

extension StringProtocol {
    var double: Double? {
        return Double(self)
    }
    var float: Float? {
        return Float(self)
    }
    var integer: Int? {
        return Int(self)
    }
}

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

let str = "2.9"
if let value = str.double  {
    print(value)           // "2.9\n"
} else {
    print("invalid input")
}

str.prefix(1).integer  // 2
str.suffix(1).integer  // 9

Ответ 3

Почему бы не позволить ему вернуть false? Или true конечно.

extension String {

    func isInt() -> Bool {

        if let intValue = Int(self) {
            return true
        }

        return false
    }

    func isFloat() -> Bool {

        if let floatValue = Float(self) {
            return true
        }

        return false
    }

    func isDouble() -> Bool {

        if let doubleValue = Double(self) {
            return true
        }

        return false
    }

    func numberOfCharacters() -> Int {
        return self.characters.count
    }
}

Или даже лучше, как предложено @LeoDabus:

extension StringProtocol {
    var isInteger: Bool { return Int(self) != nil }
    var isFloat: Bool { return Float(self) != nil }
    var isDouble: Bool { return Double(self) != nil }
} 

Ответ 4

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

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)