2011-09-08 103 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]]; 
}