【问题标题】:Remove negative symbol (-) from NSDecimalNumber gives me an error从 NSDecimalNumber 中删除负号 (-) 给我一个错误
【发布时间】: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 的时候。好人。

标签: ios objective-c nsdecimalnumber


【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-18
          • 2012-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-01
          • 2022-07-06
          • 1970-01-01
          相关资源
          最近更新 更多