Swift - String'i Double'e dönüştürme


242

Hızlı bir dilde BMI programı yazmaya çalışıyorum. Ve ben bu sorunu var: bir dize bir Double dönüştürmek nasıl?

Objective-C'de şöyle yapabilirim:

double myDouble = [myString doubleValue];

Ama bunu Swift dilinde nasıl başarabilirim?


1
Bu Swift 2'de değişti, yeni Double () failable başlatıcıyı kullanarak yeni cevaba bakınız: stackoverflow.com/a/32850058/276626
Paul Solt

Yanıtlar:


205

Swift 4.2+ Dize İkili

Dize ve sayısal türler (Double, Float, Int) arasında dönüştürme yapmak için yeni tür başlatıcıları kullanmalısınız. Dize bir sayı değilse, doğru değere veya nil değerine sahip bir İsteğe bağlı tür (Double?) Döndürür.

Not: Değer dönüştürülemiyorsa 0 döndürdüğü için NSString doubleValue özelliği önerilmez (örn: hatalı kullanıcı girişi).

let lessPrecisePI = Float("3.14")

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

İf / let kullanarak değerleri kullanmak için paketini açın

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

NumberFormatterSınıfı kullanarak biçimlendirilmiş sayıları ve para birimini dönüştürebilirsiniz .

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

Para birimi biçimleri

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")

Dize'i Çift türe (ve para birimine) dönüştürme hakkında blog yayınımda daha fazla bilgi edinin .


2
başka bir sorun, 1.000.00 dışındaki farklı yerel ayarlardaki sayıları desteklememesidir, 1000,00 gibi başka formatlar kullanırsanız sonunda 2 ondalık sayı kesilir. En azından Objective-C için olan bu. - Apple belgelerine göre: (Yerel ayarlara duyarlı değildirler) Aşağıdaki kolaylık yöntemlerinin tümü ilk boşluk karakterlerini (whitespaceSet) atlar ve sondaki karakterleri yok sayar. Yerele duyarlı değillerdir. NSScanner veya NSNumberFormatter, sayıların daha güçlü ve yerel olarak farkında ayrıştırılması için kullanılabilir.
mskw

@ mskw Para birimi ayrıştırmak için NumberFormatter'ı kullanma hakkında ek ayrıntılar ekledim. Kodumda, hem biçimlendirilmiş sayıları ($ 1,000.00) hem de biçimlendirilmiş sayıları (1.000) ayrıştırabilmem için if / let sözdizimini kullanarak dönüştürmek için birden çok biçimlendirici girişimi birlikte dizeceğim. Kullanıcının sayıları nasıl gireceğini her zaman bilmezsiniz, bu nedenle her ikisini de destekleyebilmek bir if / let ifadeleri grubuyla idealdir.
Paul Solt

276

Swift 2 Güncelleme Birçok cevaplar belirttiği gibi olmayan sayı değerleri için 0 verir, çünkü NSString çifte değeri çok güvenli değildir (daha deyimsel ve güvenli bir şekilde bunu yapmak için izin yeni failable ilklendiriciler Bu araçlar. Olduklarını doubleValuearasında "foo"ve "0"vardır aynısı.)

let myDouble = Double(myString)

Bu isteğe bağlı bir değer döndürür, bu nedenle 0 döndürdüğü "foo"yerlerden geçmek gibi durumlarda doubleValue, faililable intializer geri döner nil. Bir kullanabilir guard, if-letya da mapişlemek içinOptional<Double>

Orijinal Gönderi: NSString yapıcısını kabul edilen cevap önerileri gibi kullanmanıza gerek yoktur. Basitçe şu şekilde köprü yapabilirsiniz:

(swiftString as NSString).doubleValue

5
ohai, Jarsen. Bu yaklaşımın bir dezavantajı, dize geçerli bir çift değilse başarısız olmayacağıdır. Bunun yerine sadece 0.0 alırsınız. Kendisine, bir sonucu - [NSString doubleValue]olduğu Doubletam tersine, ani olarak Double?( Optional<Double>). Bu, dokümanlarda toInt()döndürülen Int?ve "... -" [- +]? [0-9] + "normal ifadesiyle eşleşen dizeleri kabul ettiğini belirten Swift String işlevinden farklıdır .
Derrick Hathaway

Evet, kullanmak .toInt()daha iyi olurdu. Ancak, bu tam olarak aynı şeyi nasıl yapacağına, ancak Swift'te bir cevaptı.
Jarsen

Bu yaklaşım sizi sıkı bir şekilde Vakfa bağlar ve muhtemelen Swift'in Apple dışı uygulamaları üzerinde çalışmaz.
Erik Kerber

5
Swift 2.0'da Double.init?(_ text: String)artık kullanılabilir bir başlatıcı var.
mixel

3
Bu en iyi yaklaşım değil. Ondalık ayırıcıya bağlı olarak başarısız olur. '.' İle iyi olacak. ama ',' ile değil. NSNumberFormatter, geçerli yerelleştirmede kullanılan ondalık ayırıcıyı destekleyecektir.
Julian Król

75

Biraz daha fazla Swift hissi için, kullanmak , dizeye bir değer içermediğinde (örneğin "test" geri dönmeyecektir ) , NSFormatter()yayınlamayı önler NSStringve geri döner .nilDouble0.0

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

Alternatif olarak, Swift'in Stringtürünü genişletmek :

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

ve şöyle kullanın toInt():

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

Bu isteğe bağlı döndürür Double? .

Zorla açılmayla:

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

veya if let ifadesiyle:

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

Güncelleme: Yerelleştirme için NSFormatter'a aşağıdaki gibi yerel ayarları uygulamak çok kolaydır:

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

Son olarak, NSNumberFormatterCurrencyStyledizenin para birimi sembolünü içerdiği para birimleriyle çalışıyorsanız biçimlendiriciyi kullanabilirsiniz .


Dönüşüm birden fazla yerde kullanacak uygulamalar için String sınıfını genişletme fikrini seviyorum. Ama NSNumberFormatter'ı çağırmanın karmaşıklığının faydasını görmüyorum, çünkü NSString'e ve .doubleValue'ya yayın yapmak en azından doğrudan ve okunması ve hatırlanması daha kolay görünüyor.
clearlight

12
Aslında NSNumberFormatter () kullanmanın avantajı, string çift oluşturmayan karakterler içeriyorsa numberFromString: yönteminin nil döndürmesidir. NSString'de doubleValue ile ilgili sorun, ne olursa olsun her zaman bir double (örneğin "test" için 0.0) döndürmesidir. Bu nedenle, her türlü dizeyle uğraşıyorsanız ve dizenin sadece bir çift olup olmadığını test etmek istiyorsanız, NSNumberFormatter'ı kullanmak için ek karakter yoktur.
dirkgroten

4
Bu Fransızcada başarısız oluyor.
Peter K.

1
Bu harika bir çözümdür, ancak yalnızca bu kodu kullanarak virgüllerin ayırıcı olarak kullanıldığı ülkelerde (@PeterK olarak belirtilen Fransa dahil) çalışmaz. Çözümle bir yorum yazmayı denedim, ama çok uzun sürdü, bunun yerine bir cevap vermek zorunda kaldım. İşte
Jacob R

53

Burada başka bir seçenek bunu bir dönüştürmek NSStringve kullanmaktır:

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

13
Keşke bunu yapmanın daha güzel bir yolu olsaydı. Ayrıştırma işleminin başarısız olup olmadığını nasıl anlayabilirim?
Ryan Hoffman

2
@RyanHoffman Maalesef NSString doubleValue sözleşmesi hiçbir zaman bunu sağlamadı. Dize, bir taşma / taşma durumunda HUGE_VAL ve -HUGE_VAL bir sayının geçerli bir gösterimi ile başlamazsa, elde edeceğiniz değer 0.0'dır. Ayrıştırma işleminin neden başarısız olduğunu bilmek istiyorsanız, sayı / dize dönüşümünü daha sağlam bir şekilde işlemek için tasarlanmış olan NSNumberFormatter'a bakmanız gerektiğine inanıyorum.
Jarsen

Bu cevabı bulmak zor olabileceğinden, işte burada:(swiftString as NSString).doubleValue
LearnCocos2D

24

İşte bir Swift dizesinde doubleValue () yöntemini çağırmanıza ve bir çift geri almanıza olanak tanıyan bir uzantı yöntemi (örnek çıktı önce gelir)

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

Uzantı yöntemi şöyledir:

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

Hata kontrolü yok, ancak ihtiyacınız varsa ekleyebilirsiniz.


20

Swift 1.1 itibariyle, doğrudan geçebilir Stringiçin const char *parametre.

import Foundation

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

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

Kullanımdan kaldırılmayı sevmiyorsanız atof:

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

Bir uyarı: dönüşüm davranışı, NSString.doubleValue .

atofve ön ekli onaltılık dizeyi strtodkabul edin 0x:

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

.doubleValueDavranışı tercih ederseniz , CFStringköprülemeyi kullanmaya devam edebiliriz :

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

Ben döküm yapmak yerine bu yaklaşımın hayranıyım NSString.
Sam Soffes

10

Swift 2.0'da en iyi yol bir Objective-C geliştiricisi gibi düşünmekten kaçınmaktır. Bu nedenle, "bir String'i bir Double'e dönüştürmemelisiniz" ancak "bir String'den bir Double başlatmalısınız". Apple dokümanı buraya: https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_Double_Structure/index.html#//apple_ref/swift/structctr/Double/s:FSdcFMSdFSSGSqSd_

Varsayılan bir değer ayarlamak için nil birleştirme operatörünü (??) kullanabilmeniz için isteğe bağlı bir başlangıçtır. Misal:

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

Double.init?(_ text: String)Swift 2.0'da kullanıma sunuluyor. Bundan bahsetmelisin. Buradaki diğer cevaplar, insanların Objective-C geliştiricileri gibi düşündükleri için değil, bu başlatıcıyı daha önce mevcut olmadığı için.
mixel

Gerçekten haklısın. Bu sadece Swift 2.0'da mevcut, bundan bahsedeceğim :) Ama diğer dillerde olduğu gibi bir türü başka biriyle başlatırsınız ve bir türün diğerine dönüşmesini beklememelisiniz. Uzun tartışmalar ama bir Obj-C geliştiricisi olarak Swift ile kodlama yaparken birçok kötü uygulamam var ve bunlardan biri :)
Toom

10

On SWIFT 3 , şunları kullanabilirsiniz:

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

Not: - Bir dize sayısal rakamlar veya yerel ayara uygun grup veya ondalık ayırıcılar dışında herhangi bir karakter içeriyorsa, ayrıştırma başarısız olur. - Bir dizedeki ön veya arka boşluk ayırıcı karakterleri yok sayılır. Örneğin, “5”, “5” ve “5” dizelerinin tümü 5 sayısını üretir.

Belgelerden alınmıştır: https://developer.apple.com/reference/foundation/numberformatter/1408845-number


10

Aradığım cevabı görmedim. Ben sadece kimseye yardımcı olması durumunda benim madeni sonrası. Bu cevap yalnızca belirli bir formata ihtiyacınız yoksa geçerlidir .

Hızlı 3

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

9

Bunu dene:

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

NOT

Beta 5'te kaldırıldı. Bu artık çalışmıyor mu?


1
bridgeToObjectiveC () Xcode 6 Beta 5'te kaldırıldı. Mr Smiley'in yöntemi şu anda bulduğum en hızlı yöntemdir
faraquet99

7

@Ryu'nun cevabı üzerine inşa ediliyor

Noktaların ayırıcılar olarak kullanıldığı bir ülkede olduğunuz sürece çözümü harika. Varsayılan NSNumberFormatterolarak aygıtların yerel ayarlarını kullanır. Bu nedenle, sayı ayırıcılar olarak noktalar kullanırsa (normalde durum budur), varsayılan ayırıcı olarak virgül kullanılan tüm ülkelerde (@PeterK olarak belirtilen. Dahil) başarısız olur. Bu NSNumberFormatter öğesinin yerel ayarını ABD olarak ayarlamak ve bu nedenle ayırıcı olarak satırları kullanmak için noktaları kullanın

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

ile

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

Böylece tam kod

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

Bunu kullanmak için "Your text goes here".toDouble()

Bu, isteğe bağlı olarak Double?

@Ryu'nun belirttiği gibi, açılmayı zorlayabilirsiniz:

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

veya bir if letifade kullanın :

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

1
Bu doğru cevap. Swift 3 sürümü olacak NumberFormatter().number(from: myString)?.doubleValue
nicolas leo

7

SWIFT 4

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

6

Swift 4.0

bunu dene

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

6

Hızlı: 4 ve 5

Bunu yapmanın iki yolu vardır:

  1. Dize -> Int -> Çift:

    let strNumber = "314"
    if let intFromString = Int(strNumber){
        let dobleFromInt = Double(intFromString)
        print(dobleFromInt)
    }
  2. String -> NSString -> Çift

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

Kodu ihtiyacınıza göre istediğiniz şekilde kullanın.


İlk yöntem benim için çalışmıyor, ancak ikincisi oldukça iyi çalışıyor.
Saurabh

@Saurabh, Lütfen ipin ne olduğunu daha ayrıntılı olarak açıklayabilir misin?
Abhirajsinh Thakore

5

Lütfen oyun alanında kontrol edin!

let sString = "236.86"

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

Bu arada Xcode'umda

.toDouble () - mevcut değil

.doubleValue sayısal olmayan dizelerden 0.0 değeri oluştur ...


4

1.

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

2.

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

Senin için bu yardım olabilir.


4

Daha önce de belirtildiği gibi, bunu başarmanın en iyi yolu doğrudan dökümdür:

(myString as NSString).doubleValue

Bundan yola çıkarak, kaygan bir yerel Swift String uzantısı yapabilirsiniz:

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

Bu doğrudan kullanmanıza izin verir:

myString.doubleValue

Hangi döküm sizin için yapacak. Apple doubleValueyerel String'e bir eklerse, sadece uzantıyı kaldırmanız gerekir ve kodunuzun geri kalanı otomatik olarak iyi derlenir!


Apple'ın yöntemi .toDouble ... olarak adlandırılır. Garip bir ihmal. Gelecekteki Swift versiyonunda düzeltilmesi muhtemeldir. Ben en iyi uzantısı yöntemi gibi, kodu temiz tutar.
n13

Dönüş değeri bir çift değil bir
kayan nokta

4

SWIFT 3

Temizlemek için bugünlerde varsayılan bir yöntem var:

public init?(_ text: String)bir Doublesınıfa.

Tüm sınıflar için kullanılabilir.

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


2

İsteğe bağlı yerel ayarlı uzantı

Hızlı 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
    }
}

Hızlı 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 örneğini ekledim. Ne demek istiyorsun "... ve yerele örnek"? 🙂
imike

1

Veya şunları yapabilirsiniz:

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

1

StringEx kullanabilirsiniz . StringDize-sayı dönüşümleri dahil olmak üzere uzanır toDouble().

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

Dizeyi doğrular ve çifte dönüştürülemezse başarısız olur.

Misal:

import StringEx

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

1

Hızlı 4

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

0

Ayrıca ne çalışır:

// 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.

NOT: 'scanDouble' iOS
13.0'da

0

Swift 2.0'da bu kodu kullanın

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


0

Kullanılması Scannerbazı durumlarda bir dize numaraları çıkarma çok uygun bir yoldur. Ve neredeyse NumberFormatterfarklı sayı biçimleri ve yerel ayarları çözmek ve uğraşmak kadar güçlüdür . Farklı ondalık ve grup ayırıcıları ile sayıları ve para birimlerini ayıklayabilir.

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)
        }

    }
}

Ancak, sözcük ayırıcıları olarak düşünülebilen ayırıcılarla ilgili sorunlar vardır.

// 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

Yerel ayarı otomatik olarak algılamakta sorun yoktur. "Mon salaire est 9 999,99 €" dizesinde Fransızca yerel ayarında groupingSeparator bir boşluk değildir, ancak tam olarak boşluk olarak işlenebilir (burada değil). Bu nedenle, aşağıdaki kod, !$0.isWhitespacekarakterler filtrelenmeden iyi çalışır .

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

Aşağıdaki gibi String bir uzantı eklemek için daha okunabilir buluyorum:

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

ve sonra kodunuzu yazabilirsiniz:

myDouble = myString.doubleValue

-1

benim sorun virgül oldu bu yüzden bunu bu şekilde çözmek:

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

-3
var stringValue = "55"

var convertToDouble = Double((stringValue as NSString).doubleValue)

-6

myString.doubleValue tarafından elde edilecek CDouble değerini kullanabiliriz


Hata: 'String'in' doubleValue 'adlı bir üyesi yok
Matthew Knippen

@Matthew Evet "double value" adlı bir üye yok, bu yüzden
CDouble

1
tr.wikipedia.org/wiki/… Oradaki karmaşık sayılara bakın ve Swift referans belgelerini okuyun .. CDouble yok ... Swift veya başka bir dilden mi bahsediyorsunuz? Yani uzantılar olmadan hızlı mı?
Adrian Sluyters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.