Currently iPhone cannot correcly match an incoming caller ID with numbers stored in your address book if one is in local format (without country code prefix) and the other is in international format (with +country_code prefix). I know some of us resorted to storing 2 numbers for each contact, but sometimes even that won't cut it.
This is a patch to make it work. Remember this is only a temporary solution, until Apple fixes it properly.
Extract to /System/Library/Frameworks/AppSupport.framework/ and overwrite the original. Reboot and enjoy.
the -7, -8 and -9 indicates the number of digits used for matching. I remember someone mentioned in another thread that Nokia phones use the last 6 digits of a phone number for matching. By default, iPhone uses the last 7 digits, but only if either the incoming caller ID or the stored number is exactly 7 digits. This may work for US phone numbers (for example local caller ID 555-6789 will match against +1-234-555-6789 stored in address book), but may not for the rest of the world. Mobile phone numbers in Australia, for example, are in the form of 0412-345-678 when displayed as a local number, but +61-412-345-678 when country code is added (the leading 0 is dropped). To make things worse, voice calls come with local caller ID while SMS's come with international caller ID, so you're in trouble even when you're not roaming. This patch forces iPhone to use the last 7 or 8 digits for matching even if caller ID or stored number is longer than 7 digits.
I've only tested this in Australia, so I can't guarantee it will work for everyone. Make sure you have a backup copy of the original AppSupport before overwriting.