Search code examples
javajfreechart

Y Axis is not displaying correct figure for Millions and Billions in JFreeChart


While generating Bar Graph using JFreeChart, I am getting billions and Millions value in scientific numeric format, that is having less readability,

enter image description here

There is any way, so that I can get the value like using JfreeChart.

enter image description here

It has to be dynamic for Million, Billions for all value. Any help will be appreciated.


Solution

  • Thanks to @Haroldo_OK and @trashgod for you hint and finally I got the solution for the same and It's giving me the expected result.

    final long MILLION = 1000000L;
        final long BILLION = 1000000000L;
        final long TRILLION = 1000000000000L;
        final long THOUSAND = 1000L;
    
        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setNumberFormatOverride(new NumberFormat() {
    
            @Override
            public Number parse(String source, ParsePosition parsePosition) {
                return null;
            }
    
            @Override
            public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
    
                String temp =  number < THOUSAND ? String.valueOf(number) :
                    number < MILLION ?  (int)(number / THOUSAND) + " K" :
                    number < BILLION ?  (int)(number / MILLION) + " M" :
                    number < TRILLION ? (int)(number / BILLION) + " B" : 
                    (int)(number / TRILLION) + " T";
                return new StringBuffer(temp);
            }
    
            @Override
            public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
    
                String temp =  number < THOUSAND ? String.valueOf(number) :
                    number < MILLION ?  (int)(number / THOUSAND) + " K" :
                    number < BILLION ?  (int)(number / MILLION) + " M" :
                    number < TRILLION ? (int)(number / BILLION) + " B" : 
                    (int)(number / TRILLION) + " T";
                return new StringBuffer(temp);
            }
        });