2013-04-20 259 views
14

我試圖將「12000.54」這樣的NSString轉換爲「12.000,54」。我寫了一個NSNumberFormatter實例。NSNumberFormatter和逗號小數點分隔符

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

但是,當我的NSLog這樣的:

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

它打印空值。如果我用一個點改變我的逗號,它就能正常工作。我只是想能夠把我想要的分隔符字段(逗號,點,斜槓等),我有不同的輸出:12/000,54 12.000.54 12,000,54例如。

你知道我該如何處理嗎?

+2

也許我發現這個問題。我必須使用另一個NSFormatter來首先創建我的numberFromString。我投票結束我的文章 – Pierre 2013-04-20 17:28:53

+2

不要關閉它,自己輸入答案並檢查它,其他人將來也會遇到同樣的問題。 – 2013-04-21 12:51:49

+0

與@DavidH同時發生。這個問題是有效的,並附有代碼和必要的信息。我其實是upvoting它:-) – LSerni 2013-04-21 13:39:15

回答

20

所以現在的問題是有效的:我回答我自己:)

我從sqlite的閱讀十進制值(例如12000或12000.54)直接轉化成的NSString。 我必須在我的代碼中的某處使用不同的分隔符。

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 

問題解決了。

+1

您也可以使用'NSString'的'doubleValue'屬性。 – Kevin 2013-06-23 15:45:41

37

我建議不要硬編碼分隔符以確保基於iPhone語言環境設置的正確分隔符行爲。以這種最簡單的方法是:

使用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 

使用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 

,我也不會使用var名 「numberFromString」,因爲它是一個NSNumberFormatter方法。 祝你好運!

+0

超級回答,謝謝 – Mutawe 2014-05-14 12:02:17

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

這將解決你的上舍入問題,如果你正在處理小數點。

6

我最近發現最簡單的解決方法是:

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

與整型也可以工作:

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

驗證在Xcode 6遊樂場。但文件稱這個功能一直存在。

+0

簡單的答案作品..! – 2016-07-15 10:41:39

0

對於貨幣使用...

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 

用法示例:

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

產量...

"$ 12,345.68" 

正如人們所預料

相關問題