Saya mencoba menulis program BMI dalam bahasa cepat. Dan saya mendapat masalah ini: bagaimana cara mengubah sebuah String menjadi Double?
Di Objective-C, saya bisa melakukan ini:
double myDouble = [myString doubleValue];
Tetapi bagaimana saya bisa mencapai ini dalam bahasa Swift?
Jawaban:
Swift 4.2+ String to Double
Anda harus menggunakan inisialisasi tipe baru untuk mengkonversi antara tipe String dan numerik (Double, Float, Int). Ini akan mengembalikan jenis Opsional (Gandakan?) Yang akan memiliki nilai yang benar atau nihil jika String bukan angka.
Catatan: Properti nilai ganda NSString tidak disarankan karena mengembalikan 0 jika nilai tidak dapat dikonversi (yaitu: input pengguna buruk).
Buka bungkus nilai untuk menggunakannya menggunakan if / let
Anda dapat mengonversi angka dan mata uang yang diformat menggunakan
NumberFormatter
kelas.Format mata uang
Baca lebih lanjut di posting blog saya tentang mengkonversi String ke tipe Double (dan mata uang) .
sumber
Swift 2 Perbarui Ada initializers failable baru yang memungkinkan Anda untuk melakukan hal ini dalam cara yang lebih idiomatik dan aman (banyak jawaban telah mencatat, nilai ganda NSString ini sangat tidak aman karena kembali 0 untuk nilai-nilai non nomor. Ini berarti bahwa
doubleValue
dari"foo"
dan"0"
yang sama.)Ini mengembalikan opsional, jadi dalam kasus seperti melewati di
"foo"
manadoubleValue
akan mengembalikan 0, intializer yang tersedia akan kembalinil
. Anda dapat menggunakanguard
,if-let
, ataumap
untuk menanganiOptional<Double>
Posting Asli: Anda tidak perlu menggunakan konstruktor NSString seperti saran yang diterima. Anda bisa menjembataninya seperti ini:
sumber
- [NSString doubleValue]
iniDouble
di cepat menutupi peranDouble?
(Optional<Double>
). Ini berbeda dari fungsi Swift StringtoInt()
yang mengembalikanInt?
dan menyatakan dalam dokumen bahwa "" menerima string yang cocok dengan ekspresi reguler "[- +]? [0-9] +" hanya. ".toInt()
akan lebih baik. Namun, ini lebih merupakan jawaban untuk bagaimana melakukan hal yang persis sama, tetapi di Swift.Double.init?(_ text: String)
inisialisasi failable sekarang tersedia.Untuk perasaan Swift yang lebih sedikit, gunakan
NSFormatter()
menghindari castingNSString
, dan kembalinil
ketika string tidak mengandungDouble
nilai (mis. "Test" tidak akan kembali0.0
).Atau, perpanjang
String
tipe Swift :dan gunakan seperti
toInt()
:Ini mengembalikan opsi
Double?
yang harus dibuka.Baik dengan membuka paksa:
atau dengan pernyataan if let:
Pembaruan: Untuk pelokalan, sangat mudah untuk menerapkan lokal ke NSFormatter sebagai berikut:
Akhirnya, Anda dapat menggunakan
NSNumberFormatterCurrencyStyle
formatter jika Anda bekerja dengan mata uang di mana string berisi simbol mata uang.sumber
Opsi lain di sini adalah mengonversikan ini menjadi
NSString
dan menggunakan itu:sumber
(swiftString as NSString).doubleValue
Berikut adalah metode ekstensi yang memungkinkan Anda cukup memanggil doubleValue () pada string Swift dan mendapatkan kembali ganda (contoh output yang diutamakan)
Inilah metode ekstensi:
Tidak ada pengecekan kesalahan, tetapi Anda bisa menambahkannya jika Anda membutuhkannya.
sumber
Pada Swift 1.1, Anda dapat langsung beralih
String
keconst char *
parameter.Jika Anda tidak suka usang
atof
:Satu peringatan: perilaku konversi berbeda dari
NSString.doubleValue
.atof
danstrtod
terima0x
string hex yang diawali:Jika Anda lebih suka
.doubleValue
perilaku, kami masih dapat menggunakanCFString
bridging:sumber
NSString
.Di Swift 2.0 cara terbaik adalah menghindari berpikir seperti pengembang Objective-C. Jadi Anda tidak harus "mengkonversi String ke Double" tetapi Anda harus "menginisialisasi Double dari String". Apple doc di sini: https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_Double_Structure/index.html#//apple_ref/swift/structctr/Double/s:FSdcFMSdFSSGSqSd_
Ini adalah init opsional sehingga Anda dapat menggunakan operator penggabungan nil (??) untuk menetapkan nilai default. Contoh:
sumber
Double.init?(_ text: String)
menjadi tersedia di Swift 2.0. Anda harus menyebutkan ini. Jawaban lain di sini bukan karena orang berpikir seperti pengembang Objective-C tetapi karena penginisialisasi ini tidak tersedia sebelumnya.Pada SWIFT 3 , Anda dapat menggunakan:
Catatan: - Jika string berisi karakter apa pun selain angka numerik atau grup yang sesuai dengan lokal atau pemisah desimal, penguraian akan gagal. - Setiap karakter pemisah ruang mengarah atau tertinggal dalam string diabaikan. Misalnya, string "5", "5", dan "5" semua menghasilkan angka 5.
Diambil dari dokumentasi: https://developer.apple.com/reference/foundation/numberformatter/1408845-number
sumber
Saya belum melihat jawaban yang saya cari. Saya hanya memposting di sini milik saya jika itu dapat membantu siapa pun. Jawaban ini hanya valid jika Anda tidak memerlukan format tertentu .
Cepat 3
sumber
Coba ini:
CATATAN
Dihapus dalam Beta 5. Ini tidak lagi berfungsi?
sumber
Ini berdasarkan jawaban dari @Ryu
Solusinya sangat bagus selama Anda berada di negara di mana titik digunakan sebagai pemisah. Secara default
NSNumberFormatter
menggunakan perangkat lokal. Oleh karena itu, ini akan gagal di semua negara di mana koma digunakan sebagai pemisah default (termasuk Perancis sebagai @PeterK. Disebutkan) jika nomor menggunakan titik sebagai pemisah (yang biasanya merupakan kasus). Untuk mengatur lokal NSNumberFormatter ini menjadi AS dan karenanya menggunakan titik sebagai pemisah menggantikan garisdengan
Karenanya kode lengkap menjadi
Untuk menggunakan ini, telepon saja
"Your text goes here".toDouble()
Ini akan mengembalikan opsional
Double?
Seperti yang disebutkan @Ryu, Anda dapat memaksa membuka:
atau gunakan
if let
pernyataan:sumber
NumberFormatter().number(from: myString)?.doubleValue
SWIFT 4
sumber
Cepat 4.0
coba ini
sumber
Swift: 4 dan 5
Mungkin ada dua cara untuk melakukan ini:
String -> Int -> Double:
String -> NSString -> Double
Gunakan itu sesuai keinginan Anda sesuai dengan kode yang Anda butuhkan.
sumber
Silakan periksa di taman bermain!
Ngomong-ngomong di Xcode saya
.toDouble () - tidak ada
.doubleValue membuat nilai 0,0 dari string bukan numerik ...
sumber
1.
2.
Semoga ini bisa membantu Anda.
sumber
Seperti yang telah ditunjukkan, cara terbaik untuk mencapai ini adalah dengan casting langsung:
Membangun dari itu, Anda dapat membuat ekstensi Swift String asli apik:
Ini memungkinkan Anda untuk langsung menggunakan:
Yang akan melakukan casting untuk Anda. Jika Apple tidak menambahkan
doubleValue
ke String asli Anda hanya perlu menghapus ekstensi dan sisa kode Anda akan secara otomatis dikompilasi dengan baik!sumber
SWIFT 3
Untuk menghapus, saat ini ada metode default:
public init?(_ text: String)
dariDouble
kelas.Ini dapat digunakan untuk semua kelas.
let c = Double("-1.0")
let f = Double("0x1c.6")
let i = Double("inf")
, dll.sumber
Ekstensi dengan lokal opsional
Cepat 2.2
Cepat 3.1
sumber
Atau Anda bisa melakukannya:
sumber
Anda dapat menggunakan StringEx . Itu meluas
String
dengan konversi string-ke-nomor termasuktoDouble()
.Ini memverifikasi string dan gagal jika tidak dapat dikonversi menjadi dua kali lipat.
Contoh:
sumber
Cepat 4
sumber
Apa yang juga berfungsi:
sumber
Gunakan kode ini di Swift 2.0
let strWithFloat = "78.65" let floatFromString = Double(strWithFloat)
sumber
Menggunakan
Scanner
dalam beberapa kasus adalah cara yang sangat mudah untuk mengekstraksi angka dari string. Dan itu hampir sama kuatnya denganNumberFormatter
ketika memecahkan kode dan menangani berbagai format angka dan lokal. Ini dapat mengekstraksi angka dan mata uang dengan pemisah desimal dan grup yang berbeda.Namun, ada masalah dengan pemisah yang bisa dipahami sebagai pembatas kata.
Tidak ada masalah untuk mendeteksi lokal secara otomatis. Perhatikan bahwa pengelompokanSeparator dalam bahasa Prancis dalam string "Mon salaire est 9 999,99 €" bukan spasi, meskipun itu dapat membuat persis seperti ruang (di sini tidak). Itulah mengapa kode di bawah ini berfungsi dengan baik tanpa
!$0.isWhitespace
karakter yang difilter.sumber
Saya menemukan lebih mudah dibaca untuk menambahkan ekstensi ke String sebagai berikut:
dan kemudian Anda bisa menulis kode Anda:
sumber
masalah saya adalah koma jadi saya menyelesaikannya dengan cara ini:
sumber
sumber
kita bisa menggunakan nilai CDouble yang akan diperoleh oleh myString.doubleValue
sumber