防止小负数印刷为“-0”
如果我做的Objective-C如下:防止小负数印刷为“-0”
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"。
最后请注意
对于它的价值,这里使用的方法/模式/算法将翻译成其他语言和不同的字符串格式化的API。
回答:
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]; 回答:
使用NSNumberFormatter。通常,不应使用NSString格式将数据呈现给用户。
编辑: 正如问题所述,这不是正确的答案。有很多解决方案。检查负零点很容易,因为它定义为等于任何零(0.0f == -0.0f),但实际问题是其他许多值可以四舍五入至负零。我建议后处理 - 而不是捕捉这些值,它将检查结果是否只包含零数字(跳过其他字符)。如果是,请删除前导减号。
回答:
通过采用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 
以上是 防止小负数印刷为“-0” 的全部内容, 来源链接: utcz.com/qa/258181.html

