1

我已经为此工作了两天了。是时候咨询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。

不是我想要的!

4

1 回答 1

1

我能够自己弄清楚。数字格式化程序运行正常。为了让我的分析器类工作,我必须向它发送一个不能包含逗号小数分隔符的双精度。但是为了让显示器在逗号分隔符模式下看起来正确,我必须将所需格式的字符串发送到显示器(例如 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]];   
} 
于 2011-09-09T05:05:49.337 回答