2013-04-20 45 views
14

Tôi đã cố gắng chuyển đổi một NSString như "12000.54" thành "12.000,54". Tôi đã viết một cá thể NSNumberFormatter.NSNumberFormatter với dấu phẩy thập phân phân cách

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease]; 
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setGroupingSeparator:@"."]; 
[formatter setDecimalSeparator:@","]; 

Nhưng khi tôi NSLog này:

NSLog(@"%@",[formatter stringFromNumber:[formatter numberFromString:value]]); 

It in giá trị null. Nếu tôi thay đổi dấu phẩy của tôi với một điểm nó hoạt động chính xác. Tôi chỉ muốn có thể đặt những gì tôi muốn cho lĩnh vực phân cách của tôi (dấu phẩy, điểm, dấu gạch chéo, vv ...) và tôi có kết quả đầu ra khác nhau: 12/000,54 12.000.54 12.000.54 ví dụ.

Bạn có biết cách tôi có thể xử lý việc này không?

+2

Có lẽ tôi thấy vấn đề . Tôi phải sử dụng một NSFormatter khác để làm cho numberFromString của tôi trước tiên.Tôi đã bỏ phiếu cho việc đóng bài đăng của mình – Pierre

+2

Đừng đóng, hãy tự trả lời và kiểm tra nó, những người khác sẽ có cùng một vấn đề trong tương lai. –

+0

Đồng ý với @DavidH. Câu hỏi là hợp lệ và đầy đủ với mã và thông tin cần thiết. Tôi thực sự upvoting nó :-) – LSerni

Trả lời

20

Vì vậy, câu hỏi là hợp lệ: Tôi trả lời nó bản thân mình :)

Tôi có một giá trị thập phân đọc từ sqlite (ví dụ 12000 hoặc 12.000,54) trực tiếp chuyển thành NSString. Tôi phải sử dụng dấu phân cách khác nhau tại một số thời điểm trong mã của tôi.

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease]; 
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setGroupingSeparator:@""]; 
[formatter setDecimalSeparator:@"."]; 

// Decimal values read from any db are always written with no grouping separator and a comma for decimal. 

NSNumber *numberFromString = [formatter numberFromString:@"12000.54"]]; 

[formatter setGroupingSeparator:@" "]; // Whatever you want here 
[formatter setDecimalSeparator:@","]; // Whatever you want here 

NSString *finalValue = [formatter stringFromNumber:numberFromString]; 

NSLog(@"%@",finalValue); // Print 12 000,54 

Khắc phục sự cố.

+1

Bạn cũng có thể sử dụng thuộc tính 'doubleValue' của' NSString'. – Kevin

37

Tôi khuyên bạn không nên mã hóa dấu phân tách để đảm bảo hành vi phân tách phù hợp dựa trên cài đặt ngôn ngữ iPhone. Cách dễ nhất để đến đây là:

sử dụng Objective-C

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc]init]; 
numberFormatter.locale = [NSLocale currentLocale];// this ensures the right separator behavior 
numberFormatter.numberStyle = NSNumberFormatterDecimalStyle; 
numberFormatter.usesGroupingSeparator = YES; 

// example for writing the number object into a label 
cell.finalValueLabel.text = [NSString StringWithFormat:@"%@", [numberFormatter stringForObjectValue:numberFromString]]; // your var name is not well chosen 

sử dụng SWIFT 3

let formatter = NumberFormatter() 
formatter.locale = NSLocale.current // this ensures the right separator behavior 
formatter.numberStyle = NumberFormatter.Style.decimal 
formatter.usesGroupingSeparator = true 

// example for writing the number object into a label 
// your variable "numberFromString" needs to be a NSNumber object 
finalValueLabel.text = formatter.string(from: numberFromString)! // your var name is not well chosen 

và tôi sẽ không sử dụng var-name "numberFromString" vì nó là phương pháp NSNumberFormatter. Chúc may mắn!

+0

Super answer, thanks – Mutawe

3
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
numberFormatter.usesGroupingSeparator = YES; 
[numberFormatter setMaximumFractionDigits:2]; 
[numberFormatter setMinimumFractionDigits:2]; 
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.00];` 

Wll này sẽ khắc phục vấn đề làm tròn của bạn nếu bạn đang xử lý dấu thập phân.

6

Giải pháp đơn giản nhất thời gian gần đây tôi thấy là:

NSString *localizedString = [NSString localizedStringWithFormat:@"%@", @1234567]; 

Cũng làm việc với ints:

NSString *localizedString = [NSString localizedStringWithFormat:@"%d", 1234567]; 

xác minh trong Xcode 6 sân chơi. Nhưng các tài liệu nói rằng chức năng này luôn tồn tại.

+0

các câu trả lời đơn giản hoạt động ..! –

0

Đối với sử dụng tiền tệ ...

let numberFormatter = NumberFormatter() 

// Produces symbol (i.e. "$ " for en_US_POSIX) and decimal formatting 
numberFormatter.numberStyle = .currency 

// Produces commas; i.e. "1,234" 
numberFormatter.usesGroupingSeparator = true 
numberFormatter.groupingSize = 3 

Ví dụ sử dụng:

let value: Double = 12345.6789 
numberFormatter.string(from: value as NSNumber) 

sản lượng ...

"$ 12,345.68" 

như người ta mong đợi

Các vấn đề liên quan