On 18:57 Wed 16 Feb     , Pekka Enberg wrote:
> The following test case:
> 
>   public class StringTest {
>     public static void main(String[] args) {
>       System.out.println(String.format("%08x", 1234));
>     }
>   }
> 
> produces the following error:
> 
> Exception in thread "main" java.lang.NumberFormatException: invalid character 
> at position 2 in 08
>    at java.lang.Integer.parseInt(Integer.java:837)
>    at java.lang.Integer.decode(Integer.java:568)
>    at java.util.Formatter.parseInt(Formatter.java:1191)
>    at java.util.Formatter.parseArgumentIndex(Formatter.java:1212)
>    at java.util.Formatter.format(Formatter.java:1326)
>    at java.util.Formatter.format(Formatter.java:1442)
>    at java.lang.String.format(String.java:1984)
>    at java.lang.String.format(String.java:1990)
>    at StringTest.main(StringTest.java:3)
> 
> This patch fixes the issue by switching to Integer.parseInt() in
> java.util.Formatter.parseInt().
> 
> Signed-off-by: Pekka Enberg <penb...@kernel.org>
> ---
>  ChangeLog                |    7 +++++++
>  java/util/Formatter.java |    2 +-
>  2 files changed, 8 insertions(+), 1 deletions(-)
> 
> diff --git a/ChangeLog b/ChangeLog
> index a575fb9..f1c7c31 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,10 @@
> +2010-02-16  Pekka Enberg  <penb...@kernel.org>
> +
> +     * java/util/Formatter.java:
> +     (parseInt): Use Integer.parseInt() insted of Integer.decode()
> +     because the latter doesn't work with leading zeros which are
> +     used in String.format() formatting, for example.
> +
>  2010-07-02  Ivan Maidanski  <iv...@mail.ru>
>  
>       * java/util/regex/Pattern.java:
> diff --git a/java/util/Formatter.java b/java/util/Formatter.java
> index 04ae805..62f6845 100644
> --- a/java/util/Formatter.java
> +++ b/java/util/Formatter.java
> @@ -1188,7 +1188,7 @@ public final class Formatter
>        advance();
>      if (start == index)
>        return -1;
> -    return Integer.decode(format.substring(start, index));
> +    return Integer.parseInt(format.substring(start, index));
>    }
>  
>    /**
> -- 
> 1.7.1
> 
> 

The difference between the two methods is that parseInt only handles decimal 
numbers
(the issue with decode is that it treats 08 as octal).  As all the possible
values after % should be decimal integers (decimal integer for the argument 
index,
and non-negative decimal integers for width and precision), this change seems 
ok.
-- 
Andrew :)

Free Java Software Engineer
Red Hat, Inc. (http://www.redhat.com)

Support Free Java!
Contribute to GNU Classpath and IcedTea
http://www.gnu.org/software/classpath
http://icedtea.classpath.org
PGP Key: F5862A37 (https://keys.indymedia.org/)
Fingerprint = EA30 D855 D50F 90CD F54D  0698 0713 C3ED F586 2A37

Reply via email to