Como fazer conversões de string no Objective-C?

145

Eu quero converter uma seqüência de caracteres em um duplo e depois de fazer algumas contas, convertê-lo novamente em uma seqüência de caracteres.

Como faço isso no Objective-C?

Existe uma maneira de arredondar um dobro para o número inteiro mais próximo também?

rksprst
fonte
Além da resposta de Chris Hanson, você pode descobrir mais sobre os formatadores de números, seu comportamento e seqüências de formatos, em NSNumberFormatter no Mac OS X 10.4 no Guia de programação de formatação de dados para cacau .
Mmalc # 5/08
Outra fonte de informação que pode ser útil para você é este artigo sobre o NSNumberFormatter
jpm
Eu acho que a documentação oficial é muito bom ...

Respostas:

231

Você pode converter um NSString em um duplo com

double myDouble = [myString doubleValue];

O arredondamento para o int mais próximo pode ser feito como

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

Sinceramente, não tenho certeza se existe uma maneira mais simplificada de converter novamente em uma string do que

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
olliej
fonte
13
Você não necessariamente deseja fazer isso, porque diferentes localidades formatam números de maneira diferente. Alguns escreverão "1000" para mil, enquanto outros escreverão "1.000" e outros "1.000" - de que você obtém - [NSString doubleValue]?
Chris Hanson
9
Double é um tipo de dados numérico - não contém nenhuma formatação. Ligar para [NSString doubleValue] retornaria 1000 porque é apenas um número.
513 Andy
12
E um NSString não pode conter um número, apenas uma representação de um número. Essa representação pode estar em qualquer um dos vários formatos que diferem por localidade.
Chris Hanson
5
você pode querer integrar a resposta de @Barry Wark na sua,[[NSNumber numberWithInt:myInt] stringValue]
Dan Rosenstark
1
E se o valor da sequência não for uma sequência dupla válida, 0,0 será retornado por doubleValue. Parece-me que a solução que sugere o uso de NSNumberFormatter é melhor porque se a sequência não representa uma sequência dupla válida, nada é retornado.
21314 Kaydell
70

Para realmente converter de uma sequência para um número corretamente, você precisa usar uma instância NSNumberFormatterconfigurada para o código do idioma a partir do qual você está lendo a sequência.

Diferentes localidades formatarão os números de maneira diferente. Por exemplo, em algumas partes do mundo, COMMAé usado como um separador decimal, enquanto em outras éPERIOD - e o separador de milhares (quando usado) é invertido. Exceto quando é um espaço. Ou não está presente.

Realmente depende da procedência da entrada. A coisa mais segura a fazer é configurar um NSNumberFormatterpara a forma como sua entrada é formatada e usada -[NSFormatter numberFromString:]para obter uma NSNumbersaída. Se você deseja lidar com erros de conversão, pode usar -[NSFormatter getObjectValue:forString:range:error:].

Chris Hanson
fonte
2
Ou você pode usar um scanner localizado, por exemplo, um criado com [NSScanner localizedScannerWithString:] e, em seguida, [scanner scanDouble: & aDouble] digitalizará duas vezes com base na localidade atual do usuário.
7119 dreamlax
32

Adicionando à resposta de olliej, você pode converter de um int de volta para uma string com NSNumber's stringValue:

[[NSNumber numberWithInt:myInt] stringValue]

stringValueem uma NSNumberchamada descriptionWithLocale:nil, fornecendo uma representação de valor localizada da cadeia de caracteres. Não tenho certeza se [NSString stringWithFormat:@"%d",myInt]isso lhe dará uma representação adequadamente localizada de myInt.

Barry Wark
fonte
Obrigado Barry. A linha NSNumber para stringValue que você postou funcionou para mim, enquanto a linha NSString stringWithFormat não.
marca
7

o método de arredondamento de olliej está errado para números negativos

  • 2.4 arredondado é 2 (o método de olliej acerta)
  • −2,4 arredondado é −2 (o método de olliej retorna -1)

Aqui está uma alternativa

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

Obviamente, você poderia usar uma função de arredondamento de math.h

Paul Dixon
fonte
7

Aqui está um exemplo de trabalho do NSNumberFormatter lendo o número localizado String (xCode 3.2.4, osX 10.6), para salvar outras pessoas das horas que passei brincando. Cuidado: embora ele possa lidar com espaços em branco à direita, como "8.765,4", isso não pode lidar com espaços em branco à esquerda e caracteres de texto dispersos. (Sequências de entrada incorretas: "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
miker
fonte
1
O que numberFromString retorna se a sequência não for uma sequência válida?
Ben Clayton
numberFromString: retorna um objeto NSNumber. Consulte NumberFormatting e NSNumberFormatter nos documentos da apple. (Eu não tenho certeza de como NSNumber objetos codificar "não é um número" ou "ruim número", mas vejo que há um possível valor NSNull.)
Miker
@BenClayton numberFromString retorna um nilvalor NSNumber*se não puder ser analisado. Não consigo reproduzir o problema que você teve com espaços em branco à esquerda e caracteres de texto dispersos; o IMO está funcionando corretamente. " 28.5 "analisa como 28,5, e "gibberish28.5", "28.5gibberish"e "gibberish28.5gibberish"são todos unparseable; " 2 8 . 5. "é imparável, mas isso não é incomum.
Jrh 23/01/19
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
fonte
3

Para a conversão de um número em uma string, que tal usar a nova sintaxe de literais (XCode> = 4.4), é um pouco mais compacta.

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

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

(Encaixota-o como um NSNumber e converte-o em uma string usando o método de descrição dos NSObjects )

Robert
fonte
2

Para arredondar, você provavelmente deve usar as funções C definidas em math.h.

int roundedX = round(x);

Mantenha pressionada a tecla Option e clique duas vezes roundno Xcode e ele exibirá a página do manual com várias funções para arredondar tipos diferentes.

benzado
fonte
1

Esta é a maneira mais fácil que eu conheço:

float myFloat = 5.3;
NSInteger myInt = (NSInteger)myFloat;
Sam Soffes
fonte
1

neste exemplo aqui, você pode ver as conversões nos dois sentidos:

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
fonte
1

converter texto digitado no campo de texto em número inteiro

double mydouble=[_myTextfield.text doubleValue];

arredondando para o dobro mais próximo

mydouble=(round(mydouble));

arredondamento para o int mais próximo (considerando apenas valores positivos)

int myint=(int)(mydouble);

convertendo de duplo para string

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

ou

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

convertendo de int para string

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

ou

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
Ashish Pisey
fonte
1

Acabei usando esta macro prática:

#define STRING(value)               [@(value) stringValue]
dimanitm
fonte