Saya memiliki NSString (nomor telepon) dengan beberapa tanda kurung dan tanda hubung karena beberapa nomor telepon diformat. Bagaimana saya menghapus semua karakter kecuali angka dari string?
objective-c
nsstring
Ben Harris
sumber
sumber
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]
NSString *pureNumbers = [pureNumbers stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet] invertedSet]
tidak bekerja?[NSCharacterSet decimalDigitCharacterSet]
dengan yang lain yang hanya berisi angka dan huruf. Anda dapat membangunnya dengan membuat aNSMutableCharaterSet
dan meneruskan adecimalDigitCharacterSet
,uppercaseLetterCharacterSet
danlowercaseLetterCharacterSet
keformUnionWithCharacterSet:
. Catatan yangletterCharacterSet
menyertakan tanda juga, maka penggunaan versi huruf kecil dan besar.Tidak perlu menggunakan pustaka ekspresi reguler seperti jawaban yang disarankan - kelas yang Anda cari dipanggil
NSScanner
. Ini digunakan sebagai berikut:EDIT: Saya telah memperbarui kode karena yang asli dihapus dari atas kepala saya dan saya pikir itu akan cukup untuk mengarahkan orang ke arah yang benar. Tampaknya orang-orang mengejar kode mereka hanya dapat menyalin-menempel langsung ke aplikasi mereka.
Saya juga setuju bahwa solusi Michael Pelz-Sherman lebih tepat daripada menggunakan
NSScanner
, jadi Anda mungkin ingin melihatnya.sumber
Jawaban yang diterima terlalu banyak untuk apa yang diminta. Ini jauh lebih sederhana:
sumber
Ini bagus, tetapi kodenya tidak berfungsi untuk saya di iPhone 3.0 SDK.
Jika saya mendefinisikan strippedString seperti yang Anda tunjukkan di sini, saya mendapatkan
BAD ACCESS error
ketika mencoba mencetaknya setelahscanCharactersFromSet:intoString
panggilan.Jika saya melakukannya seperti itu:
Saya berakhir dengan string kosong, tetapi kode tidak macet.
Saya harus menggunakan C lama yang baik sebagai gantinya:
sumber
Meskipun ini adalah pertanyaan lama dengan jawaban yang berfungsi, saya kehilangan dukungan format internasional . Berdasarkan solusi simonobo, set karakter yang diubah mencakup tanda tambah "+". Nomor telepon internasional juga didukung oleh amandemen ini.
Ekspresi Swift adalah
Yang menghasilkan +12345671000 sebagai format nomor telepon internasional umum.
sumber
Ini adalah versi Swift dari ini.
sumber
Versi cepat dari jawaban paling populer:
Sunting: Sintaks untuk Swift 2
Sunting: Sintaks untuk Swift 3
sumber
Terima kasih untuk contohnya. Itu hanya memiliki satu hal yang hilang penambahan scanLocation jika salah satu karakter dalam originalString tidak ditemukan di dalam objek nomor CharacterSet. Saya telah menambahkan pernyataan lain {} untuk memperbaikinya.
sumber
Hanya menerima nomor ponsel
sumber
Mungkin perlu dicatat bahwa jawaban yang diterima
componentsSeparatedByCharactersInSet:
dancomponentsJoinedByString:
berbasis bukan solusi yang efisien memori. Ini mengalokasikan memori untuk set karakter, untuk array dan untuk string baru. Bahkan jika ini hanya alokasi sementara, memproses banyak string dengan cara ini dapat dengan cepat mengisi memori.Sebuah pendekatan yang lebih ramah memori adalah untuk beroperasi pada salinan string yang dapat berubah di tempatnya. Dalam kategori di atas NSString:
Profil kedua pendekatan telah menunjukkan ini menggunakan sekitar 2/3 lebih sedikit memori.
sumber
Anda dapat menggunakan ekspresi reguler pada string yang dapat diubah:
sumber
Membangun solusi teratas sebagai kategori untuk membantu masalah yang lebih luas:
Antarmuka:
Implemenasi:
Pemakaian:
sumber
Cepat 3
sumber
cepat 4.1
sumber
Um Jawaban pertama tampaknya sama sekali salah bagi saya. NSScanner benar-benar dimaksudkan untuk parsing. Tidak seperti regex, ini membuat Anda mengurai string satu potongan kecil sekaligus. Anda menginisialisasi dengan string, dan mempertahankan indeks seberapa jauh sepanjang string itu didapat; Indeks itu selalu menjadi titik rujukannya, dan perintah apa pun yang Anda berikan relatif terhadap titik itu. Anda mengatakannya, "ok, beri saya potongan karakter berikutnya dalam set ini" atau "beri saya bilangan bulat yang Anda temukan dalam string", dan mereka mulai pada indeks saat ini, dan bergerak maju sampai mereka menemukan sesuatu yang tidak pertandingan. Jika karakter pertama sudah tidak cocok, maka metode mengembalikan NO, dan indeks tidak bertambah.
Kode dalam contoh pertama adalah pemindaian "(123) 456-7890" untuk karakter desimal, yang sudah gagal dari karakter pertama, sehingga panggilan untuk memindaiCharactersFromSet: keString: membiarkan strippedString yang dilewati saja, dan mengembalikan TIDAK; Kode benar-benar mengabaikan memeriksa nilai kembali, meninggalkan strippedString tidak ditetapkan. Bahkan jika karakter pertama adalah digit, kode itu akan gagal, karena hanya akan mengembalikan digit yang ditemukannya hingga tanda hubung pertama atau paren atau apa pun.
Jika Anda benar-benar ingin menggunakan NSScanner, Anda dapat memasukkan sesuatu seperti itu dalam satu lingkaran, dan terus memeriksa nilai pengembalian NO, dan jika Anda mendapatkannya Anda dapat menambahkan scanLocation dan memindai lagi; dan Anda juga harus memeriksa isAtEnd, dan yada yada yada. Singkatnya, alat yang salah untuk pekerjaan itu. Solusi Michael lebih baik.
sumber
Untuk mereka yang mencari ekstraksi telepon, Anda dapat mengekstrak nomor telepon dari teks menggunakan NSDataDetector, misalnya:
`
sumber
Saya membuat kategori pada NSString untuk menyederhanakan operasi umum ini.
NSString + AllowCharactersInSet.h
NSString + AllowCharactersInSet.m
sumber
Saya pikir cara terbaik saat ini adalah:
sumber
Jika Anda hanya ingin mengambil angka dari string, Anda tentu bisa menggunakan ekspresi reguler untuk menguraikannya. Untuk melakukan regex di Objective-C, periksa RegexKit .Sunting: Seperti yang ditunjukkan Nathan, menggunakan NSScanner adalah cara yang lebih sederhana untuk mem-parsing semua angka dari sebuah string. Saya benar-benar tidak menyadari pilihan itu, jadi dia menyarankan untuk menyarankannya. (Saya bahkan tidak suka menggunakan regex sendiri, jadi saya lebih suka pendekatan yang tidak memerlukannya.)Jika Anda ingin memformat nomor telepon untuk tampilan, ada baiknya melihat NSNumberFormatter . Saya sarankan Anda membaca pertanyaan SO terkait ini untuk tips tentang melakukannya. Ingat bahwa nomor telepon diformat berbeda tergantung pada lokasi dan / atau lokal.
sumber
Cepat 5
sumber
Berdasarkan jawaban Jon Vogel di sini itu adalah sebagai ekstensi Swift String bersama dengan beberapa tes dasar.
Dan beberapa tes membuktikan setidaknya fungsi dasar:
Ini menjawab pertanyaan OP tetapi bisa dengan mudah dimodifikasi untuk meninggalkan karakter terkait nomor telepon seperti ",; * # +"
sumber
];
Tetap sederhana!
sumber