Pavel
Pavel

Reputation: 2776

How to parse numbers with trailing sign?

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

Answers (1)

Pavel
Pavel

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

Related Questions