Reputation: 2776
How to parse numbers with trailing sign?
Example input:
Cnt Market Variance % Var.
----- ------- --------------------------
Borr 545 1,253,626,425.65 100.0+
Loan 841 5,102,373,724.22- 100.0-
Upvotes: 4
Views: 490
Reputation: 2776
The easiest way I know is to provide two patterns - one for positive and one for negative numbers:
DecimalFormat decimalFormat = ((DecimalFormat) NumberFormat.getInstance(Locale.US));
decimalFormat.applyPattern("#,##0.00;#,##0.00-");
System.out.println(decimalFormat.parse("6.4+")); // Double 6.4
System.out.println(decimalFormat.parse("724.22-")); // Double -724.22
Same can be obtained as BigDecimals
DecimalFormat decimalFormat = ((DecimalFormat) NumberFormat.getInstance(Locale.US));
decimalFormat.applyPattern("#,##0.00;#,##0.00-");
decimalFormat.setParseBigDecimal(true);
System.out.println(decimalFormat.parse("6.4+")); // BigDecimal 6.4
System.out.println(decimalFormat.parse("724.22-")); // BigDecimal -724.22
WARNING
Patterns are dependent on Locale. Skipping Locale can have unpredictable effect.
DecimalFormat decimalFormat = new DecimalFormat("#,##0.00;#,##0.00-");
System.out.println(decimalFormat.parse("6.4+")); // Long 6 WRONG!
System.out.println(decimalFormat.parse("724.22-")); // Long 724 WRONG!
DecimalFormat decimalFormat = new DecimalFormat("#,##0.00;#,##0.00-",
DecimalFormatSymbols.getInstance(Locale.US));
System.out.println(decimalFormat.parse("6.4+")); // 6.4
System.out.println(decimalFormat.parse("724.22-")); // -724.22
HINT
You can parse number specifying start position without applying substring operation
String line = "Borr 545 1,253,626,425.65 100.0+";
System.out.println(decimalFormat.parse(line, new ParsePosition(16))); // 1253626425.65
System.out.println(decimalFormat.parse(line, new ParsePosition(34))); // 100.0
Don't ask me why you need to wrap int with ParsePosition.
Upvotes: 4