我需要创建一些NSDecimalNumber对象作为我的应用程序的一部分(因为我需要它们提供的计算精度)但我注意到在计算中它们返回NSDecimalNumber对象,这些对象可能是自动释放的.
我的问题是,在iPhone应用程序中我是否可能会进行大量计算,这是否存在潜在问题.
问题不仅仅与NSDecimalNumber有关,而是与开发iPhone应用程序时有时不可避免地创建自动释放的对象有关.
我们将非常感激地收到关于这一点的任何详细答案.
我有一个UILabel有一个格式化的字符串(格式化为货币),所以有一个美元符号,$ 21.34.
在核心数据实体中,属性是double类型,我使用NSDecimalNumber来保存到数据库.
self.purchase.name = self.nameTextField.text;
NSString *string = self.amountLabel.text
NSDecimalNumber *newAmount = [[NSDecimalNumber alloc] initWithString:string];
NSLog(@"%@", string); // THIS RETURNS NaN, because of dollar sign i think
NSManagedObjectContext *context = self.purchase.managedObjectContext;
NSError *error = nil;
if (![context save:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
Run Code Online (Sandbox Code Playgroud)
无论如何,我需要这不是NaN,所以我的想法是删除美元符号,但我不知道该怎么做,或者也许有更好的方法来实现我的目标.
对于NSDecimalNumber类型,ceilf和floorf是否有等效的方法?我似乎找不到任何东西.
首先,我正在使用NSDecimalNumbers,因为我正在处理货币.我对十进制数字本身没有任何问题,我想知道是否可以同时乘以3个NSDecimalNumber(s).
换句话说,如果我乘以3个整数,我会简单地说:
int a = 2;
int b = 5;
int c = 7;
int x = a * b * c;
Run Code Online (Sandbox Code Playgroud)
但是,为了乘以NSDecimalNumbers,您必须使用该decimalNumberByMultiplyingBy 方法.
使用这种方法,我必须进行2次计算才能乘以我正在处理的3个NSDecimalNumbers,如下所示:
NSDecimalNumber *d1 = [NSDecimalNumber decimalNumberWithString:@"1.502"];
NSDecimalNumber *d2 = [NSDecimalNumber decimalNumberWithString:@"12.472"];
NSDecimalNumber *d3 = [NSDecimalNumber decimalNumberWithString:@"0.765"];
//Calculation
NSDecimalNumber *initialValue = [d1 decimalNumberByMultiplyingBy:d2];
NSDecimalNumber *finalValue = [initialValue decimalNumberByMultiplyingBy:d3];
//Formatting
NSString *output = [NSString stringWithFormat:@"%@", finalValue];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:output];
//r is my NSNumberFormatter, which I've configured elsewhere
NSString *s = [r stringFromNumber:n];
NSLog(@"%@",s);
Run Code Online (Sandbox Code Playgroud)
有没有办法同时将所有3个NSDecimalNumbers乘以而不是这种笨重的方式呢?
在我的核心数据模型中,"金额"是实体"跟踪"中的属性.如何在整个代码中将金额转换为NSDecimalNumber?我相信有经验的人可以在3分钟内做到这一点,我已经看了好几天了.
- (IBAction)save {
if (![amount.text isEqualToString:@""]) {
Tracking *tracking = [NSEntityDescription insertNewObjectForEntityForName:@"Tracking"
inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *weightEntity = [NSEntityDescription entityForName:@"Tracking" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:weightEntity];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSError *error = nil;
NSArray *result = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
Tracking *person = [result objectAtIndex:0];
NSLog(@"%@",person.date);
NSDate *date = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
[dateFormat setDateFormat:@"MMM dd, yyyy"];
NSString *dateString = [dateFormat stringFromDate:date];
//NSString *dateString = @"Jan 13 2013";
//Tracking *track …Run Code Online (Sandbox Code Playgroud) 我有NSMutableArray一些其中有一些NSDecimalNumber,比如(500,50.80,70,8000)
现在我想把所有这些加decimal numbers在一起.
我试过用
for (NSDecimalNumber *number in self.numbersArray)
{
NSDecimal *sum += [number decimalValue]
}
Run Code Online (Sandbox Code Playgroud)
但失败了.
我使用此代码获取md5字符串哈希
- (NSString *) md5:(NSString *) input
{
const char *cStr = [input UTF8String];
unsigned char digest[16];
CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,它完美无缺
[self md5:@"mystring"];
Run Code Online (Sandbox Code Playgroud)
但是当我这样做的时候
[self md5:userId];
Run Code Online (Sandbox Code Playgroud)
我有一个错误
因未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [NSDecimalNumber UTF8String]:无法识别的选择器发送到实例0x61a7080'
userId是一个NSString
NSString *userId; @property(retain,nonatomic) NSString *userId;
Run Code Online (Sandbox Code Playgroud)
但它会影响facebook的用户ID,就像我尝试过的"3309843"
[self md5:[userId stringValue]]];
Run Code Online (Sandbox Code Playgroud)
我仍然有同样的错误
更新 我试过这个
[self md5:@"980232376"];
Run Code Online (Sandbox Code Playgroud)
仍然有相同的错误,我认为问题是方法md5.我不能得到一串数字的md5?
objective-c ×5
iphone ×3
cocoa-touch ×2
ios ×2
xcode ×2
autorelease ×1
cocoa ×1
core-data ×1
formatting ×1
md5 ×1
memory ×1
nsarray ×1
nsstring ×1