|
16 | 16 | #import "NSString+MJExtension.h" |
17 | 17 | #import "NSObject+MJClass.h" |
18 | 18 |
|
| 19 | +@implementation NSDecimalNumber(MJKeyValue) |
| 20 | + |
| 21 | +- (id)standardValueWithTypeCode:(NSString *)typeCode { |
| 22 | + // 由于这里涉及到编译器问题, 暂时保留 Long, 实际上在 64 位系统上, 这 2 个精度范围相同, |
| 23 | + // 32 位略有不同, 其余都可使用 Double 进行强转不丢失精度 |
| 24 | + if ([typeCode isEqualToString:MJPropertyTypeLongLong]) { |
| 25 | + return @(self.longLongValue); |
| 26 | + } else if ([typeCode isEqualToString:MJPropertyTypeLongLong.uppercaseString]) { |
| 27 | + return @(self.unsignedLongLongValue); |
| 28 | + } else if ([typeCode isEqualToString:MJPropertyTypeLong]) { |
| 29 | + return @(self.longValue); |
| 30 | + } else if ([typeCode isEqualToString:MJPropertyTypeLong.uppercaseString]) { |
| 31 | + return @(self.unsignedLongValue); |
| 32 | + } else { |
| 33 | + return @(self.doubleValue); |
| 34 | + } |
| 35 | +} |
| 36 | + |
| 37 | +@end |
| 38 | + |
19 | 39 | @implementation NSObject (MJKeyValue) |
20 | 40 |
|
21 | 41 | #pragma mark - 错误 |
@@ -138,54 +158,53 @@ - (instancetype)mj_setKeyValues:(id)keyValues context:(NSManagedObjectContext *) |
138 | 158 | } else { // 字典数组-->模型数组 |
139 | 159 | value = [objectClass mj_objectArrayWithKeyValuesArray:value context:context]; |
140 | 160 | } |
141 | | - } else { |
142 | | - if (propertyClass == [NSString class]) { |
143 | | - if ([value isKindOfClass:[NSNumber class]]) { |
144 | | - // NSNumber -> NSString |
145 | | - value = [value description]; |
146 | | - } else if ([value isKindOfClass:[NSURL class]]) { |
147 | | - // NSURL -> NSString |
148 | | - value = [value absoluteString]; |
| 161 | + } else if (propertyClass == [NSString class]) { |
| 162 | + if ([value isKindOfClass:[NSNumber class]]) { |
| 163 | + // NSNumber -> NSString |
| 164 | + value = [value description]; |
| 165 | + } else if ([value isKindOfClass:[NSURL class]]) { |
| 166 | + // NSURL -> NSString |
| 167 | + value = [value absoluteString]; |
| 168 | + } |
| 169 | + } else if ([value isKindOfClass:[NSString class]]) { |
| 170 | + if (propertyClass == [NSURL class]) { |
| 171 | + // NSString -> NSURL |
| 172 | + // 字符串转码 |
| 173 | + value = [value mj_url]; |
| 174 | + } else if (type.isNumberType) { |
| 175 | + NSString *oldValue = value; |
| 176 | + |
| 177 | + // NSString -> NSDecimalNumber, 使用 DecimalNumber 来转换数字, 避免丢失精度以及溢出 |
| 178 | + NSDecimalNumber *decimalValue = [NSDecimalNumber decimalNumberWithString:oldValue locale:nil]; |
| 179 | + |
| 180 | + // 检查特殊情况 |
| 181 | + if (decimalValue == NSDecimalNumber.notANumber) { |
| 182 | + value = @(0); |
| 183 | + }else if (propertyClass != [NSDecimalNumber class]) { |
| 184 | + value = [decimalValue standardValueWithTypeCode:type.code]; |
| 185 | + } else { |
| 186 | + value = decimalValue; |
149 | 187 | } |
150 | | - } else if ([value isKindOfClass:[NSString class]]) { |
151 | | - if (propertyClass == [NSURL class]) { |
152 | | - // NSString -> NSURL |
153 | | - // 字符串转码 |
154 | | - value = [value mj_url]; |
155 | | - } else if (type.isNumberType) { |
156 | | - NSString *oldValue = value; |
157 | | - |
158 | | - // NSString -> NSNumber |
159 | | - if (type.typeClass == [NSDecimalNumber class]) { |
160 | | - value = [NSDecimalNumber decimalNumberWithString:oldValue]; |
161 | | - } else { |
162 | | - NSDecimalNumber *decimalValue = [NSDecimalNumber decimalNumberWithString:oldValue]; |
163 | | - value = decimalValue == [NSDecimalNumber notANumber] ? @(0) : @(decimalValue.doubleValue); |
164 | | - } |
165 | | - |
166 | | - // 如果是BOOL |
167 | | - if (type.isBoolType) { |
168 | | - // 字符串转BOOL(字符串没有charValue方法) |
169 | | - // 系统会调用字符串的charValue转为BOOL类型 |
170 | | - NSString *lower = [oldValue lowercaseString]; |
171 | | - if ([lower isEqualToString:@"yes"] || [lower isEqualToString:@"true"]) { |
172 | | - value = @YES; |
173 | | - } else if ([lower isEqualToString:@"no"] || [lower isEqualToString:@"false"]) { |
174 | | - value = @NO; |
175 | | - } |
| 188 | + |
| 189 | + // 如果是BOOL |
| 190 | + if (type.isBoolType) { |
| 191 | + // 字符串转BOOL(字符串没有charValue方法) |
| 192 | + // 系统会调用字符串的charValue转为BOOL类型 |
| 193 | + NSString *lower = [oldValue lowercaseString]; |
| 194 | + if ([lower isEqualToString:@"yes"] || [lower isEqualToString:@"true"]) { |
| 195 | + value = @YES; |
| 196 | + } else if ([lower isEqualToString:@"no"] || [lower isEqualToString:@"false"]) { |
| 197 | + value = @NO; |
176 | 198 | } |
177 | 199 | } |
178 | | - } else if ([value isKindOfClass:[NSNumber class]] && propertyClass == [NSDecimalNumber class]){ |
179 | | - // 过滤 NSDecimalNumber类型 |
180 | | - if (![value isKindOfClass:[NSDecimalNumber class]]) { |
181 | | - value = [NSDecimalNumber decimalNumberWithDecimal:[((NSNumber *)value) decimalValue]]; |
182 | | - } |
183 | 200 | } |
184 | | - |
185 | | - // value和property类型不匹配 |
186 | | - if (propertyClass && ![value isKindOfClass:propertyClass]) { |
187 | | - value = nil; |
| 201 | + } else if ([value isKindOfClass:[NSNumber class]] && propertyClass == [NSDecimalNumber class]){ |
| 202 | + // 过滤 NSDecimalNumber类型 |
| 203 | + if (![value isKindOfClass:[NSDecimalNumber class]]) { |
| 204 | + value = [NSDecimalNumber decimalNumberWithDecimal:[((NSNumber *)value) decimalValue]]; |
188 | 205 | } |
| 206 | + } else if (propertyClass && ![value isKindOfClass:propertyClass]) { // value和property类型不匹配 |
| 207 | + value = nil; |
189 | 208 | } |
190 | 209 |
|
191 | 210 | // 3.赋值 |
|
0 commit comments