Ios NSNumberFormatter赢得';t不接受小数点后的零

Ios NSNumberFormatter赢得';t不接受小数点后的零,ios,nsnumber,nsnumberformatter,nsdecimalnumber,decimal-point,Ios,Nsnumber,Nsnumberformatter,Nsdecimalnumber,Decimal Point,有人问过类似的问题,但我发现提供的解决方案不适用于最新的iOS SDK,或者不完全适用于这种特殊情况 我使用NSNotification调用一个方法,该方法在UILabel中使用分组符号格式化数字,因为它是使用按钮输入中的数字输入的。它也适用于整数和小数——只要小数点后不输入零。例如,如果输入2000,则显示为2000,因为输入得很好。如果输入23.345,则显示也很好。对这些数字进行的任何计算都是正确的。但不可能输入0.0001或0.2340007!它不会在小数点后加上任何零 我从stacko

有人问过类似的问题,但我发现提供的解决方案不适用于最新的iOS SDK,或者不完全适用于这种特殊情况

我使用NSNotification调用一个方法,该方法在UILabel中使用分组符号格式化数字,因为它是使用按钮输入中的数字输入的。它也适用于整数和小数——只要小数点后不输入零。例如,如果输入2000,则显示为2000,因为输入得很好。如果输入23.345,则显示也很好。对这些数字进行的任何计算都是正确的。但不可能输入0.0001或0.2340007!它不会在小数点后加上任何零

我从stackoverflow的另一篇文章中得到了最初的代码理念:

NSString *currentText = [display_ text];
currentText = [currentText stringByReplacingOccurrencesOfString:@","
               withString:@""];
currentText = [currentText stringByReplacingOccurrencesOfString:@"." 
               withString:@"."];

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setGroupingSeparator:@","];
[formatter setDecimalSeparator:@"."];
[formatter setMaximumFractionDigits:10];

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:currentText];

NSString *finalText = [formatter stringFromNumber:number];

NSString *lastChar = [currentText substringFromIndex:[currentText length] - 1]; 

if ([lastChar isEqualToString:@"."]) 
{
 finalText = [finalText stringByAppendingString:@"."];
}

[display_ setText: finalText];
[formatter release];
格式化程序参数的任何欺骗(我已经尝试过)都不允许在小数点后输入零。

为什么要将“.”替换为“.”?在数字被实例化之后,您在调试器中看到了什么

我从来没有和NSDecimalNumber打过交道,但不久前我已经和双打打打过交道了。我建议解决这个问题。使用硬编码值实例化
编号
,格式化并将其写入日志文件。如果这不起作用,请尝试下面我的代码,它在我的应用程序中使用双值可以正常工作。我使用的是德语区域设置,但这不应该是重点

NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init];
[formatter setAllowsFloats:TRUE];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumSignificantDigits:20];
[formatter setMaximumSignificantDigits:20];
[formatter setMinimumFractionDigits:0];
[formatter setMaximumFractionDigits:5];
NSLocale* locale = [NSLocale currentLocale];
[formatter setLocale:locale];
NSNumber* number = [NSNumber numberWithDouble:1000.0123f];
myTextField.text = [formatter stringFromNumber:number];
如果你的代码已经运行了

  • 检查是否没有O而不是零
  • 移除上述“替换件”
  • 我发现设置区域设置明确地解决了一些问题(记忆细节已经太久了,但您可以尝试一下)
  • 用NSNumber替换NSDecimalNumber,并为其提供双值
  • 检查XIB文件并确保文本字段不执行任何其他格式设置
为什么要将“.”替换为“.”?在数字被实例化之后,您在调试器中看到了什么

我从来没有和NSDecimalNumber打过交道,但不久前我已经和双打打打过交道了。我建议解决这个问题。使用硬编码值实例化
编号
,格式化并将其写入日志文件。如果这不起作用,请尝试下面我的代码,它在我的应用程序中使用双值可以正常工作。我使用的是德语区域设置,但这不应该是重点

NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init];
[formatter setAllowsFloats:TRUE];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumSignificantDigits:20];
[formatter setMaximumSignificantDigits:20];
[formatter setMinimumFractionDigits:0];
[formatter setMaximumFractionDigits:5];
NSLocale* locale = [NSLocale currentLocale];
[formatter setLocale:locale];
NSNumber* number = [NSNumber numberWithDouble:1000.0123f];
myTextField.text = [formatter stringFromNumber:number];
如果你的代码已经运行了

  • 检查是否没有O而不是零
  • 移除上述“替换件”
  • 我发现设置区域设置明确地解决了一些问题(记忆细节已经太久了,但您可以尝试一下)
  • 用NSNumber替换NSDecimalNumber,并为其提供双值
  • 检查XIB文件并确保文本字段不执行任何其他格式设置

谢谢@Kay。我以前试过你的大部分想法。您的代码适用于硬编码值,但在按顺序输入数字时失败。你说得对,我不需要用“”替换“”,但这并不能使它工作得更好。使用您的想法和
NSLocale*locale=[NSLocale currentLocale];[格式化程序setLocale:locale];NSNumber*number=[formatter numberFromString:[显示文本]];NSString*finNum=[格式化程序stringFromNumber:number];[显示文本:finNum]它不接受小数点,并且在4位数后清除。如果数字来自doubleValue,则相同。使用NSDecimal或NSNumber硬编码。。。四位数之后?hmmh,最大分数设为5,奇怪。您是在设备上工作还是在模拟器中工作?你所在的地区是什么?您是否尝试强制我们使用区域设置?尝试使用NSDecimal和NSNumber。我试图强迫我们(我在美国)。它在模拟器上。我提出了一种我称之为“变通”的方法。在我的输入法中,每当追加输入字符串时,我都会调用displaydichange方法,除非存在小数点。在这些条件下,格式化程序格式化整数分组分隔符,只要不再调用displaydicchange方法,十进制数的输入就没有问题。保留以前格式化的分组分隔符。“如果”的说法也不再需要了。我很高兴听到你找到了一个解决办法+1作为找到自己解决方案的安慰:-)谢谢@Kay。我以前试过你的大部分想法。您的代码适用于硬编码值,但在按顺序输入数字时失败。你说得对,我不需要用“”替换“”,但这并不能使它工作得更好。使用您的想法和
NSLocale*locale=[NSLocale currentLocale];[格式化程序setLocale:locale];NSNumber*number=[formatter numberFromString:[显示文本]];NSString*finNum=[格式化程序stringFromNumber:number];[显示文本:finNum]它不接受小数点,并且在4位数后清除。如果数字来自doubleValue,则相同。使用NSDecimal或NSNumber硬编码。。。四位数之后?hmmh,最大分数设为5,奇怪。您是在设备上工作还是在模拟器中工作?你所在的地区是什么?您是否尝试强制我们使用区域设置?尝试使用NSDecimal和NSNumber。我试图强迫我们(我在美国)。它在模拟器上。我提出了一种我称之为“变通”的方法。在我的输入法中,每当追加输入字符串时,我都会调用displaydichange方法,除非存在小数点。在这些条件下,格式化程序格式化整数分组分隔符,只要不再调用displaydicchange方法,十进制数的输入就没有问题。保留以前格式化的分组分隔符。“如果”的说法也不再需要了。我很高兴听到你找到了一个解决办法+1作为找到自己解决方案的安慰:-)