Swift에서 문자열을 Float로 변환


101

나는 UITextField에서 가져온 숫자를 실제로 String으로 변환하고 Float로 변환하여 곱할 수 있도록 노력하고 있습니다.

UITextfield다음과 같이 선언 된 두 가지 가 있습니다.

@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField

사용자가 UIButton을 눌렀을 때 사용자가 벌어 들인 임금을 계산하고 싶지만, 사용하기 전에 먼저 수레로 변환해야하므로 계산할 수 없습니다.

이 작업을 수행하여 정수로 변환하는 방법을 알고 있습니다.

var wageConversion:Int = 0
wageConversion = wage.text.toInt()!

그러나 나는 그것들을 수레로 변환하는 방법을 모릅니다.

답변:


200

Swift 2.0 이상

이제 Swift 2.0Float(Wage.text) 에서는 Float?유형 을 반환하는 것을 사용할 수 있습니다 . 그냥 반환하는 아래 솔루션보다 더 명확합니다 0.

어떤 이유로 0유효하지 않은 값을 원한다면 유효하지 않은 경우 반환 되는 값을 Float사용할 수 있습니다 .Float(Wage.text) ?? 00Float


오래된 솔루션

이를 처리하는 가장 좋은 방법은 직접 캐스팅입니다.

var WageConversion = (Wage.text as NSString).floatValue

나는 실제로 extension이것을 더 잘 사용 하기 위해 만들었 습니다.

extension String {
    var floatValue: Float {
        return (self as NSString).floatValue
    }
}

이제 전화를 걸어 var WageConversion = Wage.text.floatValue내선이 브리지를 처리하도록 허용 할 수 있습니다!

이것은 실제 부동 (로 입력 .)을 처리 할 수 있고 사용자가 텍스트를 입력 필드 ( 12p.34또는 심지어 12.12.41) 로 복사하는 것을 방지 하기 때문에 좋은 구현 입니다.

분명히 Apple이 floatValueSwift 에 a 를 추가 하면 예외가 발생하지만 그 동안에는 좋을 수 있습니다. 나중에 추가하는 경우 코드를 수정하기 위해해야 ​​할 일은 확장 기능을 제거하는 것뿐입니다 .floatValue. 이미 호출하고 있기 때문에 모든 것이 원활하게 작동합니다 .

또한 변수와 상수는 소문자 (포함 IBOutlets)로 시작해야합니다.


확장은 필요하지 않으며, @tom은 Wage.text.floatValue 만 있으면됩니다. 게시되는 답변과 지금 사이에 이것이 바뀌 었는지 확실하지 않지만 한동안 거기에있었습니다.
sketchyTech

3
@GoodbyeStackOverflow, 베타 4를 사용하고 있으며 확실히 작동하지 않습니다. 베타 5에서 변경했을까요? NSStringfloatValue확장 기능을하지만, String하지 않습니다. 오류 'String' does not have member named floatValue
가져 오기

이것이 이유 일 수 있습니다. 또한 파일 맨 위에 Import Foundation이 있습니까?
sketchyTech

문자열이 숫자가 아니면 NSString.floatValue는 0을 반환하기 때문에 적어도 Swift 표준에서는 이것을 매우 안전하다고 생각하지 않습니다. 이것은 예외를 트리거하거나 적어도 nil을 반환해야합니다.
Ixx

let floatValue = (Float)(Wage.text)... Swift 2.0에서
TheTiger 2016 년

23

예를 들어 세계의 일부 지역에서는 소수 대신 쉼표가 사용되기 때문입니다. 문자열을 float로 변환하려면 NSNumberFormatter를 만드는 것이 가장 좋습니다.

let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let number = numberFormatter.numberFromString(self.stringByTrimmingCharactersInSet(Wage.text))

18

다음과 같이 String을 Float로 변환합니다.

let numberFormatter = NSNumberFormatter()
let number = numberFormatter.numberFromString("15.5")
let numberFloatValue = number.floatValue

println("number is \(numberFloatValue)") // prints "number is 15.5"

나는 이것이 최선의 해결책이라고 생각합니다 (적어도 빠른 4+의 경우), 주된 이유는 선택 사항을 반환한다는 것입니다 ( NSString.floatValue0이 잘못되면 단순히 반환 하는). 참고 NSNumberFormatter변경되었습니다 NumberFormatter.
Rom

9

최신 정보

허용되는 답변은 최신 방식을 보여줍니다.

스위프트 1

Paul Hegarty가 2015 년 Stanford의 CS193p 수업에서 보여준 방법입니다.

wageConversion = NSNumberFormatter().numberFromString(wage.text!)!.floatValue

매번 그렇게 할 필요가 없도록 계산 된 속성을 만들 수도 있습니다.

var wageValue: Float {
        get {
            return NSNumberFormatter().numberFromString(wage.text!)!.floatValue
        }
        set {
            wage.text = "\(newValue)"
        }
    }

5

허용 된 솔루션을 사용하여 내 "1.1"(. floatValue 변환을 사용할 때)이 1.10000002384186으로 변환된다는 것을 발견했습니다. 그러나 .doubleValue를 대신 사용하면 원하는 1.1을 얻을 수 있습니다.

예를 들어 허용 된 솔루션을 사용하는 대신 다음을 대신 사용했습니다.

var WageConversion = (Wage.text as NSString).doubleValue

제 경우에는 배정 밀도가 필요하지 않았지만 .floatValue를 사용하면 적절한 결과를 얻지 못했습니다.

다른 사람이 같은 문제를 겪고있는 경우를 대비하여 토론에 추가하고 싶었습니다.


5

아래는 선택적 Float를 제공합니다. 마지막에 그것이 Float인지 알고 있다면 if / let을 사용하십시오.

let wageConversion = Float(wage.text)

4

다음은 rdprado의 답변에서 Paul Hegarty의 솔루션에 대한 Swift 3 적응입니다. 옵션이 추가되었는지 확인합니다 (프로세스의 일부가 실패하면 0.0을 반환합니다).

var wageFloat:Float = 0.0

if let wageText = wage.text {
    if let wageNumber = NumberFormatter().number(from: wageText) {
        wageFloat = wageNumber.floatValue
    }
}

그건 그렇고, 저는 여전히 Objective-C를 가르치고있을 때 iTunes University를 사용하여 Stanford의 CS193p 수업을 들었습니다.

Paul Hegarty가 FANTASTIC 강사라는 것을 알게되었고 Swift에서 iOS 개발자로 시작하는 모든 사람에게이 수업을 강력히 추천합니다 !!!


1
이것은 Swift 3 이상에 대한 유일한 정답입니다. NumberFormatter사용자가 입력 한 부동 소수점 수를 처리 하려면 a 를 사용해야 합니다.
rmaddy

3
import Foundation
"-23.67".floatValue // => -23.67

let s = "-23.67" as NSString
s.floatValue // => -23.67

3
이 코드가 작동하는 이유를 설명하십시오. 이것은 작동을 이해하지 않고 복사 및 붙여 넣기를 방지합니다.
rayryeng jul.

3

스위프트 4에서

let Totalname = "10.0" //Now it is in string

let floatVal  = (Totalname as NSString).floatValue //Now converted to float


1

접근 방식과 결과에 따라 매우 유사한 두 가지 옵션이 있습니다.

// option 1:
var string_1 : String = "100"
var double_1 : Double = (string_1 as NSString).doubleValue + 99.0

// option 2: 
var string_2 : NSString = "100"
// or:  var string_2 = "100" as NSString
var number_2 : Double = string_2.doubleValue;

2
bridgeToObjectiveC ()는 베타 5에서 제거되었습니다
carmen_munich

1

Double() 다음과 같이 Int에서 Double을 빌드합니다.

var convertedDouble = Double(someInt)

텍스트에 실제로 숫자가 포함 된 경우에만 작동합니다. 때문에 Wage텍스트 필드, 사용자는 그들이 원하는대로 입력 할 수 있습니다 그리고 당신은 선택 사항에서 반환 언 박싱 갈 때 런타임 오류를 트리거합니다 toInt(). 개봉을 강제하기 전에 변환이 성공했는지 확인해야합니다.

if let wageInt = Wage.text?.toInt() {
    //we made it in the if so the conversion succeeded.
    var wageConversionDouble = Double(wageInt)
}

편집하다:

텍스트가 정수라고 확신하는 경우 다음과 같이 할 수 있습니다 ( textUITextField에서도 선택 사항 임).

if let wageText = Wage.text {
    var wageFloat = Double(wageText.toInt()!)
}

음, 키패드는 Decimal Pad이므로 사용자가 숫자 만 입력 할 수 있으므로 실제로 숫자 이외의 다른 항목은 입력 할 수 없습니다.
Stephen Fox

1
wageConversionFloat절대로 float가 될 수 없으며, 입력 문자열이 234.56. 수락 / 찬성 된 솔루션이 될 수있는 방법 ...?
holex

이 대답은 텍스트에 10 진수 값이 포함되어 있으면 작동하지 않습니다. 예-이 답변은 3텍스트 필드에 3.5. 텍스트가 처음으로 변환되기 때문입니다 Int다음은, IntA를 변환됩니다 Float.
rmaddy

1
@StephenFox 사용자가 숫자가 아닌 텍스트를 텍스트 필드에 붙여 넣을 수 있거나 사용자가 외부 키보드를 가지고있을 수 있음을 명심하십시오. 데이터 입력을 위해 키보드에만 의존하지 마십시오.
rmaddy

실제로 그것은 소수가 아닌 정수로 작동합니다. 소수는 치명적인 오류를 발생시킵니다!
Miles Works

1

UITextField의 입력 값을 가져와 float로 캐스팅하는 다른 방법을 찾았습니다.

    var tempString:String?
    var myFloat:Float?

    @IBAction func ButtonWasClicked(_ sender: Any) {
       tempString = myUITextField.text
       myFloat = Float(tempString!)!
    }

1

당신이 사용할 수있는,

let wg = Float(wage.text!)

부동 소수점을 소수점 이하 2 자리로 반올림하려면 다음을 수행하십시오.

let wg = Float(String(format: "%.2f",wage.text!)

0

이것이 내가 접근 한 방법입니다. 어쨌든 Xcode 6 베타 5에서 제거 되었기 때문에 "다리 건너기"를 원하지 않았습니다.

extension String {

    // converting a string to double
    func toDouble() -> Double? {

        // split the string into components
        var comps = self.componentsSeparatedByString(".")

        // we have nothing
        if comps.count == 0 {
            return nil
        }
        // if there is more than one decimal
        else if comps.count > 2 {
            return nil
        }
        else if comps[0] == "" || comps[1] == "" {
            return nil
        }

        // grab the whole portion
        var whole = 0.0
        // ensure we have a number for the whole
        if let w = comps[0].toInt() {
            whole = Double(w)
        }
        else {
            return nil
        }

        // we only got the whole
        if comps.count == 1 {

            return whole

        }

        // grab the fractional
        var fractional = 0.0
        // ensure we have a number for the fractional
        if let f = comps[1].toInt() {

            // use number of digits to get the power
            var toThePower = Double(countElements(comps[1]))

            // compute the fractional portion
            fractional = Double(f) / pow(10.0, toThePower)

        }
        else {
            return nil
        }

        // return the result
        return whole + fractional
    }

    // converting a string to float
    func toFloat() -> Float? {

        if let val = self.toDouble() {
            return Float(val)
        }
        else {
            return nil
        }

    }

}


// test it out
var str = "78.001"

if let val = str.toFloat() {
    println("Str in float: \(val)")
}
else {
    println("Unable to convert Str to float")
}

// now in double
if let val = str.toDouble() {
    println("Str in double: \(val)")
}
else {
    println("Unable to convert Str to double")
}

1
예를 들어 세계의 일부 지역에서는 소수 대신 쉼표가 사용되기 때문입니다. 문자열을 float로 변환하려면 NSNumberFormatter를 만드는 것이 가장 좋습니다. @DmitriFuerle 응답에서 봐
carmen_munich

@PartiallyFrozenOJ toDouble()"10"문자열로 함수 를 시도해 보셨나요? 어쨌든 충돌합니다. 이 경우 카운트는 1이되고 당신은 그것을 처리하지 않기 때문입니다. 에 충돌 else if comps[0] == "" || comps[1] == ""합니다. 어쨌든 당신은 회심에 너무 진지합니다.
TheTiger 2016 년

@PartiallyFrozenOJ하지만 2014 년에도 조건이 같으면. 어쨌든 문제 없습니다!
TheTiger 2016 년

0

완전성을 위해 이것은 UITextField다른 로케일도 고려할 수 있는 확장을 사용하는 솔루션 입니다.

Swift 3 이상

extension UITextField {
    func floatValue(locale : Locale = Locale.current) -> Float {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        numberFormatter.locale = locale

        let nsNumber = numberFormatter.number(from: text!)
        return nsNumber == nil ? 0.0 : nsNumber!.floatValue
    }
}

일반적인 해결책으로 이것은 아마도 a를 반환하고 Float?잘못된 값을 0.0. 호출자가 let val = field.floatValue ?? 0.0주어진 케이스가 잘못된 결과를 0으로 처리해야하는 경우 와 같은 작업을 수행하도록합니다 .
rmaddy

0

Swift 4/5, Float (value) 만 사용하십시오.

let string_value : String = "123200"

let float_value : Float = Float(string_value)

print(float_value)

답변 : 123200


-1

이것을 사용하십시오 :

 // get the values from text boxes
    let a:Double = firstText.text.bridgeToObjectiveC().doubleValue
    let b:Double = secondText.text.bridgeToObjectiveC().doubleValue

//  we checking against 0.0, because above function return 0.0 if it gets failed to convert
    if (a != 0.0) && (b != 0.0) {
        var ans = a + b
        answerLabel.text = "Answer is \(ans)"
    } else {
        answerLabel.text = "Input values are not numberic"
    }

1
bridgeToObjectiveC ()는 베타 5에서 제거되었습니다
carmen_munich

-4

쉬운 방법:

// toInt returns optional that's why we used a:Int?
let a:Int? = firstText.text.toInt()
let b:Int? = secondText.text.toInt()

// check a and b before unwrapping using !
if a && b {
    var ans = a! + b!
    answerLabel.text = "Answer is \(ans)"
} else {
    answerLabel.text = "Input values are not numberic"
}

다른 계산에도 동일한 접근 방식을 사용할 수 있습니다.


3
이만큼 대단한 그는 요구했습니다float
Jack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.