Cocoa 使用NSNumberFormatter,您如何使用2位小数,但仍然保留用户只输入1或2位小数?
我知道小数点的所有存储方式,但不确定如何才能正确显示它们以满足我的要求 我有一个字段,允许用户最多输入2个小数点。11.25、9.9等 但是,极其重要的是,输入的值应准确显示其输入方式 例如,我正在输入9.9(可能存储为9.8999999999)。然后当显示给用户时,它显示为9.89 我需要它以9.9的形式显示出来Cocoa 使用NSNumberFormatter,您如何使用2位小数,但仍然保留用户只输入1或2位小数?,cocoa,cocoa-touch,floating-point,decimal,nsnumberformatter,Cocoa,Cocoa Touch,Floating Point,Decimal,Nsnumberformatter,我知道小数点的所有存储方式,但不确定如何才能正确显示它们以满足我的要求 我有一个字段,允许用户最多输入2个小数点。11.25、9.9等 但是,极其重要的是,输入的值应准确显示其输入方式 例如,我正在输入9.9(可能存储为9.8999999999)。然后当显示给用户时,它显示为9.89 我需要它以9.9的形式显示出来 同样,11.25必须显示为11.25。如果用户输入了2位小数,则必须显示2。如果用户只输入了1,则必须显示1,无论其存储方式如何(即9.899999999)对于精确的十进制数,请使用
同样,11.25必须显示为11.25。如果用户输入了2位小数,则必须显示2。如果用户只输入了1,则必须显示1,无论其存储方式如何(即9.899999999)对于精确的十进制数,请使用
NSDecimalNumber
,这样您将不会得到9.899999999,而是得到9.9
可以使用NSNumberFormatter
类的setRoundingMode:
方法将舍入模式设置为NSNumberFormatterRoundingMode
常量之一
可以使用NSNumberFormatter
的setFormat:
方法设置显示格式
为了显示输入的小数位数,您需要保存字符串或位数。一旦将其从文本表示形式更改为数值,输入方式将丢失。对于精确的十进制数,请使用
NSDecimalNumber
,这样您将不会得到9.899999999,而是得到9.9
可以使用NSNumberFormatter
类的setRoundingMode:
方法将舍入模式设置为NSNumberFormatterRoundingMode
常量之一
可以使用NSNumberFormatter
的setFormat:
方法设置显示格式
为了显示输入的小数位数,您需要保存字符串或位数。一旦将其从文本表示形式更改为数值,输入方式将丢失。对于精确的十进制数,请使用
NSDecimalNumber
,这样您将不会得到9.899999999,而是得到9.9
可以使用NSNumberFormatter
类的setRoundingMode:
方法将舍入模式设置为NSNumberFormatterRoundingMode
常量之一
可以使用NSNumberFormatter
的setFormat:
方法设置显示格式
为了显示输入的小数位数,您需要保存字符串或位数。一旦将其从文本表示形式更改为数值,输入方式将丢失。对于精确的十进制数,请使用
NSDecimalNumber
,这样您将不会得到9.899999999,而是得到9.9
可以使用NSNumberFormatter
类的setRoundingMode:
方法将舍入模式设置为NSNumberFormatterRoundingMode
常量之一
可以使用NSNumberFormatter
的setFormat:
方法设置显示格式
为了显示输入的小数位数,您需要保存字符串或位数。一旦它从文本表示形式更改为数值,它的输入方式将丢失。您可以实现
NSFormatter
的自定义子类。它将使用字符串作为对象值,以准确保留用户输入的内容。如果您需要准确地保留用户输入的内容,那么您的模型还必须将值存储为字符串。正如Zaph所指出的,如果您转换为数值标量类型(例如,double
)或NSNumber
,则用户输入的内容的确切性质将丢失
您可以自己实现NSFormatter
的验证方法,或者您的自定义格式化程序类将使用(而不是继承)NSNumberFormatter
并利用它来验证输入(无需格式化程序输出NSNumber
s)。如果您自己实现验证,则必须小心区域设置。例如,对区域设置使用适当的小数分隔符
类的-stringForObjectValue:
实现将返回输入的副本(如果不使用ARC,则自动删除)
它的-getObjectValue:forString:errorDescription:
实现将检查当前字符串是否有效。如果不是,它将返回NO
。如果您自己实现验证,您将编写该代码。如果您正在利用NSNumberFormatter
,您将声明一个NSNumber*
变量,并在数字格式化程序实例上调用相同的方法,将NSNumber*
变量的地址作为要获取的对象传递。如果返回NO
,则方法应返回NO
。如果返回YES
,则将*anObject
设置为字符串的副本(如果不使用ARC,则自动删除),并返回YES
如果要验证部分字符串,请重写-isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:
。如果您自己实现验证,那么就编写代码。如果您正在利用NSNumberFormatter
,请调用数字格式化程序实例。我相信在设置数字格式化程序对象时,您需要在该对象上设置partialStringValidationEnabled
。您可以实现NSFormatter
的自定义子类。它将使用字符串作为对象值,以准确保留用户输入的内容。如果您需要准确地保留用户输入的内容,那么您的模型还必须将值存储为字符串。正如扎夫所指出的,如果你转换成n
NSString *inputstring = inputTextField.text;
NSNumberFormatter * inputFormatter = [NSNumberFormatter new];
NSNumber * inputNumber = [inputFormatter numberFromString:inputstring];
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]];