【问题标题】:NSNumberFormatter Won't Accept Zeros After a Decimal PointNSNumberFormatter 不接受小数点后的零
【发布时间】:2011-09-25 02:05:44
【问题描述】:

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

我使用 NSNotification 调用一个方法,该方法在 UILabel 中使用分组符号格式化数字,因为它是使用按钮输入中的数字输入的。它也适用于整数和小数——只要小数点后没有输入零。例如,如果输入 2000,它会显示为 2,000,因为它输入得很好。如果输入 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];

对格式化程序的参数进行任何修改(我已经尝试过)都不允许在小数点后输入零。

【问题讨论】:

    标签: ios nsnumber nsnumberformatter nsdecimalnumber decimal-point


    【解决方案1】:

    为什么要替换“。”和 ”。”? number 实例化后在调试器中看到了什么?

    我从未与 NSDecimalNumber 合作过,但前段时间我已经为双打而苦苦挣扎。我建议分解问题。使用硬编码值实例化number,对其进行格式化并将其写入日志文件。如果这不起作用,请尝试下面的代码,它在我的应用程序中使用双值可以正常工作。我正在使用德语区域设置,但这不应该是重点。

    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 而不是零
    • 删除这个“.”上面提到的替换
    • 我发现设置语言环境显式解决了一些问题(时间太久了,无法记住细节,但您可以尝试一下)
    • 将 NSDecimalNumber 替换为 NSNumber 并用双精度值输入
    • 检查您的 XIB 文件并确保您的文本字段不执行任何其他格式设置

    【讨论】:

    • 谢谢@Kay。我以前尝试过你的大部分想法。您的代码适用于硬编码值,但在按顺序输入数字时会失败。你是对的,我不需要替换“。”和 ”。”但这并没有使它更好地工作。使用你的想法和NSLocale* locale = [NSLocale currentLocale]; [formatter setLocale:locale]; NSNumber* number = [formatter numberFromString:[display_ text]]; NSString *finNum = [formatter stringFromNumber: number]; [display_ setText:finNum ]; 它不会接受小数点,它会在 4 位数字后清除。如果 number 来自 doubleValue,则相同。
    • 用 NSDecimal 或 NSNumber 硬编码? ...在 4 位数字之后?嗯,maximumFraction 设置为 5,奇怪。您是在设备上工作还是在模拟器中工作?你的语言环境是什么?您是否尝试过强制使用美国语言环境?
    • 尝试使用 NSDecimal 和 NSNumber。我试图强制使用美国语言环境(我在美国)。它在模拟器上。我想出了我所说的“解决方法”。在我的输入法中,每次附加输入字符串时,我都会调用 displayDidChange 方法,除非存在小数点。在这些条件下,格式化程序格式化整数分组分隔符,并且只要不再次调用 displayDiDChange 方法,输入十进制数就没有问题。保留以前格式化的分组分隔符。然后也不再需要“if”语句。
    • 很高兴听到您找到了解决方法。 +1 让您轻松找到自己的解决方案 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多