我已经为此工作了两天了。是时候咨询stackoverflow了。
我有一个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 :(得分: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]];
}