Jak wykonać konwersję ciągów w Objective-C?

145

Chcę zamienić ciąg na podwójny i po wykonaniu kilku obliczeń, przekonwertować go z powrotem na ciąg.

Jak to zrobić w Objective-C?

Czy istnieje również sposób na zaokrąglenie podwójnej do najbliższej liczby całkowitej?

rksprst
źródło
W nawiązaniu do odpowiedzi Chrisa Hansona, możesz dowiedzieć się więcej o elementach formatujących liczby, ich zachowaniu i ciągach formatujących z NSNumberFormatter w systemie Mac OS X 10.4 w Przewodniku programowania formatowania danych dla kakao .
mmalc
Innym źródłem informacji, które mogą Ci się przydać, jest ten artykuł o NSNumberFormatter: iphonesdkarticles.com/2008/11/...
jpm
Myślę, że oficjalna dokumentacja jest całkiem dobra ...

Odpowiedzi:

231

Możesz przekonwertować NSString na podwójne za pomocą

double myDouble = [myString doubleValue];

Zaokrąglanie do najbliższego int można następnie wykonać jako

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

Szczerze mówiąc nie jestem pewien, czy istnieje bardziej usprawniony sposób konwersji z powrotem na ciąg niż

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
olliej
źródło
13
Niekoniecznie chcesz to zrobić, ponieważ różne ustawienia regionalne inaczej formatują liczby. Niektórzy zapiszą „1000” za tysiąc, podczas gdy inni zapiszą „1000”, a inni „1.000” - co otrzymujesz z - [NSString doubleValue]?
Chris Hanson
9
Double to numeryczny typ danych - nie zawiera żadnego formatowania. Wywołanie [NSString doubleValue] zwróciłoby 1000, ponieważ to tylko liczba.
Andy
12
NSString nie może zawierać liczby, a jedynie reprezentację liczby. Ta reprezentacja może mieć dowolny z wielu formatów, które różnią się w zależności od ustawień regionalnych.
Chris Hanson,
5
możesz zechcieć zintegrować odpowiedź @Barry Wark w swojej,[[NSNumber numberWithInt:myInt] stringValue]
Dan Rosenstark
1
Co się stanie, jeśli wartość ciągu nie jest prawidłowym podwójnym ciągiem, wówczas doubleValue zwróci 0,0. Wydaje mi się, że rozwiązanie sugerujące użycie NSNumberFormatter jest lepsze, ponieważ jeśli ciąg nie reprezentuje prawidłowego podwójnego łańcucha, zwracane jest nil.
Kaydell
70

Aby naprawdę poprawnie przekonwertować ciąg na liczbę, musisz użyć wystąpienia NSNumberFormatterskonfigurowanego dla ustawień regionalnych, z których czytasz ciąg.

Różne ustawienia regionalne będą inaczej formatować liczby. Na przykład w niektórych częściach świata COMMAjest używany jako separator dziesiętny, podczas gdy w innych jest PERIOD- a separator tysięcy (jeśli jest używany) jest odwrócony. Chyba że jest to przestrzeń. Albo wcale.

To naprawdę zależy od pochodzenia wkładu. Najbezpieczniejszą rzeczą do zrobienia jest skonfigurowanie a pod NSNumberFormatterkątem sposobu formatowania danych wejściowych i użycie go -[NSFormatter numberFromString:]do uzyskania NSNumberz niego. Jeśli chcesz obsłużyć błędy konwersji, możesz użyć -[NSFormatter getObjectValue:forString:range:error:]zamiast tego.

Chris Hanson
źródło
2
Lub możesz użyć zlokalizowanego skanera, na przykład utworzonego za pomocą [NSScanner localizedScannerWithString:], a następnie [scanner scanDouble: & aDouble] przeskanuje podwójnie w oparciu o bieżące ustawienia regionalne użytkownika.
dreamlax
32

Dodając do odpowiedzi olliej, można przekształcić z powrotem do int ciąg z NSNumber„s stringValue:

[[NSNumber numberWithInt:myInt] stringValue]

stringValuena zasadzie NSNumberwywołuje descriptionWithLocale:nil, daje zlokalizowaną reprezentację ciąg wartości. Nie jestem pewien, czy [NSString stringWithFormat:@"%d",myInt]dostaniesz odpowiednio zlokalizowaną kopię myInt.

Barry Wark
źródło
Dzięki Barry. Linia NSNumber do stringValue, którą wysłałeś, działała dla mnie, podczas gdy NSString stringWithFormat nie.
znak
7

Metoda zaokrąglania ollieja jest błędna dla liczb ujemnych

  • 2,4 zaokrąglenie równa się 2 (metoda ollieja robi to dobrze)
  • −2,4 zaokrąglone to −2 (metoda ollieja zwraca -1)

Oto alternatywa

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

Możesz oczywiście użyć funkcji zaokrąglania z math.h

Paul Dixon
źródło
7

Oto działająca próbka NSNumberFormatter odczytująca zlokalizowaną liczbę String (xCode 3.2.4, osX 10.6), aby zaoszczędzić innym godzin, które właśnie spędziłem na zabawie. Uwaga: chociaż obsługuje końcowe spacje, takie jak „8 765,4”, nie obsługuje początkowych białych znaków i nie obsługuje przypadkowych znaków tekstowych. (Nieprawidłowe ciągi wejściowe: „8”, „8q” i „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
miker
źródło
1
Co zwraca numberFromString, jeśli ciąg nie jest prawidłowym ciągiem?
Ben Clayton
numberFromString: zwraca obiekt NSNumber. Zobacz NumberFormatting i NSNumberFormatter w Apple Docs . (Nie jestem pewien, jak obiekty NSNumber kodują „nie liczbę” lub „zły numer”, ale widzę, że istnieje NSNull możliwą wartość.)
miker
@BenClayton numberFromString zwraca nilwartość, NSNumber*jeśli nie można jej przeanalizować. Nie mogę odtworzyć tego problemu, który miałeś z wiodącymi białymi znakami i zabłąkanymi znakami tekstowymi, IMO działa poprawnie. " 28.5 "analizuje jak 28,5, i "gibberish28.5", "28.5gibberish"i "gibberish28.5gibberish"wszystkie są unparseable; " 2 8 . 5. "jest nie do przeanalizowania, ale nie jest to niezwykłe.
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];
Samir Jwarchan
źródło
3

W przypadku konwersji z liczby na łańcuch, co powiesz na użycie nowej składni literałów (XCode> = 4.4), jest trochę bardziej zwarta.

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

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

( Pakuje to jako NSNumber i konwertuje na ciąg przy użyciu metody opisu NSObjects )

Robert
źródło
2

Do zaokrąglania prawdopodobnie powinieneś używać funkcji C zdefiniowanych w math.h.

int roundedX = round(x);

Przytrzymaj Option i kliknij dwukrotnie roundw Xcode, a wyświetli się strona podręcznika z różnymi funkcjami do zaokrąglania różnych typów.

benzado
źródło
1

To najłatwiejszy sposób, jaki znam:

float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
Sam Soffes
źródło
1

z tego przykładu tutaj możesz zobaczyć konwersje w obie strony:

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);
zoltan
źródło
1

konwertuje tekst wprowadzony w polu tekstowym na liczbę całkowitą

double mydouble=[_myTextfield.text doubleValue];

zaokrąglenie do najbliższego podwójnego

mydouble=(round(mydouble));

zaokrąglanie do najbliższej liczby całkowitej (biorąc pod uwagę tylko wartości dodatnie)

int myint=(int)(mydouble);

konwersja z podwójnej na ciąg

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

lub

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

konwertowanie z int na string

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

lub

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
Ashish Pisey
źródło
1

Skończyło się na tym przydatnym makrze:

#define STRING(value)               [@(value) stringValue]
dimanitm
źródło