format-number() in XSLT 1.0 isn't very well specified. The spec says that the format picture is interpreted as in the DecimalFormat class in JDK 1.1 (there's actually a link to the Sun web site which is now broken). Many Java-based XSLT processors use the implementation of DecimalFormat in whatever version of Java they happen to be running on, which is of course incorrect, because it has changed since 1.1; and one of the things that has changed is the handling of currency signs. Non-Java-based processors do their best to emulate the Java 1.1 behaviour, but that's not easy either as many aspects of the behaviour are left unspecified in JDK 1.1 (though in some cases later releases have improved documentation).
It's hard to tell without pulling the JDK 1.1 spec out of archive storage exactly what the correct behaviour here is, and even if you did, it probably wouldn't give you a clear answer. Simplest solution is to take the "$" out of your picture, and add it into the output using concat().
This is all assuming you are using an XSLT 1.0 processor. XSLT 2.0 has it's own specification of format-number() with no dependency on the JDK specification.
bonekrusher's response is quite irrelevant, by the way. $ does introduce an XPath variable, but not when it's within a string literal.
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference