I also have this issue. I have a system using the Zend_Currency class. If I set the locale to en_GB and use Zend_Currency to display a number (say 500) it will return £500.00 as expected. If however I set the locale to de_DE it returns 5.000,00. I have tracked down what's happening, and the cause of the problem is in the Zend_Locale_Format::toNumber() method which is called in line 150 of Zend_Currency::toCurrency() (v1.9.7). I have also identified the issue as existing in v1.8.2 and 1.8.5.
Example 1 - passing in a $valueof (string)500.00
In this example, the value being passed to is Zend_Locale_Format::toNumber() in my example is a string '500.00'. (note that I've used a '.' for the decimal despite the locale being de_DE - should be a ','. The rest of my description takes place in Zend_Locale_Format::toNumber() and any line numbers refer to that method in v1.9.7.
line 295 normalises the $value, which essentially removes the thousand separator and any + sign, and this is the problem. Since I'm passing in an english formed number and the locale is de_DE, it strips out the de_DE thousand sep (a .) changing my $value from 500.00 to 50000, and this is the amount it returns as $value.
line 340 runs Zend_Locale_Math::round() which works fine, changing my $value from 50000 to 50000.0. No value change there, and it's still a string (which is fine).
line 361 runs the normalise method again, this time repeating the same issue as before - stripping out the de_DE thousand separator (a '.') thus changing my $value from 50000.0 to 500000.
Example 2 - passing in a $value of (int)500
In this example the $value being passed to toNumber() is an int. We are still using a locale of de_DE.
This time the line 295 returns a string '500' which is fine. There were no thousand or decimal characters to get confused.
Line 340 runs as expected, changing the string from '500' to '500.0' (again, note the '.' not ',', even though our locale is de_DE which uses ',' for decimal and '.' for the thousand seperator).
Line 361 runs again, and deletes the thousand seperator from the locale data (the '.') changing my number from 500.0 to 5000, and that is what gets returned.
Example 3 - passing in a $value of (double)1500.50
This causes the same issues as Example 2, except this time line 340 round() changes my converted string of '1500.5' to '15005.0'. I'll let you debug it to work out why.
Looking through, it seems that the Zend_Locale_Math::normalize() method is assuming that it is getting an int or double type value, which actually works fine. The problem is that there is no validation on this, and if you pass it a string everything goes wrong. This issue is resolved if you convert the $value being passed to the normalize method to either an int or double before running it through - the system takes care of things for you at that point, although I am still testing this out as a solution.
This is a pretty critical issue for us: we run a browser based app with a large finance componant and as we are moving into Europe we are finding that this is making some parts of our system totally unuseable. I'm kind of suprised that this hasnt come up before!
Ok - so the box is a CentOS 5.4 server running latest build of Zend Core. The linux locale is set to en_GB.UTF-8 just incase that makes a difference.
On trunk I get '25,00 €'. Could you please test if this issue also occurs on trunk?