【问题标题】:Convert NSString to NSNumber gives different value将 NSString 转换为 NSNumber 给出不同的值
【发布时间】:2014-06-11 02:55:25
【问题描述】:

我正在尝试将NSString 转换为NSNumber,但我得到的值与我的预期不同。

for(ClassA *item in appD.classArray)
{
    NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; // Method A
    [f setNumberStyle:NSNumberFormatterDecimalStyle];
    item.number = [f numberFromString:stringA];

    item.number = [[NSDecimalNumber alloc]initWithString:stringA]; // Method B

    item.number = @([stringA intValue]); // Method C

    item.number = [NSNumber numberWithUnsignedInt:[stringA integerValue]]; // Method D
    NSLog(@"string A %@",stringA);
    NSLog(@"item.number %@",item.number);
    [ClassA updateClassInfo:item];
}

控制台输出为:

string A 111775
item.number -19297

使用不同的方法产生相同的结果。转换后的字符串将变为负数。

编辑

P/S:我的应用程序中的字符串 A 每次运行时都会随着值的增加而增加。

NSNumber *number = [NSNumber new];
NSLog(@"stringA %@",stringA);

item.number = [NSNumber new];

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
number = [f numberFromString:stringA];
NSLog(@"number %@",number);
item.number = number;
NSLog(@"item.number %@",item.number);

number = [[NSDecimalNumber alloc]initWithString:stringA];
NSLog(@"number %@",number);
item.number = number;
NSLog(@"item.number %@",item.number);

number = @([stringA intValue]);
NSLog(@"number %@",number);
item.number = number;
NSLog(@"item.number %@",item.number);

number = [NSNumber numberWithInteger:[stringA integerValue]];
NSLog(@"number %@",number);
item.number = number;
NSLog(@"item.number %@",item.number);

控制台输出为:

2014-06-11 18:06:31.262 App[751:907] stringA 111796
2014-06-11 18:06:31.266 App[751:907] number 111796
2014-06-11 18:06:31.269 App[751:907] item.number -19276
2014-06-11 18:06:31.271 App[751:907] number 111796
2014-06-11 18:06:31.274 App[751:907] item.number -19276
2014-06-11 18:06:31.276 App[751:907] number 111796
2014-06-11 18:06:31.278 App[751:907] item.number -19276
2014-06-11 18:06:31.280 App[751:907] number 111796
2014-06-11 18:06:31.287 App[751:907] item.number -19276

【问题讨论】:

  • 您的问题是什么?当我运行此代码时,我得到一个 NSNumber(或在方法 B 的情况下为 NSDecimalNumber),您的所有四个方法(在 OS X 和 iOS 上)都返回值 111775。
  • 我正在尝试将字符串转换为数字,但它给了我负值。不知道为什么。
  • 因为您使用 %d 而不是 %@ 来格式化 NSNumber 并且您看到的是指针值?
  • %d????哪个表示是 %d?
  • 我已经使用了你的代码,我得到了预期的输出:2014-06-11 11:11:32.192 SampleApp[5404:70b] string A 111775 2014-06-11 11:11:32.194 SampleApp [5404:70b] 转换后的字符串 111775

标签: objective-c nsstring nsnumber valueconverter


【解决方案1】:

如果我理解正确,您的 item.number 属性是托管属性,位于 Core Data 托管对象中。

请注意,每个 Core Data 属性都有一个类型:

例如,如果您的属性类型是Integer 16,您的属性设置器会将数字包装为 16 位。我想这就是这里发生的事情。

解决方案:将您的属性类型设置为足够大以保存您的值,例如Integer32.

【讨论】:

  • 感谢它在更改为 Integer32 后有效。抱歉让大家感到困惑。我是 ios 开发的初学者。。
【解决方案2】:

您确定 item.number 属性是 NSNumber 吗?

此代码有效:

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    @autoreleasepool {

            NSString *stringA = @"111775";
            NSNumber *number;

            NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; // Method A
            [f setNumberStyle:NSNumberFormatterDecimalStyle];
            number = [f numberFromString:stringA];
            NSLog(@"string A %@",stringA);
            NSLog(@"number %@", number);

            number = [[NSDecimalNumber alloc] initWithString:stringA]; // Method B
            NSLog(@"string A %@",stringA);
            NSLog(@"number %@", number);

            number = @([stringA intValue]); // Method C
            NSLog(@"string A %@",stringA);
            NSLog(@"number %@", number);

            number = [NSNumber numberWithInteger:[stringA integerValue]]; // Method D CHANGED, because unsigned int is not equal to integer
            NSLog(@"string A %@",stringA);
            NSLog(@"number %@", number);
    }
}

输出:

2014-06-11 10:33:48.587 无标题[573:507] 字符串 A 111775

2014-06-11 10:33:48.588 无标题[573:507] 编号 111775

2014-06-11 10:33:48.588 无标题[573:507] 字符串 A 111775

2014-06-11 10:33:48.588 无标题[573:507] 编号 111775

2014-06-11 10:33:48.589 无标题[573:507] 字符串 A 111775

2014-06-11 10:33:48.589 无标题[573:507] 编号 111775

2014-06-11 10:33:48.590 无标题[573:507] 字符串 A 111775

2014-06-11 10:33:48.590 无标题[573:507] 编号 111775


如您所愿,使用类和属性进行相同的测试具有相同的正确输出

类.h

#import <Foundation/Foundation.h>

@interface ClassWithNumber : NSObject

@property (nonatomic, retain) NSNumber *item;

@end

类.m

#import "ClassWithNumber.h"

@implementation ClassWithNumber

@end

主要

#import <Foundation/Foundation.h>
#import "ClassWithNumber.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSString *stringA = @"111775";
        ClassWithNumber *numberClass = [ClassWithNumber new];

        NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; // Method A
        [f setNumberStyle:NSNumberFormatterDecimalStyle];
        numberClass.item = [f numberFromString:stringA];
        NSLog(@"string A %@",stringA);
        NSLog(@"number %@", numberClass.item);

        numberClass.item = [[NSDecimalNumber alloc] initWithString:stringA]; // Method B
        NSLog(@"string A %@",stringA);
        NSLog(@"number %@", numberClass.item);

        numberClass.item = @([stringA intValue]); // Method C
        NSLog(@"string A %@",stringA);
        NSLog(@"number %@", numberClass.item);

        numberClass.item = [NSNumber numberWithInteger:[stringA integerValue]]; // Method D
        NSLog(@"string A %@",stringA);
        NSLog(@"number %@", numberClass.item);

    }
    return 0;
}

【讨论】:

  • 我的号码是@property (nonatomic, retain) NSNumber * number 类型;在我的数据库中
  • 好吧,说清楚我把输出放在任何地方,每一种方式都一样且正确。
  • 更改了方法 D,它适用于示例但不正确。
  • 如果属性设置正确,则不会发生任何变化。对不起,命名不喜欢你。
  • 转换后的值是正确的,但保存它会给出不同的值
猜你喜欢
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2011-04-27
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多