On Monday, I spent some time in the morning polishing up the photoshop comps I’d been working on. There’ll be a more detailed full writeup on the process I went through with those once they’re totally finished. In the afternoon I turned my attentions back to the Cheapest app. My mission: to locate and fix a bug that prevented use of numbers after the decimal point when an iPhone’s localization settings dictate a comma instead of a period as the decimal separator.
There was already some cleverness going on in terms of localization: the following line of code made sure that where appropriate, the comma was used instead of the period:
decimalChar = field.formatter.decimalSeparator;
decimalChar
is then appended to the current digits in the field. This is all well and good: people get a familiar decimal separator. The problem was that when they moved on to the next field, digits after the decimal were lost.
What a mystery. I should mention that these are really my first forays into objective-c, so I’m very much learning to read the syntax as I go. After some time spent reading documentation, and hunting through different parts of the program, including an introduction by Steve to the debugging features in x-code, I figured out the process the application went through each time a field lost focus.
When the user presses a key on the calculator keyboard built into the app, that digit is appended to a string variable (string of text). Only when the field loses focus, is that value mined for its numbers, and passed to a different variable in the local currency format. The problem was, the part of the program that stripped the numbers out of the text didn’t know what to do with a comma, and so digits after the comma were lost.
The fix was quite simple: change commas to periods, before parsing the string for its numbers. I didn’t need to worry about putting commas back in, because the currency-formatted variable that reads those numbers already knows about localisation.
So the problem was fixed with a single line of code, incidentally, my very first line of code to go into a published application.
And here it is:
title = [title stringByReplacingOccurrencesOfString:@"," withString:@"."];
Takehome lessons:
doubleValue
doesn’t know about commas or localisation
- x-code’s documentation feature is my friend
- spend time figuring out exactly where your bug is happening in the code
- use debugging tools to do this
- once you know where it’s all going wrong, the hard part might well be over
Reply
You must be logged in to post a comment.