litesoft
@ 151
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 |
// This Source Code is in the Public Domain per: http://litesoft.org/License.txt 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(); } } |