Subversion Repository Public Repository

litesoft

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package org.litesoft.core.formatters;

public class FractionalPartFormatHelper implements NumericFormatPartHelper
{
    String mFormat;

    public FractionalPartFormatHelper( String pFormat )
    {
        mFormat = pFormat;
    }

    public void process( StringBuilder pSB, NFparsedparts pParts )
    {
        String zParsedFractionalPart = pParts.getFractionalDigits();

//        if( pParts.isDecimalFound() )
//        {
        pSB.append( "." );
//        }
//        else
//        {
        // todo: should throw formatting exception?
//        }

        switch ( mFormat.length() )
        {
            case 1: // 0 or #
                if ( mFormat.equals( "0" ) )
                {
                    if ( zParsedFractionalPart.length() > 1 )
                    {
                        throw new IllegalArgumentException( "Fractional part " + zParsedFractionalPart +
                                                            " is too large to be formatted" );
                    }
                    else if ( zParsedFractionalPart.length() == 0 )
                    {
                        pSB.append( "0" );
                        pSB.append( pParts.getAfterAnyDigits() );
                    }
                    else
                    {
                        pSB.append( zParsedFractionalPart );
                        pSB.append( pParts.getAfterAnyDigits() );
                    }
                }
                else if ( mFormat.equals( "#" ) )
                {
                    pSB.append( zParsedFractionalPart );
                    pSB.append( pParts.getAfterAnyDigits() );
                }
                else
                {
                    throw new IllegalArgumentException( "Illegal Fractional Part Format String" );
                }
                break;
            case 2: // 0# or 00
                if ( mFormat.equals( "0#" ) )
                {
                    if ( zParsedFractionalPart.length() >= 1 )
                    {
                        pSB.append( zParsedFractionalPart );
                        pSB.append( pParts.getAfterAnyDigits() );
                    }
                    else
                    {
                        pSB.append( "0" );
                        pSB.append( pParts.getAfterAnyDigits() );
                    }
                }
                else if ( mFormat.equals( "00" ) )
                {
                    if ( zParsedFractionalPart.length() == 1 )
                    {
                        pSB.append( zParsedFractionalPart );
                        pSB.append( "0" );
                    }
                    else if ( zParsedFractionalPart.length() == 2 )
                    {
                        pSB.append( zParsedFractionalPart );
                    }
                    else
                    {
                        pSB.append( roundTwoDecimalPlaces( zParsedFractionalPart ) );
                    }
                }
                else
                {
                    throw new IllegalArgumentException( "Illegal Fractional Part Format String" );
                }
                break;
//            case 3: // 00# or 000
//                if ( mFormat.equals( "00#" ) )
//                {
////                    pSB.append( incertCommas( zParsedFractionalPart ) );
//                }
//                else
//                {
//                    throw new IllegalArgumentException( "Illegal Fractional Part Format String" );
//                }
//                break;
            default:
                break;
        }
    }

    private String roundTwoDecimalPlaces( String pToRound )
    {
        // 12.435   would be rounded up   to 12.44. The number to be rounded (3) is rounded to the nearest even digit (4).
        // 12.445   would be rounded down to 12.44. The number to be rounded (4) is not rounded up because it is an even digit.
        // 12.44501 would be rounded up   to 12.45. The number to be rounded (4) is followed by a five and by additional nonzero digits.

        char[] zDecimalChars = pToRound.toCharArray();

        int second = Integer.parseInt( "" + zDecimalChars[1] );
        int third = Integer.parseInt( "" + zDecimalChars[2] );

        if( pToRound.length() == 3)
        {
            if( (second % 2) != 0 ) // is odd
            {
                if(third >= 5 )
                {
                    second++;
                }
            }
            else
            {
                if(third > 5 )
                {
                    second++;
                }
            }
        }

        if ( pToRound.length() > 3 )
        {
            int rest = Integer.parseInt( pToRound.substring( 2 ) );

            if( (third == 5) && (rest > 0) )
            {
                second++;
            }
            
            if (third > 5)
            {
                second++;
            }
        }
        
        StringBuilder sb = new StringBuilder( );
        sb.append(zDecimalChars[0]);
        sb.append(second);

        return sb.toString();
    }
}

Commits for litesoft/trunk/Java/core/Anywhere/src/org/litesoft/core/formatters/FractionalPartFormatHelper.java

Diff revisions: vs.
Revision Author Commited Message
2 GeorgeS picture GeorgeS Sun 07 Feb, 2010 12:50:58 +0000