Làm cách nào để thực hiện chuyển đổi chuỗi trong Objective-C?


145

Tôi muốn chuyển đổi một chuỗi thành một chuỗi và sau khi thực hiện một số phép toán trên chuỗi đó, chuyển đổi nó trở lại thành một chuỗi.

Làm thế nào để tôi làm điều này trong Objective-C?

Có cách nào để làm tròn một số đến số nguyên gần nhất không?


Ngoài câu trả lời của Chris Hanson, bạn có thể tìm hiểu thêm về trình định dạng số, hành vi và chuỗi định dạng của chúng, từ NSNumberFormatter trên Mac OS X 10.4 trong Hướng dẫn lập trình định dạng dữ liệu cho ca cao .
mmalc

Một nguồn thông tin khác có thể hữu ích cho bạn là bài viết này về NSNumberFormatter: iphonesdkarticles.com/2008/11/ợi
jpm

Tôi nghĩ rằng tài liệu chính thức là khá tốt ...

Câu trả lời:


231

Bạn có thể chuyển đổi một NSString thành gấp đôi với

double myDouble = [myString doubleValue];

Làm tròn đến int gần nhất có thể được thực hiện như

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

Tôi thực sự không chắc chắn nếu có một cách hợp lý hơn để chuyển đổi trở lại thành một chuỗi hơn

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];

13
Bạn không nhất thiết muốn làm điều này, bởi vì số định dạng địa phương khác nhau khác nhau. Một số người sẽ viết "1000" cho một nghìn, trong khi những người khác sẽ viết "1.000" và những người khác "1.000" - bạn nhận được từ - [NSString doubleValue]?
Chris Hanson

9
Double là một kiểu dữ liệu số - nó không chứa bất kỳ định dạng nào. Gọi [NSString doubleValue] sẽ trả về 1000 vì đó chỉ là một số.
Andy

12
Và một NSString không thể chứa một số, chỉ đại diện cho một số. Đại diện đó có thể ở bất kỳ định dạng nào khác nhau theo ngôn ngữ.
Chris Hanson

5
bạn có thể muốn tích hợp câu trả lời của [[NSNumber numberWithInt:myInt] stringValue]
@Barry

1
Điều gì xảy ra nếu giá trị chuỗi không phải là chuỗi kép hợp lệ, thì 0,0 sẽ được doubleValue trả về. Dường như với tôi rằng giải pháp đề xuất sử dụng NSNumberFormatter là tốt hơn bởi vì nếu chuỗi không đại diện cho chuỗi kép hợp lệ, thì không được trả về.
Kaydell

70

Để thực sự chuyển đổi từ một chuỗi thành một số chính xác, bạn cần sử dụng một thể hiện được NSNumberFormattercấu hình cho miền địa phương nơi bạn đang đọc chuỗi.

Các địa phương khác nhau sẽ định dạng số khác nhau. Ví dụ, ở một số nơi trên thế giới, COMMAđược sử dụng như một dấu tách thập phân trong khi ở những nơi khác PERIOD- và dấu phân cách hàng nghìn (khi được sử dụng) bị đảo ngược. Ngoại trừ khi đó là một không gian. Hoặc không có mặt ở tất cả.

Nó thực sự phụ thuộc vào nguồn gốc của đầu vào. Điều an toàn nhất để làm là định cấu hình NSNumberFormattercho cách thức đầu vào của bạn được định dạng và sử dụng -[NSFormatter numberFromString:]để lấy NSNumbertừ nó. Nếu bạn muốn xử lý các lỗi chuyển đổi, bạn có thể sử dụng -[NSFormatter getObjectValue:forString:range:error:]thay thế.


2
Hoặc bạn có thể sử dụng một máy quét được bản địa hóa, ví dụ như một máy quét được tạo bằng [NSScanner localizedScannerWithString:], sau đó [scan scanDouble: & aDouble] sẽ quét hai lần dựa trên ngôn ngữ hiện tại của người dùng.
dreamlax

32

Thêm vào câu trả lời của olliej, bạn có thể chuyển đổi từ int trở lại chuỗi bằng NSNumber's stringValue:

[[NSNumber numberWithInt:myInt] stringValue]

stringValuetrên một lệnh NSNumbergọi descriptionWithLocale:nil, cung cấp cho bạn một đại diện chuỗi giá trị cục bộ. Tôi không chắc chắn nếu [NSString stringWithFormat:@"%d",myInt]bạn sẽ cung cấp cho bạn một sự hồi hương địa phương đúng myInt.


Cảm ơn Barry. Dòng NSNumber to stringValue mà bạn đã đăng đã hoạt động với tôi, trong khi chuỗi NSStringWithFormat thì không.
đánh dấu

7

Phương pháp làm tròn của olliej là sai đối với số âm

  • 2,4 làm tròn là 2 (phương pháp của olliej là đúng)
  • −2,4 được làm tròn là −2 (phương thức của olliej trả về -1)

Đây là một sự thay thế

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

Tất nhiên bạn có thể sử dụng hàm làm tròn từ math.h


7

Đây là một mẫu hoạt động của NSNumberFormatter đọc Chuỗi số cục bộ (xCode 3.2.4, osX 10.6), để tiết kiệm cho những người khác những giờ tôi vừa trải qua. Chú ý: trong khi nó có thể xử lý các khoảng trống theo sau, chẳng hạn như "8,765,4", điều này không thể xử lý khoảng trắng hàng đầu và điều này không thể xử lý các ký tự văn bản đi lạc. (Chuỗi đầu vào xấu: "8" và "8q" và "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
NumberFromString trả về cái gì nếu chuỗi không phải là một chuỗi hợp lệ?
Ben Clayton

numberFromString: trả về một đối tượng NSNumber. Xem NumberFormattedNSNumberFormatter trong tài liệu apple. (Tôi không chắc chắn làm thế nào các đối tượng NSNumber mã hóa "không phải là số" hoặc "số xấu", nhưng tôi thấy có một giá trị NSNull có thể.)
miker

@BenClayton numberFromString trả về nilgiá trị NSNumber*nếu không thể phân tích cú pháp. Tôi không thể tái tạo vấn đề mà bạn gặp phải với khoảng trắng hàng đầu và các ký tự văn bản đi lạc, IMO nó hoạt động tốt. " 28.5 "phân tích như 28,5, và "gibberish28.5", "28.5gibberish""gibberish28.5gibberish"tất cả đều unparseable; " 2 8 . 5. "là không thể nhìn thấy nhưng đó không phải là bất thường.
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

Để chuyển đổi từ một số thành một chuỗi, làm thế nào về việc sử dụng cú pháp chữ mới (XCode> = 4.4), nhỏ gọn hơn một chút.

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

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

(Đóng hộp dưới dạng NSNumber và chuyển đổi thành chuỗi bằng phương pháp mô tả của NSObjects )


2

Để làm tròn, có lẽ bạn nên sử dụng các hàm C được xác định trong math.h.

int roundedX = round(x);

Giữ phím Option và nhấp đúp chuột vào roundXcode và nó sẽ hiển thị cho bạn trang man với nhiều chức năng khác nhau để làm tròn các loại khác nhau.


1

Đây là cách dễ nhất mà tôi biết:

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

1

từ ví dụ này ở đây, bạn có thể thấy các chuyển đổi theo cả hai cách:

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

chuyển đổi văn bản đã nhập trong trường văn bản thành số nguyên

double mydouble=[_myTextfield.text doubleValue];

làm tròn đến đôi gần nhất

mydouble=(round(mydouble));

làm tròn đến int gần nhất (chỉ xem xét các giá trị dương)

int myint=(int)(mydouble);

chuyển đổi từ gấp đôi thành chuỗi

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

hoặc là

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

chuyển đổi từ int sang chuỗi

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

hoặc là

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

1

Tôi đã kết thúc bằng cách sử dụng macro tiện dụng này:

#define STRING(value)               [@(value) stringValue]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.