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?
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?
Odpowiedzi:
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];
[[NSNumber numberWithInt:myInt] stringValue]
Aby naprawdę poprawnie przekonwertować ciąg na liczbę, musisz użyć wystąpienia NSNumberFormatter
skonfigurowanego 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 COMMA
jest 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 NSNumberFormatter
kątem sposobu formatowania danych wejściowych i użycie go -[NSFormatter numberFromString:]
do uzyskania NSNumber
z niego. Jeśli chcesz obsłużyć błędy konwersji, możesz użyć -[NSFormatter getObjectValue:forString:range:error:]
zamiast tego.
Dodając do odpowiedzi olliej, można przekształcić z powrotem do int ciąg z NSNumber
„s stringValue
:
[[NSNumber numberWithInt:myInt] stringValue]
stringValue
na zasadzie NSNumber
wywołuje descriptionWithLocale:nil
, daje zlokalizowaną reprezentację ciąg wartości. Nie jestem pewien, czy [NSString stringWithFormat:@"%d",myInt]
dostaniesz odpowiednio zlokalizowaną kopię myInt
.
Metoda zaokrąglania ollieja jest błędna dla liczb ujemnych
Oto alternatywa
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
Możesz oczywiście użyć funkcji zaokrąglania z math.h
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
nil
wartość, 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.
// 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];
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 )
To najłatwiejszy sposób, jaki znam:
float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
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);
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];