Bir dizgeyi ikiliye dönüştürmek ve üzerinde biraz matematik yaptıktan sonra onu tekrar dizeye dönüştürmek istiyorum.
Bunu Objective-C'de nasıl yaparım?
Çiftleri en yakın tam sayıya yuvarlamanın bir yolu var mı?
Yanıtlar:
NSString'i double'a dönüştürebilirsiniz.
double myDouble = [myString doubleValue];
En yakın int'e yuvarlama daha sonra şu şekilde yapılabilir:
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
Dürüst olmak gerekirse, bir dizeye geri dönüştürmenin,
NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
[[NSNumber numberWithInt:myInt] stringValue]
Bir dizeden doğru şekilde bir sayıya dönüştürmek NSNumberFormatteriçin, dizeyi okuduğunuz yerel ayar için yapılandırılmış bir örnek kullanmanız gerekir .
Farklı yerel ayarlar sayıları farklı biçimlendirir. Örneğin, dünyanın bazı bölgelerinde COMMAondalık ayırıcı olarak kullanılırken bazılarında bu PERIOD- ve binlik ayırıcı (kullanıldığında) tersine çevrilir. Bir boşluk olduğu zamanlar hariç. Ya da hiç mevcut değil.
Bu gerçekten girdinin kaynağına bağlıdır. Yapılacak en güvenli şey NSNumberFormatter, girişinizin biçimlendirilme şekli için bir yapılandırmak ve -[NSFormatter numberFromString:]ondan bir tane almak için kullanmaktır NSNumber. Dönüştürme hatalarını işlemek istiyorsanız, -[NSFormatter getObjectValue:forString:range:error:]bunun yerine kullanabilirsiniz .
Olliej'in cevabına ek olarak, bir int dizgesini NSNumber's ile dizgeye dönüştürebilirsiniz stringValue:
[[NSNumber numberWithInt:myInt] stringValue]
stringValueon bir NSNumberinvokes descriptionWithLocale:nil, size değerin yerelleştirilmiş bir dize temsilini verir. Size [NSString stringWithFormat:@"%d",myInt]uygun bir şekilde yerelleştirilmiş bir temsil vereceğinden emin değilim myInt.
olliej'in yuvarlama yöntemi negatif sayılar için yanlış
İşte bir alternatif
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
Tabii ki, math.h'den bir yuvarlama işlevi kullanabilirsiniz.
Burada NSNumberFormatter'ın yerelleştirilmiş sayı String'i (xCode 3.2.4, osX 10.6) okuyan bir çalışma örneği, diğerlerine biraz önce uğraşarak geçirdiğim saatleri kurtarmak için. Dikkat: "8,765,4" gibi sondaki boşlukları işleyebilirken, bu öndeki beyaz boşluğu işleyemez ve bu, başıboş metin karakterlerini işleyemez. (Hatalı giriş dizeleri: "8" ve "8q" ve "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
nildeğerli bir döndürür NSNumber*. Önde gelen beyaz boşluk ve başıboş metin karakterleriyle yaşadığınız sorunu yeniden oluşturamıyorum, IMO düzgün çalışıyor. " 28.5 "28.5 ve "gibberish28.5", olarak ayrıştırılır "28.5gibberish"ve "gibberish28.5gibberish"bunların tümü benzersizdir; " 2 8 . 5. "ayrıştırılamaz ama bu sıra dışı değil.
// 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];
Bir sayıdan dizeye dönüştürme için, yeni değişmez değerler sözdizimini (XCode> = 4.4) kullanmaya ne dersiniz, biraz daha kompakt.
int myInt = (int)round( [@"1.6" floatValue] );
NSString* myString = [@(myInt) description];
(Bunu bir NSNumber olarak kutulara alır ve NSObjects'in açıklama yöntemini kullanarak bir dizeye dönüştürür )
Bildiğim en kolay yol bu:
float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
buradaki örnekten, dönüşümleri iki şekilde de görebilirsiniz:
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);
metin alanına girilen metni tam sayıya dönüştür
double mydouble=[_myTextfield.text doubleValue];
en yakın ikiye yuvarlama
mydouble=(round(mydouble));
en yakın int'e yuvarlama (yalnızca pozitif değerler dikkate alınarak)
int myint=(int)(mydouble);
ikiliden dizgeye dönüştürme
myLabel.text=[NSString stringWithFormat:@"%f",mydouble];
veya
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
int'den dizeye dönüştürme
myLabel.text=[NSString stringWithFormat:@"%d",myint];
veya
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];