Come eseguire conversioni di stringa in Objective-C?


145

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?


Oltre alla risposta di Chris Hanson, puoi trovare ulteriori informazioni sui formattatori di numeri, il loro comportamento e le stringhe di formato, da NSNumberFormatter su Mac OS X 10.4 nella Guida alla programmazione della formattazione dei dati per Cocoa .
mmalc,

Un'altra fonte di informazioni che potrebbe esserti utile è questo articolo su NSNumberFormatter: iphonesdkarticles.com/2008/11/…
jpm

Penso che la documentazione ufficiale sia abbastanza buona ...

Risposte:


231

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

13
Non devi necessariamente farlo, perché le diverse localizzazioni formattano i numeri in modo diverso. Alcuni scriveranno "1000" per mille, mentre altri scriveranno "1.000" e altri "1.000" - da cosa ottieni - [NSString doubleValue]?
Chris Hanson,

9
Double è un tipo di dati numerico: non contiene alcuna formattazione. Chiamare [NSString doubleValue] restituirà 1000 perché è solo un numero.
Andy,

12
E una NSString non può contenere un numero, solo una rappresentazione di un numero. Tale rappresentazione può essere in uno dei vari formati che differiscono in base alla lingua.
Chris Hanson,

5
potresti voler integrare la risposta di @Barry Wark nella tua,[[NSNumber numberWithInt:myInt] stringValue]
Dan Rosenstark,

1
Che cosa succede se il valore della stringa non è una doppia stringa valida, quindi 0,0 verrà restituito da doubleValue. Mi sembra che la soluzione che suggerisce l'uso di NSNumberFormatter sia migliore perché se la stringa non rappresenta una doppia stringa valida, viene restituito zero.
Kaydell,

70

Per convertire davvero da una stringa in un numero correttamente, è necessario utilizzare un'istanza di NSNumberFormatterconfigurata 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, COMMAviene 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 NSNumberFormatterper 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.


2
In alternativa, è possibile utilizzare uno scanner localizzato, ad esempio uno creato con [NSScanner localizedScannerWithString:], quindi [scanner scanDouble: & aDouble] eseguirà la scansione in doppio sulla base delle impostazioni internazionali correnti dell'utente.
dreamlax,

32

L'aggiunta alla risposta di olliej, è possibile convertire da un int in una stringa con NSNumber's stringValue:

[[NSNumber numberWithInt:myInt] stringValue]

stringValuesu un NSNumberinvoke 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.


Grazie Barry. La riga NSNumber a stringValue che hai pubblicato ha funzionato per me, mentre la stringa NSStringWithFormat no.
segna il

7

Il metodo di arrotondamento di olliej è sbagliato per i numeri negativi

  • 2.4 arrotondato è 2 (il metodo di olliej fa bene)
  • −2,4 arrotondato è −2 (il metodo di olliej restituisce -1)

Ecco un'alternativa

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

Ovviamente potresti usare una funzione di arrotondamento di math.h


7

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

1
Cosa restituisce numberFromString se la stringa non è una stringa valida?
Ben Clayton,

numberFromString: restituisce un oggetto NSNumber. Vedi NumberFormatting e NSNumberFormatter in Apple Docs . (Non sono sicuro di come gli oggetti NSNumber codifichino "non un numero" o "numero errato", ma vedo che esiste un valore NSNull possibile.)
miker

@BenClayton numberFromString restituisce un nilvalore 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.
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

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 )


2

Per arrotondare, dovresti probabilmente usare le funzioni C definite in math.h.

int roundedX = round(x);

Tieni premuto Opzione e fai doppio clic su roundXcode e ti mostrerà la pagina man con varie funzioni per arrotondare diversi tipi.


1

Questo è il modo più semplice che conosco:

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

1

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

1

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

1

Ho finito per usare questa utile macro:

#define STRING(value)               [@(value) stringValue]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.