DecimalFormat
.
However, parsing with DecimalFormat
should be done with care.
You may even want to consider an alternative. Here's why:
Format
does not
need to parse all of its input. That is, if it finds a
match at the start of an input String
, it will cease parsing, and return a value. When parsing user input, this
kind of behavior is not usually desired. To accomodate this behavior, an extra step is needed - a
ParsePosition
object
needs to be passed as an output parameter to DecimalFormat
.
Here's an example of parsing with DecimalFormat
. An example run appears below. As you can see,
ParsePosition
to detect if
the whole input has been parsed.
import java.text.*; public final class BewareDecimalFormat { /** * parseUserInput DecimalFormat. */ public static void main (String... arguments) { String patternOne = "#,##0.00"; log("Format : " + patternOne); parseUserInput("1000", patternOne); parseUserInput("1,000.00", patternOne); parseUserInput("1000.33", patternOne); parseUserInput(".20", patternOne); parseUserInput(".2", patternOne); parseUserInput(".222", patternOne); parseUserInput(".222333444", patternOne); parseUserInput("100.222333444", patternOne); parseUserInput(".22A", patternOne); parseUserInput(".22BlahA", patternOne); parseUserInput("22Blah", patternOne); parseUserInput("Blah22", patternOne); parseUserInput("100000,000.00", patternOne); parseUserInput("10,0000,000.00", patternOne); parseUserInput("1,0000,0000.00", patternOne); String patternTwo= "#,###0.00"; //group every 4 digits, not 3 log(" "); log("Format : " + patternTwo); parseUserInput("1000.00", patternTwo); parseUserInput("1,000.00", patternTwo); parseUserInput("1,0000.00", patternTwo); parseUserInput("1,00000.00", patternTwo); log("Done."); } // PRIVATE private static void parseUserInput(String value, String decimalFormatPattern) { DecimalFormat format = new DecimalFormat(decimalFormatPattern); ParsePosition parsePosition = new ParsePosition(0); Object object = format.parse(value, parsePosition); if(object == null) { log("Failed to parse: " + value); } else if(parsePosition.getIndex() < value.length()) { log( value + " parsed OK (not whole input) ParsePos:" + parsePosition.getIndex() + ", Parse Result: " + object ); } else { log( value + " parsed OK. ParsePos: " + parsePosition.getIndex() + ", Parse Result: " + object ); } } private static void log(Object message){ System.out.println(String.valueOf(message)); } }
>java -cp . BewareDecimalFormat Format : #,##0.00 1000 parsed OK. ParsePos: 4, Parse Result: 1000 1,000.00 parsed OK. ParsePos: 8, Parse Result: 1000 1000.33 parsed OK. ParsePos: 7, Parse Result: 1000.33 .20 parsed OK. ParsePos: 3, Parse Result: 0.2 .2 parsed OK. ParsePos: 2, Parse Result: 0.2 .222 parsed OK. ParsePos: 4, Parse Result: 0.222 .222333444 parsed OK. ParsePos: 10, Parse Result: 0.222333444 100.222333444 parsed OK. ParsePos: 13, Parse Result: 100.222333444 .22A parsed OK (not whole input) ParsePos:3, Parse Result: 0.22 .22BlahA parsed OK (not whole input) ParsePos:3, Parse Result: 0.22 22Blah parsed OK (not whole input) ParsePos:2, Parse Result: 22 Failed to parse: Blah22 100000,000.00 parsed OK. ParsePos: 13, Parse Result: 100000000 10,0000,000.00 parsed OK. ParsePos: 14, Parse Result: 100000000 1,0000,0000.00 parsed OK. ParsePos: 14, Parse Result: 100000000 Format : #,###0.00 1000.00 parsed OK. ParsePos: 7, Parse Result: 1000 1,000.00 parsed OK. ParsePos: 8, Parse Result: 1000 1,0000.00 parsed OK. ParsePos: 9, Parse Result: 10000 1,00000.00 parsed OK. ParsePos: 10, Parse Result: 100000 Done.