Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 使用NSNumberFormatter,您如何使用2位小数,但仍然保留用户只输入1或2位小数?_Cocoa_Cocoa Touch_Floating Point_Decimal_Nsnumberformatter - Fatal编程技术网

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

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)对于精确的十进制数,请使用

我知道小数点的所有存储方式,但不确定如何才能正确显示它们以满足我的要求

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

但是,极其重要的是,输入的值应准确显示其输入方式

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

我需要它以9.9的形式显示出来


同样,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]];