繁体   English   中英

从NSString对象返回的浮点值不是我期望的值,如何正确从NSString中提取浮点值?

[英]Returned float value from NSString object is not what I expected, how do I correct extract a float from an NSString?

在购物车上进行的工作,总计商品的总价。

我有此字符串£4.44存储在核心数据中。

我使用以下代码从字符串中提取数字:

+ (float)totalPriceOfItems:(NSManagedObjectContext *)managedObjectContext
{
    NSError *error = nil;
    float totalPrice = 0;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"BagItem"];

    // Get fetched objects and store in NSArray
    NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

    for (BagItem *bagItem in fetchedObjects) {
        NSString *price = [[[bagItem price] componentsSeparatedByCharactersInSet:
                            [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
                           componentsJoinedByString:@""];
        totalPrice = totalPrice + [price floatValue];

        NSLog(@"total: %f", totalPrice);
    }

    return totalPrice;
}

我取回这个值444.000000

当我的意图是回到4.44时

我很明显在这里遗漏了一些东西,也许将每个项目的价格存储为整数会更好,但是现在我想使事情以这种方式工作。

谢谢你的时间

问题可能出在您的解析代码上

[[[bagItem price] componentsSeparatedByCharactersInSet:
                        [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
                       componentsJoinedByString:@""]

您要做的是将不是数字的每个字符上的字符串分开,然后将其放回原处。 因此,将字符串4.44拆分为小数点,然后放回到444处。我的建议是以不需使用某些解析代码就可以存储价格的方式存储价格-您应该存储它如4.44。

现在到下一个问题-浮动。 浮动和双打没有财务应用所需的精度。 在某个时候,您要将10.99和0.01加在一起,发现答案不是11.0,而是11.000000000001或类似的东西。 对于这些类型的情况,您应该将数字存储为NSDecimalNumber,并使用该类提供的函数进行计算。

您可以将字符串转换为NSDecimalNumber,如下所示:

[NSDecimalNumber decimalNumberWithString:@"44.50"];

通过使用NSDecimal数字,这也使您可以使用NSNumberFormatter将数字格式化为货币(如果要显示它)

[NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterCurrencyStyle];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM