CFNumberFormatterCreateStringWithNumber int issue

问题描述:

我在CFNumberFormatterCreateStringWithNumber看到一个问题。我用this Apple code exampleCFNumberFormatterCreateStringWithNumber int issue

// Works fine with float: 
float n = 1.20; 
CFNumberRef value = CFNumberCreate(NULL, kCFNumberFloatType, &n); 
CFLocaleRef currentLocale = CFLocaleCopyCurrent(); 
// Create different number formatters 
CFNumberFormatterRef decimalFormatter = CFNumberFormatterCreate(NULL, currentLocale, kCFNumberFormatterDecimalStyle); 
CFStringRef decimalString = CFNumberFormatterCreateStringWithNumber(NULL, decimalFormatter, value); 

// Using an INT I see an issue 
int n = 892385; 
CFNumberRef value = CFNumberCreate(NULL, kCFNumberSInt32Type, &n); 
CFLocaleRef currentLocale = CFLocaleCopyCurrent(); 
// Create different number formatters 
CFNumberFormatterRef decimalFormatter = CFNumberFormatterCreate(NULL, currentLocale, kCFNumberFormatterDecimalStyle); 
CFStringRef decimalString = CFNumberFormatterCreateStringWithNumber(NULL, decimalFormatter, value); 
/// release, release, release 

我用一个int值(而不是浮动)时看到的错误是:

<CFNumber 0x5ac27 [0x7fff9856ed80]>{value = +1452, type = kCFNumberSInt32Type} 
2017-03-05 21:42:06.789577 HID_Dumper[4390:150864] -[__NSCFNumber _getCString:length:multiplier:]: unrecognized selector sent to instance 0x2e4027 

您的代码在那里经验为我工作。我只需要一对夫妇的化妆品的变化:

#import <CoreFoundation/CoreFoundation.h> 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     // insert code here... 
     NSLog(@"Hello, World!"); 

     // Works fine with float: 
     float n = 1.20; 
     CFNumberRef value = CFNumberCreate(NULL, kCFNumberFloatType, &n); 
     CFLocaleRef currentLocale = CFLocaleCopyCurrent(); 
     // Create different number formatters 
     CFNumberFormatterRef decimalFormatter = CFNumberFormatterCreate(NULL, currentLocale, kCFNumberFormatterDecimalStyle); 
     CFStringRef decimalString = CFNumberFormatterCreateStringWithNumber(NULL, decimalFormatter, value); 
     NSLog(@"float is %@", (__bridge NSString *)decimalString); 
     CFRelease(decimalFormatter); 
     CFRelease(decimalString); 

     // Using an INT I see an issue 
     SInt32 duh = 892385; 
     value = CFNumberCreate(NULL, kCFNumberSInt32Type, &duh); 
     currentLocale = CFLocaleCopyCurrent(); 
     // this is the exact same formatter as up there... 
     decimalFormatter = CFNumberFormatterCreate(NULL, currentLocale, kCFNumberFormatterDecimalStyle); 
     decimalString = CFNumberFormatterCreateStringWithNumber(NULL, decimalFormatter, value); 

     NSLog(@"integer is %@", (__bridge NSString *)decimalString); 
     /// release, release, release 
     CFRelease(decimalFormatter); 
     CFRelease(decimalString); 
    } 
    return 0; 
} 

导致的输出:

2017-03-05 22:31:49.502 Testing[3278:221264] Hello, World! 
2017-03-05 22:31:49.510 Testing[3278:221264] float is 1.2 
2017-03-05 22:31:49.511 Testing[3278:221264] integer is 892,385 
Program ended with exit code: 0 

事实证明,这并没有工作,因为我是在编译和C++代码运行( .cpp扩展名),当我将文件的扩展名切换为.mm(Objective-C++)时,它可以工作