如果我在Objective-C中执行以下操作:
NSString *result = [NSString stringWithFormat:@"%1.1f", -0.01];
它会给出结果@"-0.0"
在这种情况下,有人知道如何强制结果@"0.0"
(没有“ - ”)吗?
编辑:
我尝试使用NSNumberFormatter,但它有同样的问题。以下内容还会生成@"-0.0"
:
double value = -0.01;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMaximumFractionDigits:1];
[numberFormatter setMinimumFractionDigits:1];
NSString *result = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:value]];
答案 0 :(得分:5)
我想要一个通用解决方案,与数字格式化程序的配置无关。
我使用了一个类别来为NSNumberFormater添加功能;
@interface NSNumberFormatter (PreventNegativeZero)
- (NSString *)stringFromNumberWithoutNegativeZero:(NSNumber *)number;
@end
实施:
@implementation NSNumberFormatter (PreventNegativeZero)
- (NSString *)stringFromNumberWithoutNegativeZero:(NSNumber *)number
{
NSString *const string = [self stringFromNumber: number];
NSString *const negZeroString = [self stringFromNumber: [NSNumber numberWithFloat: -0.0f]];
if([string isEqualToString: negZeroString])
{
NSString *const posZeroString = [self stringFromNumber: [NSNumber numberWithFloat: 0.0]];
return posZeroString;
}
return string;
}
@end
关键功能是询问数字格式器如何将-0.0f
(即浮点减零)格式化为NSString
,以便我们可以检测到这一点和采取补救措施。
为什么这样?根据格式化程序配置,-0.0f
可以格式化为:@"-0"
,@"-0.0"
,@"-000"
,@"-0ºC"
,@"£-0.00"
,{{1} },@"----0.0"
,@"(0.0)"
真的,非常任何。因此,我们询问格式化工具如何使用以下行格式化@".⓪零"
:-0.0f
使用不需要的NSString *const negZeroString = [self stringFromNumber: [NSNumber numberWithFloat: -0.0f]];
字符串,当格式化任意输入数字时,可以测试它是否与不良-0.0f
字符串匹配。
第二个重要特征是数字格式化器还被要求提供替换正零字符串。这是必要的,以便像以前一样,它的格式是受到尊重的。这是通过以下行完成的:-0.0f
很自然地对输入数字是否将被格式化为[self stringFromNumber: [NSNumber numberWithFloat: 0.0]]
字符串进行数值测试,但这非常不重要(即,一般来说基本上不可能)。这是因为格式化为-0.0f
字符串的数字集取决于格式化程序的配置。如果恰好是四舍五入到最接近的百万,那么作为输入的-0.0f
将被格式化为-5,000f
字符串。
当检测到格式为-0.0f
字符串的输入时,使用-0.0f
生成正零等效输出字符串。请注意,具体来说:
[self stringFromNumber: [NSNumber numberWithFloat: 0.0]]
并返回它。 取消0.0f
的输入会导致格式-0.1f
。根据格式化程序的行为,可以将其向上舍入并生成0.1f
,这是您不想要的。
对于它的价值,这里使用的方法/模式/算法将转换为其他语言和不同的字符串格式化API。
答案 1 :(得分:1)
使用NSNumberFormatter
。通常,NSString
格式不应用于向用户显示数据。
编辑:
如问题所述,这不是正确的答案。有许多解决方案。检查负零是很容易的,因为它被定义为等于任何零(0.0f == -0.0f
),但实际问题是许多其他值可以舍入到负零。我建议后处理 - 一种检查结果是否只包含零位数(跳过其他字符)的函数,而不是捕获这些值。如果是,请删除前导减号。
答案 2 :(得分:0)
NSString *result = [NSString stringWithFormat:@"%1.1f", -0.01*-1];
如果您传递实例而不是值,则可以检查:
float myFloat = -0.01;
NSString *result = [NSString stringWithFormat:@"%1.1f", (myFloat<0? myFloat*-1:myFloat)];
修改强> 如果你只想要0.0作为正值:
NSString *result = [NSString stringWithFormat:@"%1.1f",(int)(myFloat*10)<0?myFloat:myFloat*-1];
答案 3 :(得分:0)
通过获取float或double值将数字转换为NSString。 将字符串转换回NSNumber。
NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:@"-0.00000000008"];
NSString *st2 = [NSString stringWithFormat:@"%0.2f", [num floatValue]];
NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithString:st2]; //returns 0