NSNumberFormatter numberFromString货币风格格式化返回0

问题描述:

我试图以从货币样式设置格式的UITextField(例如:$ 30,034.12 => 30034.12):获得双值来测试下面的代码NSNumberFormatter numberFromString货币风格格式化返回0

// Init and configure formatter 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
[formatter setMaximumFractionDigits:2]; 
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"us_US"]; 
[formatter setLocale:locale]; 
[formatter setGroupingSize:3]; 
[formatter setUsesGroupingSeparator:YES]; 
[formatter setGroupingSeparator:@","]; 
[formatter setAllowsFloats:YES]; 

// Get a formatted string using the local currency formatter and then get a double 
// vice-versa 
NSNumber *amount = [NSNumber numberWithDouble:30034.12]; 

NSString *amountString = [formatter stringFromNumber:amount]; 
// Output here OK : @"$ 30,034.12" 

double amountDouble = [[formatter numberFromString:amountString] doubleValue]; 
// Output here NOT OK : 0 

难道任何人都有/解决了同样的问题?

谢谢!

更新:

@DanielBarden和其他人。实际上,为了简化这篇文章,我没有包含指定我从哪里获取字符串的部分:文本字段。实际上,代码的结束之前的线应为:

// Init fromatter with style $ XXX,XXX.yy 
    NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init]; 
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
    [formatter setMaximumFractionDigits:2]; 
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"us_US"]; 
    [formatter setLocale:locale]; 
    [formatter setGroupingSize:3]; 
    [formatter setGroupingSeparator:@","]; 
    [formatter setUsesGroupingSeparator:YES]; 

    // Get the float value of the text field and format it 
    textField.text = [formatter 
         stringFromNumber:[NSNumber 
             numberWithDouble:[textField.text 
                 floatValue]]]; 

NSString *amountString = [textField text]; 

而这个文本字段以前与来自另一方法如下代码格式化(使用相同的格式配置货币样式)

现在的问题是,当我做一个NSLog时,我得到完全相同的字符串,但是当我通过字符与一个循环比较它们时,它表示$后面的空格是文本字段上的“真实空间”,并且不同符号在最初的字符串(amountString,我试图在最初的帖子中测试...)。编码问题?

+0

您可以显示您正在创建的'NSLog'调用吗? – PengOne

+1

这段代码对我来说工作得很好。你是如何调试它的?我正在使用NSLog(“%f”,amountDouble); –

+0

我相信问题在于$符号。由于你的字符串有符号,当试图获得该符号的双倍值时,它会给出一个大的0. –

该代码对我来说看起来是正确的,Xcode与我同意。我在两行中添加了你缺少的内容:

NSLog(@"%@",amountString); 
NSLog(@"%f",amountDouble); 

并且输出是正确的。我建议你检查你如何记录数值。

+0

是的,实际上这个代码工作正常,它没有出现在我包括原始代码,我从文本字段中获取数量字符串。这个double以前使用相同的格式化程序格式化并影响到文本字段。从那里我试图以另一种方式来完成这项任务。 我在“Update:”下的原始文章末尾添加了有关该问题的更详细说明。我怀疑一个编码问题,但仍然在努力。你有什么线索?非常感谢 ! –

我能想到的唯一的问题是$符号的问题。将格式化程序设置为货币形式需要$符号,如果它不存在于字符串中,它将返回0

+0

嗯......当我试图更深入地调试它时,我意识到我实际上遇到了将$符号与数值分开的空间问题。我怀疑编码问题,但仍然没有解决它。我在原帖的末尾添加了更详细的解释,以备有时间阅读。非常感谢 ! –