【问题标题】:CFNumberFormatterCreateStringWithNumber int issueCFNumberFormatterCreateStringWithNumber int 问题
【发布时间】:2017-03-06 02:49:59
【问题描述】:

我发现CFNumberFormatterCreateStringWithNumber 存在问题。我用this Apple code example:

// 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

【问题讨论】:

    标签: c macos core-foundation cftypes


    【解决方案1】:

    您的代码在经验上对我有用。我只需要做一些外观上的改变:

    #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
    

    【讨论】:

      【解决方案2】:

      事实证明这不起作用,因为我是从 C++ 代码(.cpp 扩展名)编译和运行的,当我将文件的扩展名切换为 .mm(Objective-C++)时它确实有效

      【讨论】:

        猜你喜欢
        • 2018-01-13
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 2013-09-11
        • 1970-01-01
        • 2017-06-01
        • 2011-08-24
        • 1970-01-01
        相关资源
        最近更新 更多