【问题标题】:Objective C - Adding characters at specific parts of a stringObjective C - 在字符串的特定部分添加字符
【发布时间】:2009-07-05 13:23:34
【问题描述】:

我已经为 iPhone 制作了一个二次方程求解器,当单击文本框时,会出现我自己的自定义键盘。我有一个按钮可以改变数字是正数还是负数。现在我发生的是当按钮被按下时(0 - 文本的当前值)是文本框中显示的内容,所以如果数字是正数,它将变为负数,如果它是负数就会变成正数。我在这样做时遇到了一些问题,所以我想要的是如果数字为正数,则在字符串的开头放置一个减号,如果数字为负数,则将删除减号。谁能给我这方面的指导?

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    我没有使用数学函数取反,而是将 NSMutableString 分配给我的 UITextField,然后我使用 insertString:atIndex 插入了一个“-”符号:然后我将更改后的字符串重新分配给我的 UITextField。为了在正负之间切换,我创建了一个 if 函数,因此如果我的文本字段的浮点值大于或等于 0,则插入一个“-”,但如果我的文本字段的浮点值小于零,则“ -" 使用 deleteCharactersInRange 删除。这是我的代码:

    - (IBAction)positivity{
    
        NSMutableString *a = [NSMutableString stringWithString:aVal.text];
    
    
        if([aVal.text floatValue]>=0){      
        [a insertString: @"-" atIndex: 0];
        aVal.text = a;
        }
        else if([aVal.text floatValue]<0){
            NSRange range = {0,1};
            [a deleteCharactersInRange:range];
            aVal.text = a;
    }
    
    }
    

    aVal 是我要更改的 UITextField 的名称。

    【讨论】:

      【解决方案2】:

      直接字符串方法的替代方法是不使用字符串。不久前,我为 iPhone 编写了一个图形计算器,将方程内部存储在 NSStrings 的 NSMutableArray 中。数组中的每个槽对应方程中的一个元素,如“x”、“^”、“sin(”等。

      当我需要对等式取反时,告诉数组 insertObject:@"-" atIndex:0 比尝试将其直接插入字符串要容易得多。然后,每当数组发生变化时,我都会像这样重新制作方程式字符串:

      NSString * newEquation = [equationElements componentsJoinedByString:@""];
      

      【讨论】:

      • 如果提问者求解 二次方程(如暗示的那样),公式将是固定的,但使用数组作为方程元素绝对是一个有趣的想法。很酷!
      【解决方案3】:

      虽然您可以直接操作数值的字符串表示,但这种方法是个坏主意。它不仅比其他替代方案效率低,而且可能不正确。 (例如,@Ken 的回答会导致两个减号。)

      您可能想要做的是取反数值(只需将其乘以 -1,或按照您的建议从 0 中减去)并在界面中反映该更改 strong>(你提到了一个文本框)。

      如果您使用标准 Cocoa 控件(继承自 NSControl,就像 NSTextField 一样),我建议使用 -[NSControl setIntegerValue:] 更改文本字段的文本。如果您(可以)很好地分解您的 UI 并为二次方程中的每个变量提供一个文本字段,那么这应该相当简单。 (如果您使用的不是整数值,请改用 -setDoubleValue:-setFloatValue:。)

      如果您必须事先创建自己的字符串,则使用整数格式说明符将在适当时自动显示“-”符号。请务必使用 %ld 而不是 %d(谢谢@Peter!)作为 NSInteger 值的格式说明符,以避免可能截断大于 32 位的值.例如:

      NSString *result = [NSString stringWithFormat:@"%ld", nsIntegerValue];
      

      在更一般的意义上,如果您需要插入一个动态获取的字符串(不仅仅是可以在编译时为其创建格式字符串的内容),您还可以使用 NSMutableString 及其方法 -appendString:-insertString:atIndex: 也是。

      【讨论】:

      • 一个小修正:%d 是一个 int,而不是 NSInteger。请改用 %ld (long int)。在 64 位 Mac 上,NSInteger 是 64 位,因此如果您使用 %d,超出 32 位 int 范围的数字将被截断为低 32 位。
      • 很好,彼得,将其纳入我的回答中。
      猜你喜欢
      • 1970-01-01
      • 2013-10-21
      • 2022-06-17
      • 1970-01-01
      • 2023-03-05
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多