【问题标题】:Detect fraction using NSScanner in Objective-C在 Objective-C 中使用 NSScanner 检测分数
【发布时间】:2019-04-04 19:41:47
【问题描述】:

我在可以包含数字或分数的文本框中收到一些用户输入。

对于大多数数字,以下方法可以找到整数。但是,如果你给它 1/2,它会返回 1 并抛出 / 和 2

我需要做什么才能让它识别 1/2 并返回 .5

感谢您的任何建议:

-(float) getFloatPartOfString:(NSString*) numstr {
    numstr = @"1/2";
    NSScanner *scanner = [NSScanner scannerWithString:numstr];
    NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
    NSString* numberString;

    // Throw away characters before the first number.
    [scanner scanUpToCharactersFromSet:numbers intoString:NULL];

    // Collect numbers.
    [scanner scanCharactersFromSet:numbers intoString:&numberString];
    float number = numberString.floatValue;
    NSLog(@"1/2 turns into:%f",number);
    return number;
}

【问题讨论】:

  • 您是否考虑过使用正则表达式解析输入?类似(\d+)\/(\d+)
  • 或者扫描一个数字,一个/和一个数字。
  • Vadim,您能推荐一种使用正则表达式进行解析的经济方法吗?
  • 只需将 textedit 设置为仅接受数字和点。问题解决了。

标签: objective-c fractions nsscanner


【解决方案1】:

由于您需要将分数转换为小数,我将扫描这两个数字和/,然后您可以对这两个数字进行数学运算。

- (float)getFloatPartOfString:(NSString *)numstr {
    NSScanner *scanner = [NSScanner scannerWithString:numstr];
    int numerator = 0;
    int denominator = 0;

    float number = 0;
    if ([scanner scanInt:&numerator]) && [scanner scanString:@"/" intoString:nil] && [scanner scanInt:&denominator] {
        number = (float)numerator / (float)denominator;
    } else {
        NSLog(@"Didn't find integer / integer");
    }

    NSLog(@"%@ turns into %f", numstr, number);

    return number;
}

注意 - 以上内容未经测试,因此可能存在错误。如有错误,请随时编辑。

【讨论】:

  • 这行得通。测试分数后,可以测试常规浮点数。
猜你喜欢
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2017-10-13
相关资源
最近更新 更多