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


242

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

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

double myDouble = [myString doubleValue];

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


1
:이 스위프트이 변경되었습니다, 새로운 더블 () failable 초기화 사용하여 새로운 대답을 참조 stackoverflow.com/a/32850058/276626
폴 솔트

답변:


205

스위프트 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
또 다른 문제는 1,000.00 이외의 다른 로케일에서는 숫자를 지원하지 않는다는 것입니다. 000,00과 같은 다른 형식을 사용하면 끝에 2 개의 소수점이 잘립니다. 적어도 이것이 Objective-C에서 일어나는 일입니다. -Apple 설명서에 따라 :( 로케일을 인식하지 못함) 다음의 편리한 방법은 모두 초기 공백 문자 (공백)를 건너 뛰고 후행 문자는 무시합니다. 로케일을 인식하지 않습니다. NSScanner 또는 NSNumberFormatter는보다 강력하고 로케일을 인식하는 숫자 구문 분석에 사용할 수 있습니다.
mskw

@mskw NumberFormatter를 사용하여 통화를 구문 분석하는 방법에 대한 추가 정보를 추가했습니다. 코드에서 통화 형식 숫자 ($ 1,000.00) 또는 형식 숫자 (1,000)를 모두 구문 분석 할 수 있도록 if / let 구문을 사용하여 변환하려고 여러 포맷터를 묶습니다. 사용자가 숫자를 입력하는 방법을 항상 알지는 못하므로 두 가지를 모두 지원할 수있는 것이 if / let 문 그룹에 이상적입니다.
Paul Solt

276

스위프트 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

5
오 하이 이 접근법의 한 가지 단점은 문자열이 유효한 double이 아닌 경우 실패하지 않는다는 것입니다. 대신 당신은 0.0을 얻을 것입니다. 즉, 결과는 - [NSString doubleValue]Double에 나란히 놓이는으로 기민한에 Double?( Optional<Double>). 이것은 문서에서 "...- 정규식"[-+]? [0-9] + "와만 일치하는 문자열 만 허용합니다." toInt()를 반환 Int?하고 나타내는 Swift String 함수 와 다릅니다 .
데릭 해서웨이

예, 사용하는 .toInt()것이 좋습니다. 그러나 이것은 Swift에서 정확히 똑같은 일을하는 방법에 대한 답변이었습니다.
Jarsen

이 접근 방식은 Foundation과 밀접하게 연결되어 있으며 Apple 이외의 Swift 구현에서는 작동하지 않을 수 있습니다.
Erik Kerber

5
Swift 2.0에는 Double.init?(_ text: String)이제 사용할 수있는 실패 가능한 이니셜 라이저가 있습니다.
mixel

3
이것이 최선의 방법은 아닙니다. 소수점 구분 기호에 따라 실패합니다. '.'로 괜찮을 것입니다. 그러나 ','가 아닙니다. NSNumberFormatter는 현재 지역화에서 사용되는 소수점 구분 기호를 지원합니다.
Julian Król

75

좀 더 스위프트 느낌의 경우을 사용 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문자열에 통화 기호가 포함 된 통화로 작업하는 경우 포맷터에서 사용할 수 있습니다 .


여러 곳에서 변환을 사용하는 앱을 위해 String 클래스를 확장한다는 아이디어가 마음에 듭니다. 그러나 NSString으로 캐스팅하고 .doubleValue를 사용하는 것이 적어도 직접적이고 읽기 쉽고 기억하기 쉽기 때문에 NSNumberFormatter를 호출하는 복잡성의 이점을 보지 못합니다.
clearlight

12
실제로 NSNumberFormatter () 사용의 이점은 문자열에 이중을 구성하지 않는 문자가 포함 된 경우 numberFromString : 메소드가 nil을 리턴한다는 것입니다. NSString에서 doubleValue의 문제점은 상관없이 항상 double (예 : "test"의 경우 0.0)을 리턴한다는 것입니다. 따라서 모든 종류의 문자열을 다루고 있고 NSNumberFormatter를 사용하면 문자열이 추가 문자가 아닌 두 배인지 여부를 테스트하려는 경우 갈 수 있습니다.
dirkgroten

4
이것은 프랑스어에서 실패합니다.
피터 K.

1
이것은 훌륭한 솔루션이지만이 코드 만 사용하면 쉼표가 구분 기호로 사용되는 국가 (@PeterK와 같은 프랑스 포함)에서는 작동하지 않습니다. 나는 해결책으로 의견을 쓰려고했지만 너무 길어서 대신 대답해야했습니다. 여기 요 : 수정 된 솔루션
야곱 R

53

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

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

13
더 좋은 방법이 있었으면 좋겠다. 예를 들어 구문 분석이 실패했는지 어떻게 알 수 있습니까?
Ryan Hoffman 2016 년

2
@RyanHoffman 불행히도 NSString doubleValue 계약은 그 어느 것도 제공하지 않았습니다. 문자열이 오버플로 / 언더 플로에서 숫자 HUGE_VAL 및 -HUGE_VAL의 유효한 표현으로 시작하지 않으면 0.0입니다. 구문 분석이 실패한 이유를 알고 싶다면 더 강력한 방식으로 숫자 / 문자열 변환을 처리하도록 설계된 NSNumberFormatter를 살펴 봐야한다고 생각합니다.
Jarsen

그 답을 찾기가 어려울 수 있으므로 다음과 같습니다.(swiftString as NSString).doubleValue
LearnCocos2D

24

다음은 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
    }
}

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


20

스위프트 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

에 캐스팅하는 대신이 방법을 좋아합니다 NSString.
Sam Soffes

10

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

Double.init?(_ text: String)Swift 2.0에서 사용할 수 있습니다. 이것을 언급해야합니다. 여기에있는 다른 대답은 사람들이 Objective-C 개발자처럼 생각하기 때문이 아니라이 초기자를 초기에 사용할 수 없었기 때문입니다.
mixel

실제로 당신이 옳습니다. 이것은 Swift 2.0에서만 사용할 수 있습니다. 나는 언급 할 것입니다 :) 그러나 다른 언어와 마찬가지로 다른 유형으로 유형을 초기화하고 유형이 다른 유형으로 변환 될 것으로 기 대해서는 안됩니다. 오랜 논쟁이지만 Obj-C 개발자로서 Swift로 코딩 할 때 많은 나쁜 관행을 가지고 있으며 이것들 중 하나입니다 :)
Toom

10

SWIFT 3 , 당신은 사용할 수 있습니다 :

if let myDouble = NumberFormatter().number(from: yourString)?.doubleValue {
   print("My double: \(myDouble)")
}

참고 :-문자열에 숫자 나 로케일에 적합한 그룹 또는 소수 구분 기호 이외의 문자가 포함되어 있으면 구문 분석에 실패합니다. -문자열에서 선행 또는 후행 공백 구분 문자는 무시됩니다. 예를 들어, 문자열“5”,“5”및“5”는 모두 숫자 5를 생성합니다.

설명서에서 가져 왔습니다 : https://developer.apple.com/reference/foundation/numberformatter/1408845-number


10

내가 찾던 답을 보지 못했습니다. 누군가를 도울 수 있도록 여기에 글을 게시하십시오. 이 답변은 특정 형식이 필요하지 않은 경우에만 유효 합니다 .

스위프트 3

extension String {
    var toDouble: Double {
        return Double(self) ?? 0.0
    }
}

9

이 시도:

   var myDouble = myString.bridgeToObjectiveC().doubleValue
   println(myDouble)

노트

베타 5에서 제거되었습니다. 더 이상 작동하지 않습니까?


1
bridgeToObjectiveC ()는 엑스 코드 6 베타에서 제거되었습니다 5. 미스터 스마일의 방법은 내가 순간에 발견 한 가장 빠른 것입니다
faraquet99

7

이것은 @Ryu의 답변을 기반으로합니다.

점이 분리 자로 사용되는 국가에있는 한 그의 솔루션은 훌륭합니다. 기본적으로 NSNumberFormatter장치 로캘이 사용됩니다. 따라서 숫자가 점을 구분 기호로 사용하는 경우 (보통 @PeterK.와 같이 프랑스 포함) 기본 구분 기호로 쉼표가 사용되는 모든 국가에서 이는 실패합니다. 이 NSNumberFormatter의 로캘을 미국으로 설정하고 구분 기호로 점을 사용하여 선을 바꾸려면

return NSNumberFormatter().numberFromString(self)?.doubleValue

let numberFormatter = NSNumberFormatter()
numberFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
return numberFormatter.numberFromString(self)?.doubleValue

따라서 전체 코드는

extension String {
    func toDouble() -> Double? {
        let numberFormatter = NSNumberFormatter()
        numberFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
        return numberFormatter.numberFromString(self)?.doubleValue
    }
}

이것을 사용하려면 전화하십시오. "Your text goes here".toDouble()

이것은 옵션을 반환합니다 Double?

@Ryu가 언급했듯이 강제로 풀 수 있습니다.

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
}

1
이것이 정답입니다. 스위프트 3 버전은 다음과 같습니다 NumberFormatter().number(from: myString)?.doubleValue
nicolas leo

7

스위프트 4

extension String {
    func toDouble() -> Double? {
        let numberFormatter = NumberFormatter()
        numberFormatter.locale = Locale(identifier: "en_US_POSIX")
        return numberFormatter.number(from: self)?.doubleValue
    }
}

6

스위프트 4.0

이 시도

 let str:String = "111.11"
 let tempString = (str as NSString).doubleValue
 print("String:-",tempString)

6

스위프트 : 4와 5

이를 수행하는 두 가지 방법이 있습니다.

  1. 문자열-> Int-> Double :

    let strNumber = "314"
    if let intFromString = Int(strNumber){
        let dobleFromInt = Double(intFromString)
        print(dobleFromInt)
    }
  2. 문자열-> NSString-> 이중

    let strNumber1 = "314"
    let NSstringFromString = NSString(string: strNumber1)
    let doubleFromNSString = NSstringFromString.doubleValue
    print(doubleFromNSString)

코드 필요에 따라 원하는대로 사용하십시오.


첫 번째 방법은 저에게 효과적이지 않지만 두 번째 방법은 꽤 잘 작동합니다.
Saurabh

@Saurabh, 당신의 문자열이 무엇인지 더 자세히 설명해 주시겠습니까?
Abhirajsinh Thakore

5

놀이터에서 확인해주세요!

let sString = "236.86"

var dNumber = NSNumberFormatter().numberFromString(sString)
var nDouble = dNumber!
var eNumber = Double(nDouble) * 3.7

그건 그렇고 내 Xcode에서

.toDouble ()-존재하지 않습니다

.doubleValue 숫자가 아닌 문자열에서 값 0.0을 생성합니다 ...


4

1.

let strswift = "12"
let double = (strswift as NSString).doubleValue

2.

var strswift= "10.6"
var double : Double = NSString(string: strswift).doubleValue 

이 도움이 될 수 있습니다.


4

이미 지적했듯이 이것을 달성하는 가장 좋은 방법은 직접 캐스팅을 사용하는 것입니다.

(myString as NSString).doubleValue

이를 통해 매끄러운 기본 Swift String 확장을 만들 수 있습니다.

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

이를 통해 다음을 직접 사용할 수 있습니다.

myString.doubleValue

어느 쪽이 당신을 위해 캐스팅을 수행합니다. Apple이 doubleValue기본 문자열 에 a 를 추가 하면 확장을 제거하면 나머지 코드가 자동으로 올바르게 컴파일됩니다!


애플의 메소드는 toInt와 같은 .toDouble ... 이상한 생략입니다. 향후 Swift 버전에서 수정 될 수 있습니다. 확장 방법이 가장 좋으며 코드를 깨끗하게 유지합니다.
n13

반환 값은 Double NOT a float이어야합니다.
Leo Dabus

4

스위프트 3

현재 기본 방법이 있습니다.

public init?(_ text: String)Double 클래스입니다.

모든 클래스에 사용할 수 있습니다.

let c = Double("-1.0") let f = Double("0x1c.6") let i = Double("inf")


2

선택적 로케일이있는 확장

스위프트 2.2

extension String {
    func toDouble(locale: NSLocale? = nil) -> Double? {
        let formatter = NSNumberFormatter()
        if let locale = locale {
            formatter.locale = locale
        }
        return formatter.numberFromString(self)?.doubleValue
    }
}

스위프트 3.1

extension String {
    func toDouble(_ locale: Locale) -> Double {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.locale = locale
        formatter.usesGroupingSeparator = true
        if let result = formatter.number(from: self)?.doubleValue {
            return result
        } else {
            return 0
        }
    }
}

1
Swift 3.1 예제를 추가했습니다. "... 로케일의 예를 추가하십시오"는 무슨 뜻입니까? 🙂
imike

1

아니면 할 수 있습니다 :

var myDouble = Double((mySwiftString.text as NSString).doubleValue)

1

StringEx 를 사용할 수 있습니다 . 를 String포함한 문자열-숫자 변환으로 확장 됩니다 toDouble().

extension String {
    func toDouble() -> Double?
}

문자열을 확인하고 double로 변환 할 수 없으면 실패합니다.

예:

import StringEx

let str = "123.45678"
if let num = str.toDouble() {
    println("Number: \(num)")
} else {
    println("Invalid string")
}

1

스위프트 4

extension String {
    func toDouble() -> Double {
        let nsString = self as NSString
        return nsString.doubleValue
    }
}

0

작동하는 것 :

// Init default Double variable
var scanned: Double()

let scanner = NSScanner(string: "String to Scan")
scanner.scanDouble(&scanned)

// scanned has now the scanned value if something was found.

참고 : 'scanDouble'은 iOS 13.0에서 더 이상 사용되지 않습니다.
uplearnedu.com

0

Swift 2.0에서이 코드를 사용하십시오

let strWithFloat = "78.65" let floatFromString = Double(strWithFloat)


0

사용 Scanner어떤 경우에는 문자열에서 숫자를 추출하는 매우 편리한 방법입니다. 그리고 NumberFormatter다른 숫자 형식과 로케일을 디코딩하고 처리 할 때 와 마찬가지로 거의 강력 합니다. 소수점과 그룹 구분 기호가 다른 숫자와 통화를 추출 할 수 있습니다.

import Foundation
// The code below includes manual fix for whitespaces (for French case)
let strings = ["en_US": "My salary is $9,999.99",
               "fr_FR": "Mon salaire est 9 999,99€",
               "de_DE": "Mein Gehalt ist 9999,99€",
               "en_GB": "My salary is £9,999.99" ]
// Just for referce
let allPossibleDecimalSeparators = Set(Locale.availableIdentifiers.compactMap({ Locale(identifier: $0).decimalSeparator}))
print(allPossibleDecimalSeparators)
for str in strings {
    let locale = Locale(identifier: str.key)
    let valStr = str.value.filter{!($0.isWhitespace || $0 == Character(locale.groupingSeparator ?? ""))}
    print("Value String", valStr)

    let sc = Scanner(string: valStr)
    // we could do this more reliably with `filter` as well
    sc.charactersToBeSkipped = CharacterSet.decimalDigits.inverted
    sc.locale = locale

    print("Locale \(locale.identifier) grouping separator: |\(locale.groupingSeparator ?? "")| . Decimal separator: \(locale.decimalSeparator ?? "")")
    while !(sc.isAtEnd) {
        if let val = sc.scanDouble() {
            print(val)
        }

    }
}

그러나 단어 구분 기호로 생각할 수있는 구분 기호에는 문제가 있습니다.

// This doesn't work. `Scanner` just ignores grouping separators because scanner tends to seek for multiple values
// It just refuses to ignore spaces or commas for example.
let strings = ["en_US": "$9,999.99", "fr_FR": "9999,99€", "de_DE": "9999,99€", "en_GB": "£9,999.99" ]
for str in strings {
    let locale = Locale(identifier: str.key)
    let sc = Scanner(string: str.value)
    sc.charactersToBeSkipped = CharacterSet.decimalDigits.inverted.union(CharacterSet(charactersIn: locale.groupingSeparator ?? ""))
    sc.locale = locale
    print("Locale \(locale.identifier) grouping separator: \(locale.groupingSeparator ?? "") . Decimal separator: \(locale.decimalSeparator ?? "")")
    while !(sc.isAtEnd) {
        if let val = sc.scanDouble() {
            print(val)
        }

    }
}
//     sc.scanDouble(representation: Scanner.NumberRepresentation) could help if there were .currency case

로케일을 자동 감지하는 데 문제가 없습니다. 문자열 "Mon salaire est 9 999,99 €"의 프랑스어 로케일에서 groupingSeparator는 공백이 아니지만 정확하게 공백으로 렌더링 될 수 있습니다 (여기서는 그렇지 않음). 따라서 아래 코드가 !$0.isWhitespace문자를 필터링 하지 않고 잘 작동합니다 .

let stringsArr = ["My salary is $9,999.99",
                  "Mon salaire est 9 999,99€",
                  "Mein Gehalt ist 9.999,99€",
                  "My salary is £9,999.99" ]

let tagger = NSLinguisticTagger(tagSchemes: [.language], options: Int(NSLinguisticTagger.Options.init().rawValue))
for str in stringsArr {
    tagger.string = str
    let locale = Locale(identifier: tagger.dominantLanguage ?? "en")
    let valStr = str.filter{!($0 == Character(locale.groupingSeparator ?? ""))}
    print("Value String", valStr)

    let sc = Scanner(string: valStr)
    // we could do this more reliably with `filter` as well
    sc.charactersToBeSkipped = CharacterSet.decimalDigits.inverted
    sc.locale = locale

    print("Locale \(locale.identifier) grouping separator: |\(locale.groupingSeparator ?? "")| . Decimal separator: \(locale.decimalSeparator ?? "")")
    while !(sc.isAtEnd) {
        if let val = sc.scanDouble() {
            print(val)
        }

    }
}
// Also will fail if groupingSeparator == decimalSeparator (but don't think it's possible)

-1

다음과 같이 String에 확장을 추가하는 것이 더 읽기 쉽습니다.

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

그런 다음 코드를 작성할 수 있습니다.

myDouble = myString.doubleValue

-1

내 문제는 쉼표 였으므로이 방법으로 해결했습니다.

extension String {
    var doubleValue: Double {
        return Double((self.replacingOccurrences(of: ",", with: ".") as NSString).doubleValue)
    }
}


-6

myString.doubleValue로 얻을 수있는 CDouble 값을 사용할 수 있습니다


오류 : 'String'에 'doubleValue'라는 멤버가 없습니다.
Matthew Knippen

우리가 CDouble 값 사용할 수 있도록 @Matthew 예 "double 값"이라는 어떤 멤버가 없다
ANIL.MUNDURU

1
en.wikipedia.org/wiki/… 복잡한 숫자를 참조하고 Swift 참조 문서를 읽으십시오. CDouble가 없습니다 ... Swift 또는 다른 언어에 대해 이야기하고 있습니까? 그리고 나는 확장이없는 신속한 것을 의미합니까?
Adrian Sluyters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.