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 NSNumberFormatter
iç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 COMMA
ondalı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]
stringValue
on bir NSNumber
invokes 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
nil
değ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];