[swift] Swift-문자열을 Double로 변환하는 방법

빠른 언어로 BMI 프로그램을 작성하려고합니다. 그리고이 문제가 있습니다 : String을 Double로 변환하는 방법?

Objective-C에서 다음과 같이 할 수 있습니다.

double myDouble = [myString doubleValue];

그러나 어떻게 스위프트 언어로 이것을 달성 할 수 있습니까?



답변

스위프트 4.2 + 문자열을 두 배로

새 유형 이니셜 라이저를 사용하여 문자열과 숫자 유형 (Double, Float, Int)을 변환해야합니다. 올바른 값을 갖는 선택적 유형 (Double?)을 반환하거나 문자열이 숫자가 아닌 경우 nil을 반환합니다.

참고 : NSString doubleValue 속성은 값을 변환 할 수없는 경우 0을 반환하므로 권장되지 않습니다 (예 : 잘못된 사용자 입력).

let lessPrecisePI = Float("3.14")

let morePrecisePI = Double("3.1415926536")
let invalidNumber = Float("alphabet") // nil, not a valid number

if / let을 사용하여 값을 풀어서 사용하십시오.

if let cost = Double(textField.text!) {
    print("The user entered a value price of \(cost)")
} else {
    print("Not a valid number: \(textField.text!)")
}

NumberFormatter클래스를 사용하여 형식이 지정된 숫자와 통화를 변환 할 수 있습니다 .

let formatter = NumberFormatter()
formatter.locale = Locale.current // USA: Locale(identifier: "en_US")
formatter.numberStyle = .decimal
let number = formatter.number(from: "9,999.99")

통화 형식

let usLocale = Locale(identifier: "en_US")
let frenchLocale = Locale(identifier: "fr_FR")
let germanLocale = Locale(identifier: "de_DE")
let englishUKLocale = Locale(identifier: "en_GB") // United Kingdom
formatter.numberStyle = .currency

formatter.locale = usLocale
let usCurrency = formatter.number(from: "$9,999.99")

formatter.locale = frenchLocale
let frenchCurrency = formatter.number(from: "9999,99€")
// Note: "9 999,99€" fails with grouping separator
// Note: "9999,99 €" fails with a space before the €

formatter.locale = germanLocale
let germanCurrency = formatter.number(from: "9999,99€")
// Note: "9.999,99€" fails with grouping separator

formatter.locale = englishUKLocale
let englishUKCurrency = formatter.number(from: "£9,999.99")

String을 Double 형식 (및 통화)으로 변환하는 방법 에 대한 내 블로그 게시물 에서 자세한 내용을 읽으십시오 .


답변

스위프트 2 업데이트
가 많은 답변이 언급 한대로가 아닌 숫자 값에 0을 반환하기 때문에,있는 NSString의 두 배 값이 매우 안전하지 않습니다 (더 관용적하고 안전한 방법으로이 작업을 수행 할 수 있도록 새로운 failable 이니셜이 수단.있는 그 doubleValue"foo""0"있습니다 똑같다.)

let myDouble = Double(myString)

이것은 선택 사항을 반환하므로 0을 반환 한 "foo"위치를 전달하는 경우 doubleValue실패 가능한 초기화 프로그램이 반환 nil됩니다. 당신은을 사용할 수 있습니다 guard, if-let또는 map을 처리하는Optional<Double>

Original Post :
승인 된 제안과 같이 NSString 생성자를 사용할 필요는 없습니다. 다음과 같이 간단히 브리지 할 수 있습니다.

(swiftString as NSString).doubleValue


답변

좀 더 스위프트 느낌의 경우을 사용 NSFormatter()하면 캐스팅을 피하고 문자열에 값이 포함되지 않은 경우 NSString반환 합니다 (예 : “test”는 반환되지 않음 ).nilDouble0.0

let double = NSNumberFormatter().numberFromString(myString)?.doubleValue

또는 Swift의 String유형을 확장하십시오 .

extension String {
    func toDouble() -> Double? {
        return NumberFormatter().number(from: self)?.doubleValue
    }
}

그것을 다음과 같이 사용하십시오 toInt():

var myString = "4.2"
var myDouble = myString.toDouble()

Double?래핑되지 않은 옵션 을 반환합니다 .

강제 랩핑 해제 중 하나 :

println("The value is \(myDouble!)") // prints: The value is 4.2

또는 if let 문으로 :

if let myDouble = myDouble {
    println("The value is \(myDouble)") // prints: The value is 4.2
}

업데이트 :
지역화의 경우 다음과 같이 NSFormatter에 로케일을 적용하는 것이 매우 쉽습니다.

let formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "fr_FR")
let double = formatter.numberFromString("100,25")

마지막으로 NSNumberFormatterCurrencyStyle문자열에 통화 기호가 포함 된 통화로 작업하는 경우 포맷터에서 사용할 수 있습니다 .


답변

여기 또 다른 옵션은 이것을로 변환 NSString하고 사용하는 것입니다.

let string = NSString(string: mySwiftString)
string.doubleValue


답변

다음은 Swift 문자열에서 doubleValue ()를 호출하고 double back을 얻는 확장 메소드입니다 (예제 출력 우선)

println("543.29".doubleValue())
println("543".doubleValue())
println(".29".doubleValue())
println("0.29".doubleValue())

println("-543.29".doubleValue())
println("-543".doubleValue())
println("-.29".doubleValue())
println("-0.29".doubleValue())

//prints
543.29
543.0
0.29
0.29
-543.29
-543.0
-0.29
-0.29

확장 방법은 다음과 같습니다.

extension String {
    func doubleValue() -> Double
    {
        let minusAscii: UInt8 = 45
        let dotAscii: UInt8 = 46
        let zeroAscii: UInt8 = 48

        var res = 0.0
        let ascii = self.utf8

        var whole = [Double]()
        var current = ascii.startIndex

        let negative = current != ascii.endIndex && ascii[current] == minusAscii
        if (negative)
        {
            current = current.successor()
        }

        while current != ascii.endIndex && ascii[current] != dotAscii
        {
            whole.append(Double(ascii[current] - zeroAscii))
            current = current.successor()
        }

        //whole number
        var factor: Double = 1
        for var i = countElements(whole) - 1; i >= 0; i--
        {
            res += Double(whole[i]) * factor
            factor *= 10
        }

        //mantissa
        if current != ascii.endIndex
        {
            factor = 0.1
            current = current.successor()
            while current != ascii.endIndex
            {
                res += Double(ascii[current] - zeroAscii) * factor
                factor *= 0.1
                current = current.successor()
           }
        }

        if (negative)
        {
            res *= -1;
        }

        return res
    }
}

오류 검사는 없지만 필요한 경우 추가 할 수 있습니다.


답변

스위프트 1.1 직접 전달할 수 있습니다 Stringconst char *매개 변수입니다.

import Foundation

let str = "123.4567"
let num = atof(str) // -> 123.4567

atof("123.4567fubar") // -> 123.4567

더 이상 사용되지 않으려면 atof:

strtod("765.4321", nil) // -> 765.4321

한 가지주의 사항 : 변환 동작은과 다릅니다 NSString.doubleValue.

atofstrtod동의를 0x앞에 둔 16 진수 문자열을 :

atof("0xffp-2") // -> 63.75
atof("12.3456e+2") // -> 1,234.56
atof("nan") // -> (not a number)
atof("inf") // -> (+infinity)

.doubleValue행동 을 선호하는 경우 CFString브리징을 계속 사용할 수 있습니다 .

let str = "0xff"
atof(str)                      // -> 255.0
strtod(str, nil)               // -> 255.0
CFStringGetDoubleValue(str)    // -> 0.0
(str as NSString).doubleValue  // -> 0.0


답변

Swift 2.0에서 가장 좋은 방법은 Objective-C 개발자처럼 생각하지 않는 것입니다. 따라서 “String을 Double로 변환”하지 말고 “String에서 Double을 초기화”해야합니다. 여기 Apple 문서 :
https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_Double_Structure/index.html#//apple_ref/swift/structctr/Double/s:FSdcFMSdFSSGSqSd_

선택적인 init이므로 nil 통합 연산자 (??)를 사용하여 기본값을 설정할 수 있습니다. 예:

let myDouble = Double("1.1") ?? 0.0