Bagaimana cara melakukan konversi string di Objective-C?


145

Saya ingin mengubah string menjadi dobel dan setelah melakukan beberapa matematika di atasnya, mengubahnya kembali menjadi string.

Bagaimana saya melakukan ini di Objective-C?

Apakah ada cara untuk membulatkan dobel ke bilangan bulat terdekat juga?


Lebih jauh ke jawaban Chris Hanson, Anda dapat mengetahui lebih lanjut tentang pemformat angka, perilaku mereka, dan format string, dari NSNumberFormatter pada Mac OS X 10.4 dalam Panduan Pemrograman Pemformatan Data Untuk Kakao .
mmalc

Sumber informasi lain yang mungkin berguna bagi Anda adalah artikel ini tentang NSNumberFormatter: iphonesdkarticles.com/2008/11/…
jpm

Saya pikir dokumentasi resmi cukup bagus ...

Jawaban:


231

Anda dapat mengubah NSString menjadi ganda dengan

double myDouble = [myString doubleValue];

Pembulatan ke int terdekat kemudian dapat dilakukan sebagai

int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

Jujur saya tidak yakin apakah ada cara yang lebih efisien untuk mengkonversi kembali menjadi string daripada

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];

13
Anda tidak perlu ingin melakukan ini, karena berbagai format lokal angka berbeda. Beberapa akan menulis "1000" untuk seribu, sementara yang lain akan menulis "1.000" dan yang lain "1.000" - yang Anda dapatkan dari - [NSString doubleValue]?
Chris Hanson

9
Double adalah tipe data numerik - tidak mengandung format apa pun. Memanggil [NSString doubleValue] akan menghasilkan 1000 karena itu hanya angka.
Andy

12
Dan NSString tidak dapat berisi angka, hanya representasi angka. Representasi itu mungkin dalam berbagai format yang berbeda menurut lokal.
Chris Hanson

5
Anda mungkin ingin mengintegrasikan jawaban [[NSNumber numberWithInt:myInt] stringValue]
@Barry

1
Bagaimana jika nilai string bukan string ganda yang valid, maka 0,0 akan dikembalikan oleh doubleValue. Tampaknya bagi saya bahwa solusi yang menyarankan penggunaan NSNumberFormatter lebih baik karena jika string tidak mewakili string ganda yang valid, maka nihil dikembalikan.
Kaydell

70

Untuk benar-benar mengonversi dari string ke angka dengan benar, Anda perlu menggunakan instance yang NSNumberFormatterdikonfigurasikan untuk lokal tempat Anda membaca string.

Lokal yang berbeda akan memformat angka secara berbeda. Sebagai contoh, di beberapa bagian dunia, COMMAdigunakan sebagai pemisah desimal sedangkan yang lain adalah PERIOD- dan ribuan pemisah (saat digunakan) dibalik. Kecuali kalau itu ruang. Atau tidak hadir sama sekali.

Itu benar-benar tergantung pada sumber input. Hal paling aman untuk dilakukan adalah mengonfigurasikan NSNumberFormattercara input Anda diformat dan digunakan -[NSFormatter numberFromString:]untuk mendapatkannya NSNumber. Jika Anda ingin menangani kesalahan konversi, Anda dapat menggunakannya -[NSFormatter getObjectValue:forString:range:error:].


2
Atau Anda dapat menggunakan pemindai yang dilokalkan, misalnya yang dibuat dengan [NSScanner localizedScannerWithString:], dan kemudian [pemindai scanDouble: & aDouble] akan memindai dalam ganda berdasarkan lokal pengguna saat ini.
dreamlax

32

Menambah jawaban olliej, Anda dapat mengkonversi dari int kembali ke string dengan NSNumber's stringValue:

[[NSNumber numberWithInt:myInt] stringValue]

stringValuepada NSNumberinvoke descriptionWithLocale:nil, memberikan Anda representasi string nilai yang terlokalisasi. Saya tidak yakin apakah [NSString stringWithFormat:@"%d",myInt]akan memberi Anda reprsentasi yang dilokalkan dengan benar myInt.


Barry terima kasih. Garis NSNumber ke stringValue yang Anda posting berfungsi untuk saya, sedangkan stringNithtring NSSumber tidak.
tandai

7

Metode pembulatan olliej salah untuk angka negatif

  • 2.4 rounded adalah 2 (metode olliej mendapatkan hak ini)
  • −2.4 bulat adalah is2 (metode olliej mengembalikan -1)

Inilah alternatifnya

  int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

Anda tentu saja dapat menggunakan fungsi pembulatan dari math.h


7

Berikut ini adalah contoh kerja NSNumberFormatter membaca String nomor lokal (xCode 3.2.4, osX 10.6), untuk menghemat waktu yang baru saja saya habiskan untuk bermain-main. Hati-hati: walaupun dapat menangani trailing blanks seperti "8,765.4", ini tidak bisa menangani spasi putih dan ini tidak bisa menangani karakter teks yang tersesat. (String input buruk: "8" dan "8q" dan "8 q".)

NSString *tempStr = @"8,765.4";  
     // localization allows other thousands separators, also.
NSNumberFormatter * myNumFormatter = [[NSNumberFormatter alloc] init];
[myNumFormatter setLocale:[NSLocale currentLocale]]; // happen by default?
[myNumFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
     // next line is very important!
[myNumFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; // crucial

NSNumber *tempNum = [myNumFormatter numberFromString:tempStr];
NSLog(@"string '%@' gives NSNumber '%@' with intValue '%i'", 
    tempStr, tempNum, [tempNum intValue]);
[myNumFormatter release];  // good citizen

1
Apa yang dikembalikan numberFromString jika string tersebut bukan string yang valid?
Ben Clayton

numberFromString: mengembalikan objek NSNumber. Lihat NumberFormatting dan NSNumberFormatter di apple docs. (Saya tidak yakin bagaimana objek NSNumber menyandikan "bukan angka" atau "angka buruk", tapi saya melihat ada kemungkinan nilai NSNull.)
miker

@BenClayton numberFromString mengembalikan nilnilai NSNumber*jika tidak dapat diuraikan. Saya tidak dapat mereproduksi masalah yang Anda miliki dengan memimpin spasi putih dan karakter teks liar, IMO itu berfungsi dengan baik. " 28.5 "mem-parsing sebagai 28,5, dan "gibberish28.5", "28.5gibberish"dan "gibberish28.5gibberish"semua unparseable; " 2 8 . 5. "tidak dapat dipilah tetapi itu tidak biasa.
jrh

3
// Converting String in to Double

double doubleValue = [yourString doubleValue];

// Converting Double in to String
NSString *yourString = [NSString stringWithFormat:@"%.20f", doubleValue];
// .20f takes the value up to 20 position after decimal

// Converting double to int

int intValue = (int) doubleValue;
or
int intValue = [yourString intValue];

3

Untuk konversi dari angka ke string, bagaimana dengan menggunakan sintaks literal baru (XCode> = 4.4), ini sedikit lebih kompak.

int myInt = (int)round( [@"1.6" floatValue] );

NSString* myString = [@(myInt) description];

(Boxes sebagai NSNumber dan dikonversi ke string menggunakan metode deskripsi NSObjects ' )


2

Untuk pembulatan, Anda mungkin harus menggunakan fungsi C yang didefinisikan dalam math.h.

int roundedX = round(x);

Tahan Opsi dan klik dua kali rounddalam Xcode dan itu akan menampilkan halaman manual dengan berbagai fungsi untuk pembulatan berbagai jenis.


1

Ini adalah cara termudah yang saya tahu:

float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;

1

dari contoh ini di sini, Anda dapat melihat konversi dua arah:

NSString *str=@"5678901234567890";

long long verylong;
NSRange range;
range.length = 15;
range.location = 0;

[[NSScanner scannerWithString:[str substringWithRange:range]] scanLongLong:&verylong];

NSLog(@"long long value %lld",verylong);

1

konversi teks yang dimasukkan dalam bidang teks ke integer

double mydouble=[_myTextfield.text doubleValue];

pembulatan ke dobel terdekat

mydouble=(round(mydouble));

pembulatan ke int terdekat (hanya mempertimbangkan nilai positif)

int myint=(int)(mydouble);

mengkonversi dari dobel ke string

myLabel.text=[NSString stringWithFormat:@"%f",mydouble];

atau

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];

mengkonversi dari int ke string

myLabel.text=[NSString stringWithFormat:@"%d",myint];

atau

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];

1

Saya akhirnya menggunakan makro praktis ini:

#define STRING(value)               [@(value) stringValue]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.