从 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 中删除负号 (-) 给我一个错误的主要内容,如果未能解决你的问题,请参考以下文章
从 `NSDecimal` 或 `NSDecimalNumber` 转换为 C# 的 `decimal` 类型
NSDecimalNumber 和大的无符号长长(64 位)整数