Skip to content
This repository was archived by the owner on Nov 25, 2019. It is now read-only.

Commit 9d7973e

Browse files
committed
Merge pull request #28 from mgod/master
Fix NSDecimalNumber precision on saving to sqlite
2 parents 29dd852 + 787ce3a commit 9d7973e

File tree

5 files changed

+80
-2
lines changed

5 files changed

+80
-2
lines changed
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#import "Cedar-iOS/SpecHelper.h"
2+
#import "DecimalRecord.h"
3+
#import "ARDatabaseManager.h"
4+
5+
using namespace Cedar::Matchers;
6+
7+
SPEC_BEGIN(NSDecimalNumberSpec)
8+
9+
beforeEach(^{
10+
[[ARDatabaseManager sharedInstance] clearDatabase];
11+
});
12+
afterEach(^{
13+
[[ARDatabaseManager sharedInstance] clearDatabase];
14+
});
15+
16+
describe(@"NSDecimalNumberSpec", ^{
17+
it(@"should return the same NSDecimalNumber value after saving", ^{
18+
DecimalRecord *record = [DecimalRecord newRecord];
19+
NSDecimalNumber *testDecimal = [NSDecimalNumber decimalNumberWithMantissa:1123563 exponent:-3 isNegative:NO];
20+
record.decimal = testDecimal;
21+
[record save];
22+
ARLazyFetcher *fetcher = [DecimalRecord lazyFetcher];
23+
[fetcher where:@"id = %@", record.id, nil];
24+
record = [[fetcher fetchRecords] objectAtIndex:0];
25+
record.decimal should equal(testDecimal);
26+
});
27+
});
28+
29+
SPEC_END

UnitTests/TestSources/DecimalRecord.h

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
// DecimalRecord.h
3+
// iActiveRecord
4+
//
5+
// Created by Marshall Weir on 4/11/13.
6+
//
7+
//
8+
9+
#import <ActiveRecord/ActiveRecord.h>
10+
11+
@interface DecimalRecord : ActiveRecord
12+
13+
@property(nonatomic, retain) NSDecimalNumber *decimal;
14+
15+
@end

UnitTests/TestSources/DecimalRecord.m

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
// DecimalRecord.m
3+
// iActiveRecord
4+
//
5+
// Created by Marshall Weir on 4/11/13.
6+
//
7+
//
8+
9+
#import "DecimalRecord.h"
10+
11+
@implementation DecimalRecord
12+
13+
@dynamic decimal;
14+
15+
@end

iActiveRecord.xcodeproj/project.pbxproj

+10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
25922B6414EC2C2200CBB58A /* NSNumber+sqlRepresentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 254F5EBF14C5E78100AC0D86 /* NSNumber+sqlRepresentation.m */; };
3434
25922B6514EC2C2200CBB58A /* NSString+lowercaseFirst.m in Sources */ = {isa = PBXBuildFile; fileRef = 25998EE614BC1A1D00CA2490 /* NSString+lowercaseFirst.m */; };
3535
25922B6614EC2C2200CBB58A /* NSString+sqlRepresentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 254F5EBB14C5E71C00AC0D86 /* NSString+sqlRepresentation.m */; };
36+
75F56DBA1717003C00A1DF7B /* DecimalRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = 75F56DB91717003C00A1DF7B /* DecimalRecord.m */; };
37+
75F56DBC171700D300A1DF7B /* NSDecimalNumberSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 75F56DBB171700D300A1DF7B /* NSDecimalNumberSpec.mm */; };
3638
CA0365C0151FCB5F004167F1 /* NSString+quotedString.h in Headers */ = {isa = PBXBuildFile; fileRef = CA0365BE151FCB5F004167F1 /* NSString+quotedString.h */; settings = {ATTRIBUTES = (Private, ); }; };
3739
CA0365C2151FCB5F004167F1 /* NSString+quotedString.m in Sources */ = {isa = PBXBuildFile; fileRef = CA0365BF151FCB5F004167F1 /* NSString+quotedString.m */; };
3840
CA0365C3151FCB5F004167F1 /* NSString+quotedString.m in Sources */ = {isa = PBXBuildFile; fileRef = CA0365BF151FCB5F004167F1 /* NSString+quotedString.m */; };
@@ -212,6 +214,9 @@
212214
25998EF914BC1DD400CA2490 /* libsqlite3.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.0.dylib; path = usr/lib/libsqlite3.0.dylib; sourceTree = SDKROOT; };
213215
25A1131F14D9BAAE000720E7 /* ARValidationsHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARValidationsHelper.h; sourceTree = "<group>"; };
214216
25A1132614D9BCF7000720E7 /* ARErrorHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARErrorHelper.h; sourceTree = "<group>"; };
217+
75F56DB81717003C00A1DF7B /* DecimalRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecimalRecord.h; sourceTree = "<group>"; };
218+
75F56DB91717003C00A1DF7B /* DecimalRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DecimalRecord.m; sourceTree = "<group>"; };
219+
75F56DBB171700D300A1DF7B /* NSDecimalNumberSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NSDecimalNumberSpec.mm; sourceTree = "<group>"; };
215220
CA0365BE151FCB5F004167F1 /* NSString+quotedString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+quotedString.h"; sourceTree = "<group>"; };
216221
CA0365BF151FCB5F004167F1 /* NSString+quotedString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+quotedString.m"; sourceTree = "<group>"; };
217222
CA04E8C1166A574100957F54 /* ARDynamicAccessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARDynamicAccessor.h; sourceTree = "<group>"; };
@@ -415,6 +420,7 @@
415420
CA0BAECE15C9AA58008985E6 /* SchemaManagerSpec.mm */,
416421
CA0BAED015C9AACC008985E6 /* IndicesSpec.mm */,
417422
CA91ECCB1715AEC10085A27B /* GCDSpec.mm */,
423+
75F56DBB171700D300A1DF7B /* NSDecimalNumberSpec.mm */,
418424
);
419425
path = Specs;
420426
sourceTree = "<group>";
@@ -512,6 +518,8 @@
512518
CAE92251171495290082A97C /* Animal.m */,
513519
CAE92252171495290082A97C /* AnimalValidator.h */,
514520
CAE92253171495290082A97C /* AnimalValidator.m */,
521+
75F56DB81717003C00A1DF7B /* DecimalRecord.h */,
522+
75F56DB91717003C00A1DF7B /* DecimalRecord.m */,
515523
CAE92258171495290082A97C /* DynamicRecord.h */,
516524
CAE92259171495290082A97C /* DynamicRecord.m */,
517525
CAE9225A171495290082A97C /* Entity.h */,
@@ -1073,6 +1081,8 @@
10731081
CAE92278171495290082A97C /* UserProjectRelationship.m in Sources */,
10741082
CAE9227C171495880082A97C /* ARFactory.m in Sources */,
10751083
CA91ECCC1715AEC10085A27B /* GCDSpec.mm in Sources */,
1084+
75F56DBA1717003C00A1DF7B /* DecimalRecord.m in Sources */,
1085+
75F56DBC171700D300A1DF7B /* NSDecimalNumberSpec.mm in Sources */,
10761086
);
10771087
runOnlyForDeploymentPostprocessing = 0;
10781088
};

iActiveRecord/Classes/NSDecimalNumber+sqlRepresentation.m

+11-2
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,25 @@
1010

1111
@implementation NSDecimalNumber (sqlRepresentation)
1212

13+
+ (NSLocale *)posixLocale {
14+
static NSLocale *posixLocale;
15+
static dispatch_once_t onceToken;
16+
dispatch_once(&onceToken, ^{
17+
posixLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
18+
});
19+
return posixLocale;
20+
}
21+
1322
- (NSString *)toSql {
14-
return [NSString stringWithFormat:@"%f", [self floatValue]];
23+
return [self descriptionWithLocale:[NSDecimalNumber posixLocale]];
1524
}
1625

1726
+ (NSString *)sqlType {
1827
return @"real";
1928
}
2029

2130
+ (id)fromSql:(NSString *)sqlData {
22-
return [NSDecimalNumber decimalNumberWithString:sqlData];
31+
return [NSDecimalNumber decimalNumberWithString:sqlData locale:[NSDecimalNumber posixLocale]];
2332
}
2433

2534
@end

0 commit comments

Comments
 (0)