gpt4 book ai didi

objective-c - 防止小负数打印为 "-0"

转载 作者:太空狗 更新时间:2023-10-30 04:02:20 26 4
gpt4 key购买 nike

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

最佳答案

我想要一个通用的解决方案,独立于数字格式化程序的配置。

我使用了一个类别来为 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", @"----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。根据格式化程序的行为,这可能会被四舍五入并导致 @"1,000",这是您不想要的。

最后的笔记

就其值(value)而言,此处使用的方法/模式/算法将转化为其他语言和不同的字符串格式化 API。

关于objective-c - 防止小负数打印为 "-0",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10969399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com