【问题标题】:Add 1 to a number in an NSString that contains characters Objective-C将 1 添加到 NSString 中包含字符的数字 Objective-C
【发布时间】:2020-07-11 04:19:35
【问题描述】:

我刚开始学习 Objective-C(我的第一门编程语言!),并尝试编写一个小程序,将 1 加到包含在字符串中的数字上。例如。 AA1BB 变为 AA2BB。 .

到目前为止,我已经尝试提取数字并加 1。然后提取字母并将所有内容重新添加到一个新字符串中。我已经取得了一些成功,但无法恢复到初始字符串的原始排列。

到目前为止,我的代码给出了 2BB 的结果,并忽略了数字之前的字符,这不是我想要的(我在这个例子中尝试的结果是 AA2BB)。我不知道为什么!

NSString* aString = @"AA1BB";

NSCharacterSet *numberCharset = [NSCharacterSet characterSetWithCharactersInString:@"0123456789-"]; //Creating a set of Characters object//

NSScanner *theScanner = [NSScanner scannerWithString:aString];

int someNumbers = 0;

while (![theScanner isAtEnd]) {
  // Remove Letters
  [theScanner scanUpToCharactersFromSet:numberCharset
                             intoString:NULL]; 
  if ([theScanner scanInt:&someNumbers]) {}
}

NSCharacterSet *letterCharset = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZ"];

NSScanner *letterScanner = [NSScanner scannerWithString:aString];

NSString* someLetters;
while (![letterScanner isAtEnd]) {
     // Remove numbers
     [letterScanner scanUpToCharactersFromSet:letterCharset
                                intoString:NULL];

   if ([letterScanner scanCharactersFromSet:letterCharset intoString:&someLetters]) {}
}

++someNumbers; //adds +1 to the Number//


NSString *newString = [[NSString alloc]initWithFormat:@"%i%@", someNumbers, someLetters]; 

NSLog (@"String is now %@", newString);

【问题讨论】:

  • 为什么不将组件部分放在一个类中,每个组件都将易于操作,并提供转换为NSString*的方法?
  • 感谢@trojanfoe,这是个好主意!我仍处于学习阶段,因此必须研究如何做到这一点。也许我想在我能走路之前跑!
  • 不一定。学习编程语言是一回事,但学习解决问题的最佳方法是另一回事。您需要学习的一件事是使用正确的数据类型来表示您的数据。在这种特殊情况下,您必须创建自己的数据类型:)
  • 啊,对了,也许我以错误的方式解决了这个问题,而不是从字符串开始,我应该将元素拆分为单独的数据类型,对其进行操作,然后将结果组合成一个字符串。我正在尝试这条路线,因为我试图将它变成一种方法,我可以根据我输入的字符串数量在数组中调用,以节省发送大量单独的消息。
  • 是的,不用担心发送太多消息。直到你知道你有性能问题。考虑让您的代码易于维护。

标签: objective-c nsstring


【解决方案1】:

这是使用正则表达式的替代解决方案。

它找到整数的范围(\\d+ 是一位或多位数字),提取它,递增它并替换给定范围内的值。

NSString* aString = @"AA1BB";
NSRange range = [aString rangeOfString:@"\\d+" options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
    NSInteger numericValue = [aString substringWithRange:range].integerValue;
    numericValue++;
    aString = [aString stringByReplacingCharactersInRange:range withString:[NSString stringWithFormat:@"%ld", numericValue]];

}
NSLog(@"%@", aString);

【讨论】:

  • 非常感谢@Vadian,它很有效,而且代码比我的少!我现在肯定会研究 NSRange。对这半场战斗的新手是知道哪些类和方法最适合用于给定问题。
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多