使用NSNumberFormatter,如何使用2个小数位,但仍然保留用户是否只输入1或2位小数?

时间:2015-03-15 16:42:22

标签: cocoa cocoa-touch floating-point decimal nsnumberformatter

我知道关于小数点的存储方式,但我不知道如何正确显示它们以满足我的要求。

我有一个字段允许用户输入最多2个小数点。 11.25,9.9等。

但是,输入的值与输入的确切显示方式非常重要。

例如,我输入9.9(可能存储为9.8999999999999)。然后,当显示给用户时,它显示为9.89。

我需要将其显示为9.9。

同样,11.25必须显示为11.25。如果用户输入了2位小数,则必须显示2位小数。如果用户只输入1,则无论如何存储,都必须显示1(即9.899999999999)

3 个答案:

答案 0 :(得分:2)

对于精确的十进制数,请使用NSDecimalNumber,这样您就不会获得9.899999999999而是9.9。

可以使用setRoundingMode:类的方法NSNumberFormatter将舍入模式设置为NSNumberFormatterRoundingMode常量之一。

可以使用setFormat:的方法NSNumberFormatter设置显示格式。

要显示输入的小数位数,您需要保存字符串或位数。一旦它从文本表示变为数值,输入的方式就会丢失。

答案 1 :(得分:1)

我对您的用户界面了解不多,但您需要使用NSNumberNSNumberFormatter

首先,使用基本NSNumberformatter从输入字符串中将用户输入作为数字。该号码将在输入时存储(例如“1.23”存储为1.23,“6.3”存储为6.3):

NSString *inputstring = inputTextField.text;
NSNumberFormatter * inputFormatter = [NSNumberFormatter new];
NSNumber * inputNumber = [inputFormatter numberFromString:inputstring];

第二次,当您显示数字时,使用更精确的NSNumberFormatter来限制小数位数:

NSNumberFormatter *outputFormatter = [[NSNumberFormatter alloc]init];
outputFormatter.locale = [NSLocale currentLocale];     // make sure to show the number with the local setting of the device!
outputFormatter.numberStyle = NSNumberFormatterDecimalStyle;
outputFormatter.usesGroupingSeparator = YES;           // your choice...
outputFormatter.groupingSize = 3;
outputFormatter.maximumFractionDigits = 2;             // <-- here you limit the number of decimal places

并显示标签,文本字段或以下内容中的数字:

outputLabel.text = [NSString localizedStringWithFormat:@"%@", [outputFormatter stringForObjectValue:inputNumber]];

这会将输出限制为最大值。 2位小数,但也不会显示小于用户输入的小数位数。

答案 2 :(得分:0)

您可以实现NSFormatter的自定义子类。它将使用字符串作为对象值,以准确保留用户输入的内容。如果您需要准确保留用户输入的内容,您的模型还必须将值存储为字符串。正如Zaph所指出的,如果你转换为数字标量类型(例如double)或NSNumber,用户输入的确切性质就会丢失。

您可以自己实现NSFormatter的验证方法,也可以自定义格式化程序类使用(不是继承NSNumberFormatter并利用它验证输入(没有格式化程序输出NSNumber)。如果您自己实现验证,则必须注意区域设置。例如,为区域设置使用适当的小数分隔符。

您的班级-stringForObjectValue:的实现会返回一个输入的副本(如果您不使用ARC,则会自动释放)。

它的-getObjectValue:forString:errorDescription:实现将检查当前字符串是否有效。如果没有,它将返回NO。如果您自己实现验证,则可以编写该代码。如果你正在利用NSNumberFormatter,你将声明一个NSNumber*变量,并在你的数字格式化器实例上调用相同的方法,将NSNumber*变量的地址作为要获取的对象。如果它返回NO,则您的方法应返回NO。如果它返回YES,请将*anObject设置为string的副本(如果不使用ARC,则自动释放)并返回YES

如果要验证部分字符串,请覆盖-isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:。如果您自己实现验证,则编写代码。如果您正在利用NSNumberFormatter,请调用您的数字格式化程序实例。我相信您需要在设置数字格式化程序对象时设置partialStringValidationEnabled