【问题标题】:NSNumberFormatter conversion remove the decimal for small valuesNSNumberFormatter 转换删除小值的小数
【发布时间】:2013-02-28 15:39:18
【问题描述】:

我们的质量保证团队会发现缺陷。当他们在货币字段中写入0.095 或0,095 时,NSNumberFormatter 会将内容转换为95。

这是我们正在使用的代码:

+ (NSNumber *) getNumberWithDecimalFromString:(NSString*) theSource
{
    if ([TSCommons isEmpty:theSource])
        return [[NSNumber alloc] initWithInt:0];

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    if ([theSource rangeOfString:@","].location != NSNotFound) {
        [formatter setDecimalSeparator:@","];
        [formatter setCurrencyDecimalSeparator:@"."];
    } else if ([theSource rangeOfString:@"."].location != NSNotFound) {
        [formatter setDecimalSeparator:@"."];
        [formatter setCurrencyDecimalSeparator:@"."];
    }
    NSNumber *tmp = [formatter numberFromString:theSource];

    [formatter release];
    return [tmp retain];
}

语言环境是es_ES

对这种意外行为有任何想法吗?

为了介绍更多关于这个问题的信息,因为上次XCode更新后又回来我准备了一个测试

- (void) testNumberFormatter
{
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,1"] doubleValue]);
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,12342"] doubleValue]);
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,12"] floatValue]);
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,123"] floatValue]);
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,1234"] floatValue]);
    NSLog(@"%f",[[TSCommons getNumberWithDecimalFromString:@"41,1234234"] doubleValue]);
}

控制台上的结果如下:

41.100000

41.123420

41.119999

41123.000000

41.123402

41.123423

谢谢!!

【问题讨论】:

  • 在使用 [formatter numberFromString:theSource] 之前是否检查过 theSource 的字符串值?你如何输出NSNumber?在家试过,效果很好。
  • 如果我将 doubleValue 或 floatValue 应用于 NSNumber,结果为 95。如果我调试 NSNumber 描述为 long(95)

标签: objective-c cocoa nsnumberformatter


【解决方案1】:
 NSString* theSource = @"0.095";
        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

        if ([theSource rangeOfString:@","].location != NSNotFound) {
            [formatter setDecimalSeparator:@","];
            [formatter setCurrencyDecimalSeparator:@"."];
        } else if ([theSource rangeOfString:@"."].location != NSNotFound) {
            [formatter setDecimalSeparator:@"."];
            [formatter setCurrencyDecimalSeparator:@"."];
        }
        NSNumber *tmp = [formatter numberFromString:theSource];
        NSLog(@"get Number %@ - %lf %lf", tmp, [theSource doubleValue], [tmp floatValue]);

// 输出得到数字 0.095 - 0.095000 0.095000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多