NSNumberFormatter 适用于小数分隔符但不适用于逗号分隔符

Posted

技术标签:

【中文标题】NSNumberFormatter 适用于小数分隔符但不适用于逗号分隔符【英文标题】:NSNumberFormatter works with decimal separator but not with comma separator 【发布时间】:2011-09-08 00:32:13 【问题描述】:

我已经为此工作了两天。是时候咨询***了。

我有一个 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。

不是我想要的!

【问题讨论】:

不理解逗号分隔模式。您在哪里以及如何需要它?举个小例子。我们会尽快解决这个问题。 谢谢。实际上,我发现问题是由在我的数字输入字符串中使用“,”符号引起的,然后将其转换为双精度以发送到分析器类进行处理(它是一种计算器)。我有一个设置,允许在点(“。”)或逗号(“,”)之间选择小数分隔符。当分隔符输入按钮设置为“,”时会出现此问题。使用 [[self analyzer_] setFirstOperand:[[display_ text] doubleValue]] 发送时,如果字符串中有“,”,分析器将不会接受作为双精度的字符串。所以我想弄清楚如何让它发挥作用。 还有一件事。我知道有一些本地化方法可以设置小数和分组符号分隔符,但我还没有弄清楚如何让它们工作。我想这样做,以便在数字格式为 3.324,084 而不是 3,324.084 的地方看起来很自然。如果我将分隔符按钮标题保留为“。”在逗号模式下,它可以工作,除了用户在输入时必须看到不正确的十进制格式,直到按下操作按钮,然后显示立即重新格式化以使用逗号格式并正确完成计算。实用,但不优雅。 【参考方案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]];   
 

【讨论】:

以上是关于NSNumberFormatter 适用于小数分隔符但不适用于逗号分隔符的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中找出货币中的小数位数

NSNumberformatter 将零添加到小数部分

NSNumberFormatter 用于 2 个小数位

NSNumberFormatter 仅四舍五入到小数点后 3 位

使用 NSNumberFormatter 生成小数点后尾随零的数字

NSNumberFormatter - 获取货币代码的货币符号