Bir dizeyi ikiye nasıl dönüştürebilirim ve bunun tersi de geçerlidir?


145

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:


231

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];

13
Bunu yapmak istemezsiniz çünkü farklı yerel ayarlar sayıları farklı şekilde biçimlendirir. Bazıları bin yerine "1000" yazacak, diğerleri "1.000" ve diğerleri "1.000" yazacak - hangisinden - [NSString doubleValue]?
Chris Hanson

9
Çift, sayısal bir veri türüdür - herhangi bir biçimlendirme içermez. [NSString doubleValue] 'u çağırmak 1000'i döndürecektir çünkü bu sadece bir sayıdır.
Andy

12
Ve bir NSString bir sayı içeremez, yalnızca bir sayının temsilini içerir. Bu temsil, yerel ayara göre farklılık gösteren çeşitli formatlardan herhangi birinde olabilir.
Chris Hanson

5
[[NSNumber numberWithInt:myInt] stringValue]
@Barry Wark'ın

1
Ya dize değeri geçerli bir çift dize değilse, 0.0, doubleValue tarafından döndürülür. Bana öyle geliyor ki NSNumberFormatter kullanımını öneren çözüm daha iyi çünkü dizge geçerli bir çift dizgeyi temsil etmiyorsa, o zaman sıfır döndürülür.
Kaydell

70

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 .


2
Ya da yerelleştirilmiş bir tarayıcı kullanabilirsiniz, örneğin [NSScanner localizedScannerWithString:] ile oluşturulmuş bir tarayıcı ve ardından [tarayıcı scanDouble: & aDouble], kullanıcının mevcut yerel ayarına bağlı olarak çift tarar.
dreamlax

32

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.


7

olliej'in yuvarlama yöntemi negatif sayılar için yanlış

  • 2.4 yuvarlanmış 2'dir (olliej'in yöntemi bunu doğru bulur)
  • −2.4 yuvarlanmış −2'dir (olliej'in yöntemi -1 döndürür)

İşte bir alternatif

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

Tabii ki, math.h'den bir yuvarlama işlevi kullanabilirsiniz.


7

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

1
Dizedir ne numberFromString dönüşü yapar değil geçerli bir dize?
Ben Clayton

numberFromString: bir NSNumber nesnesi döndürür. Apple belgelerinde NumberFormatting ve NSNumberFormatter'a bakın . (NSNumber nesnelerinin "sayı değil" veya "hatalı sayı" kodlamasını nasıl kodladığından emin değilim, ancak olası bir NSNull değeri olduğunu görüyorum.)
miker

@BenClayton numberFromString çözümlenemiyorsa 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.
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

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 )


2

Yuvarlama için, muhtemelen math.h'de tanımlanan C işlevlerini kullanmalısınız.

int roundedX = round(x);

Option tuşunu basılı tutun ve roundXcode'a çift ​​tıklayın ve size farklı türleri yuvarlamak için çeşitli işlevler içeren man sayfasını gösterecektir.


1

Bildiğim en kolay yol bu:

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

1

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);

1

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];

1

Bu kullanışlı makroyu kullanmayı bıraktım:

#define STRING(value)               [@(value) stringValue]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.