2011-09-08 69 views
1

我一直在爲此工作了兩天。有時間諮詢stackoverflow。NSNumberFormatter支持小數點分隔符,但不支持逗號分隔符

我有一個iOS用戶設置,允許選擇小數和分組分隔符。當分隔符是小數點時,它可以很好地工作,但當設置爲小數點逗號時,所有數字條目都會自動舍入到最接近的整數,並且任何計算都會失去精度。

該方案是這樣的:

//Use formatter to set decimal style for output 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setMinimumFractionDigits:1]; 
[formatter setMaximumFractionDigits:5]; 

//Set number format from preferences 
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
NSString *numberFormat = [userDefaults stringForKey:kNumberFormat]; 
if([numberFormat isEqualToString:@"Decimal Point"]) 
    { 
    [formatter setDecimalSeparator:@"."]; 
    [formatter setGroupingSeparator:@","]; 
    } 

    else 
    { 
    [formatter setDecimalSeparator:@","]; 
    [formatter setGroupingSeparator:@"."]; 
    } 

NSNumber *number = [NSNumber numberWithDouble: result]; 
NSString* formattedResult = [formatter stringFromNumber:number]; 
[display_ setText: [NSString stringWithFormat:@"%@", formattedResult]]; 
[formatter release]; 

在小數分隔模式5.5 + 5.5 = 11.0

但是,逗號分隔符模式5.5立即截斷爲在顯示5.0和5.5 + 5.5 = 10 。

不是我想要的!

+0

不明白逗號分隔模式。你在哪裏以及如何需要?舉一個小例子。我們會盡快解決這個問題。 – SayeedHussain

+0

謝謝。實際上,我發現問題是由於在我的數字輸入字符串中使用了「,」符號,然後它被轉換爲雙精度數據以發送到分析器類進行處理(它是一種計算器)。我有一個允許點(「。」)或逗號(「,」)之間的小數點分隔符選擇的設置。分隔符輸入按鈕設置爲「,」時會出現問題。如果在[[self analyzer_ setFirstOperand:[[display_text] doubleValue]]中輸入了「」,那麼分析器將不接受該字符串作爲double。所以我想弄清楚如何讓這個工作。 – ndpmcintosh

+0

另一件事。我知道有一些本地化方法可以設置十進制和分組符號分隔符,但我還沒有弄清楚如何讓它們工作。我想這樣做,所以在數字格式爲3.324,084而不是3,324,084格式的地方看起來很自然。如果我將分隔符按鈕標題保留爲「。」在逗號模式下它可以工作,除非用戶在按下操作按鈕之前必須看到不正確的十進制格式,然後立即顯示它的格式以使用逗號形式並正確完成計算。功能,但不雅。 – ndpmcintosh

回答

1

我能夠自己想出來。數字格式化程序運行正常。爲了讓我的分析器類正常工作,我必須發送一個不包含逗號小數點分隔符的double。但要使顯示看起來正確的逗號分隔符模式,我必須以所需的格式將字符串發送到顯示器(例如2.500,05),然後根據需要用小數點和逗號重新格式化字符串,然後將該字符串發送到分析儀爲雙倍(例如2,500.05)。有點棘手,因爲我基本上交換了小數點和逗號。有可能是一種更清晰的方式來做到這一點,但這工作:

NSString *numberFormat = [userDefaults stringForKey:kNumberFormat]; 

//if the string has been entered using a decimal comma, do this 
if([numberFormat isEqualToString:@"Decimal Comma"]) 
{ 

NSString *displayString = [display_ text]; 
NSString *newStringValue = [displayString 
      stringByReplacingOccurrencesOfString:@"," withString:@"x"]; 
newStringValue = [newStringValue 
      stringByReplacingOccurrencesOfString:@"." withString:@","]; 
newStringValue = [newStringValue 
      stringByReplacingOccurrencesOfString:@"x" withString:@"."]; 
[display_ setText:displayString]; 
[[self analyzer_] setFirstOperand:[newStringValue doubleValue]]; 
} 

//there is no problem if the decimal separator is a decimal point, so 
//just send it as is 
if([numberFormat isEqualToString:@"Decimal Point"]) 

{ 
[[self analyzer_] setOperand:[[display_ text] doubleValue]]; 
} 
相關問題