views:

896

answers:

4

I have made a quadratic equation solver for the iPhone and when the text box is clicked, my own custom keypad appears. I have a button that changes whether the number is positive or negative. Right now I what happens is that when the button is pressed (0 - current value of text) is what is displayed in the text box, so if the number is positive, it will become negative and if it is negative it will become positive. I am having some problems doing this so what I wanted to is to put a minus sign at the beginning of the string if the number is positive and if the number is negative, the minus sign will be removed. Can anyone give me guidance on this?

A: 

If you just need to add characters to a string, you can use the stringWithFormat method:

[NSString stringWithFormat:@"Result: %@", result];

The (%@) percent/at-sign is a placeholder for whatever characters you want to insert into the NSString. For numbers you use (%d) percent/d.

For example, you can use something like this:

NSString *resultString;
NSInteger result;
if (should be positive)
    resultString = [NSString stringWithFormat:@"-%d", result];
else
    resultString = [NSString stringWithFormat:@"%d", result];
Ken Pespisa
If result is already negative, this will result in two - signs instead of none. The better approach is to negate the numeric value, then use it in the string, and let the format specifier handle positive/negative.
Quinn Taylor
+2  A: 

While you could directly manipulate a string representation of a numeric value, such an approach is a bad idea. Not only is it less efficient than other alternatives, but potentially incorrect. (For example, @Ken's answer would result in two minus signs.)

What you probably want to do is negate the numeric value (just multiply it by -1, or subtract it from 0 as you suggested) and reflect that change in the interface (you mention a text box).

If you're using standard Cocoa controls (which inherit from NSControl, as NSTextField does) I suggest using -[NSControl setIntegerValue:] to change the text of the text field. If you (can) break up your UI well and have a text field for each variable in the quadratic equation, this should be fairly simple. (If you're using something other than an integer value, use something like -setDoubleValue: or -setFloatValue: instead.)

If you must create your own string beforehand, using an integer format specifier will display a "-" sign automatically if appropriate. Be sure to use %ld instead of %d (thanks, @Peter!) as the format specifier for NSInteger values to avoid possibly truncating values larger than 32-bit. For example:

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

In a more general sense, if you need to insert a dynamically-obtained string (not just something for which you can create a format string at compile time) you can also use an NSMutableString and its methods -appendString: and -insertString:atIndex: as well.

Quinn Taylor
One minor correction: %d is an int, not NSInteger. Use %ld (long int) instead. On a 64-bit Mac, NSInteger is 64 bits, so if you use %d, numbers out of the range of a 32-bit int will get truncated to the lower 32 bits.
Peter Hosey
Good catch Peter, incorporating that in my answer.
Quinn Taylor
+2  A: 

An alternative to the straight string approach is to not use a string. A while back I wrote a graphing calculator for iPhone that stored the equation internally in an NSMutableArray of NSStrings. Each slot in the array corresponded to one element in the equation, such as "x", "^", "sin(", etc.

When I needed to negate the equation, it was much easier to tell the array to insertObject:@"-" atIndex:0 than to try and insert it directly into the string. Then whenever the array was changed, I just remade the equation string like this:

NSString * newEquation = [equationElements componentsJoinedByString:@""];
Dave DeLong
If the asker is solving *the* quadratic equation (as implied) the formula will be fixed, but using an array for equation elements is definitely an interesting idea. Very cool!
Quinn Taylor
A: 

Instead of negating using a mathematical function I assigned a NSMutableString to my UITextField then I inserted a "-" sign using insertString:atIndex: then I reassigned the changed string to my UITextField. To toggle between positive and negative, I created an if function so if the float value of my textfield is greater or equal to 0, then an "-" is inserted but if the float value of my text field is less than zero, the "-" is removed using deleteCharactersInRange. Here is my code as it stands:

- (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 is the name of the UITextField that i am changing.

Omar