NSNumberFormatter:显示0作为最后一个数字,从像25.0这样的字符串开始

问题描述:

我有一个字符串表示一个浮点数,例如2400.0。我想将其格式化为数字(2,400.0),我需要在数字符号后面保留零。NSNumberFormatter:显示0作为最后一个数字,从像25.0这样的字符串开始

NSString* theString = @"2400.0"; 

// I convert the string to a float 
float f = [theString floatValue]; 
// here I lose the digit information :(and it ends up with 2400 instead of 2400.0 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setUsesSignificantDigits:YES]; 
[formatter setMinimumFractionDigits:1]; 
[formatter setMaximumFractionDigits:2]; 
[formatter setLocale:[NSLocale currentLocale]]; 

NSString *result = [formatter stringFromNumber:@(f)]; 

的的resultNSLog2,400,而我需要2,400.0

我怎样才能获得正确的字符串?

您可能想要将minimumFractionDigits设置为1(以及您的maximumFractionDigits也是这种情况)。

你也可能不想使用有效数字。下面的代码产生所需的输出:

NSString *theString = @"2400.0"; 

float f = [theString floatValue]; 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setMinimumFractionDigits:1]; 
[formatter setMaximumFractionDigits:1]; 
[formatter setLocale:[NSLocale currentLocale]]; 

NSLog(@"%@", [formatter stringFromNumber:@(f)]); 
+0

的问题是,从字符串的第一个转换过程中漂浮我失去了” .0" 的信息。我已经尝试设置'minimumFractionDigits'。顺便说一句我把它添加到我的代码示例更加精确。 – MatterGoal

+0

我不明白你如何失去'.0'(我能理解的另一个分数,但'.0'?)无论如何,你需要两个数字格式化器:一个用于输入,另一个用于输出。 – DarkDust

+0

哦,既然你设置了'setUsesSignificantDigits:YES',你可能需要设置['minimumSignificantDigits'](https://developer.apple.com/library/mac/documentation/cocoa/reference/Foundation/Classes/NSNumberFormatter_Class/ Reference/Reference.html#// apple_ref/occ/instm/NSNumberFormatter/setMinimumSignificantDigits :)(参见[this question](http://*.com/questions/1322348/what-describes-nsnumberformatter-maximumsignificantdigits))或把它们关掉。 – DarkDust

下面解决问题

NSString *formatString = @"0,000.0"; 
[formatter setPositiveFormat:formatString]; 

将被用于格式化0的小数后的数字。它也适用于负数。

您应该根据小数点前后浮点数的位数动态更改格式字符串。

希望它有帮助。

+1

我需要保留区域设置信息。这不是一个解决方案。许多国家使用不同的格式,如'@“0.000,0”' – MatterGoal

+0

同意,这不是一个通用的解决方案。然而,它提供了问题“需要一个格式为0,000.0”的通用解决方案,我们需要设置区域设置为格式化程序。 –

容易,

然后你去显示它只是这样做:

myLabel.text = @"%0.1f", f;