Voglio convertire una stringa in una doppia e dopo aver fatto un po 'di matematica su di essa, riconvertirla in una stringa.
Come posso farlo in Objective-C?
C'è un modo per arrotondare un doppio anche all'intero più vicino?
Voglio convertire una stringa in una doppia e dopo aver fatto un po 'di matematica su di essa, riconvertirla in una stringa.
Come posso farlo in Objective-C?
C'è un modo per arrotondare un doppio anche all'intero più vicino?
Risposte:
Puoi convertire un NSString in un doppio con
double myDouble = [myString doubleValue];
L'arrotondamento all'int più vicino può quindi essere eseguito come
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
Onestamente, non sono sicuro che esista un modo più semplice per riconvertire in una stringa
NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
[[NSNumber numberWithInt:myInt] stringValue]
Per convertire davvero da una stringa in un numero correttamente, è necessario utilizzare un'istanza di NSNumberFormatter
configurata per la locale da cui si sta leggendo la stringa.
Le diverse impostazioni locali formattano i numeri in modo diverso. Ad esempio, in alcune parti del mondo, COMMA
viene utilizzato come separatore decimale mentre in altre lo è PERIOD
- e il separatore delle migliaia (quando utilizzato) viene invertito. Tranne quando è uno spazio. O per niente presente.
Dipende davvero dalla provenienza dell'input. La cosa più sicura da fare è configurare un NSNumberFormatter
per il modo in cui l'input è formattato e usare -[NSFormatter numberFromString:]
per ottenerne uno NSNumber
. Se si desidera gestire gli errori di conversione, è possibile utilizzare -[NSFormatter getObjectValue:forString:range:error:]
invece.
L'aggiunta alla risposta di olliej, è possibile convertire da un int in una stringa con NSNumber
's stringValue
:
[[NSNumber numberWithInt:myInt] stringValue]
stringValue
su un NSNumber
invoke descriptionWithLocale:nil
, dandoti una rappresentazione di stringa localizzata di valore. Non sono sicuro se [NSString stringWithFormat:@"%d",myInt]
ti fornirà una rappresentanza adeguatamente localizzata di myInt
.
Il metodo di arrotondamento di olliej è sbagliato per i numeri negativi
Ecco un'alternativa
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
Ovviamente potresti usare una funzione di arrotondamento di math.h
Ecco un esempio funzionante di NSNumberFormatter che legge il numero localizzato String (xCode 3.2.4, osX 10.6), per salvare gli altri nelle ore che ho appena passato in giro. Attenzione: sebbene sia in grado di gestire spazi vuoti finali come "8.765,4", questo non può gestire spazi vuoti iniziali e non può gestire caratteri di testo randagi. (Stringhe di input errate: "8" e "8q" e "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
valore NSNumber*
se non può essere analizzato. Non riesco a riprodurre quel problema che hai avuto con lo spazio bianco iniziale e i caratteri di testo randagi, IMO funziona correttamente. " 28.5 "
analizza come 28,5, e "gibberish28.5"
, "28.5gibberish"
e "gibberish28.5gibberish"
sono tutti di analizzarlo; " 2 8 . 5. "
non è analizzabile ma non è insolito.
// 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];
Per la conversione da un numero a una stringa, che ne dici di usare la nuova sintassi letterale (XCode> = 4.4), è un po 'più compatto.
int myInt = (int)round( [@"1.6" floatValue] );
NSString* myString = [@(myInt) description];
(Lo confeziona come NSNumber e lo converte in una stringa usando il metodo di descrizione di NSObjects )
Questo è il modo più semplice che conosco:
float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
da questo esempio qui, puoi vedere le conversioni in entrambi i modi:
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);
converte il testo inserito nel campo di testo in numero intero
double mydouble=[_myTextfield.text doubleValue];
arrotondamento al doppio più vicino
mydouble=(round(mydouble));
arrotondamento all'int più vicino (considerando solo valori positivi)
int myint=(int)(mydouble);
conversione da doppio a stringa
myLabel.text=[NSString stringWithFormat:@"%f",mydouble];
o
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
conversione da int a stringa
myLabel.text=[NSString stringWithFormat:@"%d",myint];
o
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];