从 NSDecimalNumber 中删除负号 (-) 给我一个错误

Posted

技术标签:

【中文标题】从 NSDecimalNumber 中删除负号 (-) 给我一个错误【英文标题】:Remove negative symbol (-) from NSDecimalNumber gives me an error 【发布时间】:2015-05-29 04:55:22 【问题描述】:

我有一个array,里面有NSDecimalNumbers。我将检查该数字是否为负数。如果是,我想删除负号 (-)。这是我的代码:

NSString *amount = [myArray objectAtInde:2]; // Is a NSDecimalNumber with value of: -397.67

    if ([amount doubleValue] < 0) 
        amount = [amount stringByReplacingOccurrencesOfString:@"-" withString:@"- $"];
    

当我这样做时,我收到以下错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSDecimalNumber stringByReplacingOccurrencesOfString:withString:]: unrecognized selector sent to instance 0x7fcaf94eff80'

【问题讨论】:

如果你的数组有 NSDecimalNumbers,你为什么要把它分配给一个 NSString? @rmaddy 我正在尝试删除“-”符号。我真正想要的是将amount 分配给label,然后如果值为负,我希望label 显示如下:- $397.67 而不是`$ -397.67。明白我在说什么? 然后使用NSNumberFormatter 设置货币样式。然后货币值将根据用户的语言环境正确格式化。不要自己格式化。这对大多数用户来说都是错误的。 @rmaddy 是对的。您不应该尝试像这样格式化数字。使用NSNumberFormatter。至于你的崩溃,日志说明了一切。您正在从NSString 调用NSDecimalNumber 的方法。显然它会崩溃。 PS。 rmaddy,我来晚了,但恭喜你突破了 100k 代表。我记得你大约 20k 的时候。好人。 【参考方案1】:

在源文件中添加以下方法

    // multiplies number with -1 if it is less than zero else returns the same 
    - (NSDecimalNumber *)abs:(NSDecimalNumber *)num 
    
        if ([num compare:[NSDecimalNumber zero]] == NSOrderedAscending) 
        
            // Number is negative. Multiply by -1
            NSDecimalNumber * negativeOne = [NSDecimalNumber decimalNumberWithMantissa:1
                                                                              exponent:0
                                                                            isNegative:YES];
            return [num decimalNumberByMultiplyingBy:negativeOne];
         
        else 
        
            return num;
        
    

并将NSDecimalNumbers 的实例转换为abs 值而不进行任何类型转换-

NSDecimalNumbers *number = [myArray objectAtInde:2];

number = [number abs:number];

返回的number 将包含abs 格式的abs 值。

【讨论】:

【参考方案2】:

试试这个,

NSDecimalNumber *amountNumber = [myArray objectAtIndex:2]; // Is a NSDecimalNumber with value of: -397.67

NSString *stringWithDollarSymbol = [self addDollarSymoblForNumber:amountNumber];

您可以将stringWithDollarSymbol 分配给标签

- (NSString *)addDollarSymoblForNumber:(NSDecimalNumber *)decimalNum

    NSString *modifiedString = @"";
    if (decimalNum) 
        NSString *numberInStringForm = [decimalNum stringValue];
            if ([decimalNum doubleValue] < 0)  //adds dollor symbol for negative numbers
            modifiedString = [numberInStringForm stringByReplacingOccurrencesOfString:@"-" withString:@"- $"];
        
        else //adds dollor symbol for positive numbers
        
            modifiedString = [NSString stringWithFormat:@"$ %@",modifiedString];
        
    
    return modifiedString;

编辑

使用NSNumberFormatter 的更好方法:

- (NSString *)formatNumberBasedOnCurrentLocale:(NSDecimalNumber *)number

    NSNumberFormatter *formatter = [[NSNumberFormatter  alloc] init];
    [formatter setLocale:[NSLocale currentLocale]];
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    NSString *result = [formatter stringFromNumber:number];
    if (result.length >0) 
        return result;
    
    return nil;

【讨论】:

最好使用NSNumberFormatter 设置进行货币格式化。然后该值将根据用户的语言环境进行格式化。【参考方案3】:

请加行,

if ([amount doubleValue] < 0) 
    amount=[NSString stringWithFormat:@"%@",[myArray objectAtIndex:2]];//add line
    amount = [amount stringByReplacingOccurrencesOfString:@"-" withString:@""];

它可能对你有用,

【讨论】:

【参考方案4】:

我刚刚使用了您的代码,它在我的最后工作正常。

试过下面的东西,

NSString *amount = @"-397.67";//[myArray objectAtInde:2]; // Is a NSDecimalNumber with value of: -397.67

    if ([amount doubleValue] < 0) 
        amount = [amount stringByReplacingOccurrencesOfString:@"-" withString:@""];
    

在你的最后尝试一下。

如果没有任何效果,则将负浮点值乘以 -1,您将得到正数。如果这是您的要求。

【讨论】:

【参考方案5】:

您的[myArray objectAtInde:2]NSDecimalNumber 而不是NSString,试试这个:

NSDecimalNumber *amountNumber = [myArray objectAtInde:2];
NSString *amount = [NSString stringWithFormat:@"%@", amountNumber];

【讨论】:

目标是获取绝对值,而不是转成字符串。 @rmaddy 你是对的,不过,我不知道他的目标【参考方案6】:

也许你应该试试这个:

NSString *amount = @(ABS([myArray[2] doubleValue])).stringValue ; // Is a NSDecimalNumber with value of: -397.67

【讨论】:

ABS 替换为abs。案件很重要。 @rmaddy,你说得对,情况很重要,但 abs 仅适用于 int! 是的,我的错。 fabs 代表double【参考方案7】:

如果您的意图是从负面中拯救出来,那么只需将值转换为绝对值即可。

NSString *amount = [myArray objectAtIndex:2]; // Is a NSDecimalNumber with value of: -397.67

NSLog(@"The value is : %@",[NSString stringWithFormat:@"%.2f", fabs([amount doubleValue])]);

值为:397.67

【讨论】:

以上是关于从 NSDecimalNumber 中删除负号 (-) 给我一个错误的主要内容,如果未能解决你的问题,请参考以下文章

NSDecimalNumber 问题

从 `NSDecimal` 或 `NSDecimalNumber` 转换为 C# 的 `decimal` 类型

NSDecimalNumber 和从末尾弹出数字

NSDecimalNumber 和大的无符号长长(64 位)整数

NSDecimalNumber 四舍五入在 iOS 11 中不起作用

使用 numberFromString 生成 NSDecimalNumber 时如何在没有分数错误的情况下获得舍入值?