防止小负数打印为“-0”

时间:2012-06-10 14:15:17

标签: objective-c nsstring nsnumber zero nsnumberformatter

如果我在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]];

4 个答案:

答案 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