1 /* 2 * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 4018937 8008577 27 * @summary Confirm that methods which are newly added to support BigDecimal and BigInteger work as expected. 28 * @library /java/text/testlib 29 * @run main/othervm -Djava.locale.providers=COMPAT,SPI BigDecimalFormat 30 */ 31 32 import java.math.BigDecimal; 33 import java.math.BigInteger; 34 import java.text.*; 35 import java.util.*; 36 37 public class BigDecimalFormat extends IntlTest { 38 39 public static void main(String[] args) throws Exception { 40 new BigDecimalFormat().run(args); 41 } 42 43 static final String nonsep_int = 44 "123456789012345678901234567890123456789012345678901234567890" + 45 "123456789012345678901234567890123456789012345678901234567890" + 46 "123456789012345678901234567890123456789012345678901234567890" + 47 "123456789012345678901234567890123456789012345678901234567890" + 48 "123456789012345678901234567890123456789012345678901234567890" + 49 "123456789012345678901234567890123456789012345678901234567890"; 50 51 static final String sep_int = 52 "123,456,789,012,345,678,901,234,567,890," + 53 "123,456,789,012,345,678,901,234,567,890," + 54 "123,456,789,012,345,678,901,234,567,890," + 55 "123,456,789,012,345,678,901,234,567,890," + 56 "123,456,789,012,345,678,901,234,567,890," + 57 "123,456,789,012,345,678,901,234,567,890," + 58 "123,456,789,012,345,678,901,234,567,890," + 59 "123,456,789,012,345,678,901,234,567,890," + 60 "123,456,789,012,345,678,901,234,567,890," + 61 "123,456,789,012,345,678,901,234,567,890," + 62 "123,456,789,012,345,678,901,234,567,890," + 63 "123,456,789,012,345,678,901,234,567,890"; 64 65 static final String nonsep_zero = 66 "000000000000000000000000000000000000000000000000000000000000" + 67 "000000000000000000000000000000000000000000000000000000000000" + 68 "000000000000000000000000000000000000000000000000000000000000" + 69 "000000000000000000000000000000000000000000000000000000000000" + 70 "000000000000000000000000000000000000000000000000000000000000" + 71 "000000000000000000000000000000000000000000000000000000000000"; 72 73 static final String sep_zero = 74 "000,000,000,000,000,000,000,000,000,000," + 75 "000,000,000,000,000,000,000,000,000,000," + 76 "000,000,000,000,000,000,000,000,000,000," + 77 "000,000,000,000,000,000,000,000,000,000," + 78 "000,000,000,000,000,000,000,000,000,000," + 79 "000,000,000,000,000,000,000,000,000,000," + 80 "000,000,000,000,000,000,000,000,000,000," + 81 "000,000,000,000,000,000,000,000,000,000," + 82 "000,000,000,000,000,000,000,000,000,000," + 83 "000,000,000,000,000,000,000,000,000,000," + 84 "000,000,000,000,000,000,000,000,000,000," + 85 "000,000,000,000,000,000,000,000,000,000"; 86 87 static final String fra = 88 "012345678901234567890123456789012345678901234567890123456789" + 89 "012345678901234567890123456789012345678901234567890123456789" + 90 "012345678901234567890123456789012345678901234567890123456789" + 91 "012345678901234567890123456789012345678901234567890123456789" + 92 "012345678901234567890123456789012345678901234567890123456789" + 93 "012345678901234567890123456789012345678901234567890123456789"; 94 95 96 StringBuffer formatted = new StringBuffer(1000); 97 FieldPosition fp; 98 99 /** 100 * Test for normal big numbers which have the fraction part 101 */ 102 void test_Format_in_NumberFormat_BigDecimal() { 103 String from, to; 104 105 NumberFormat nf = NumberFormat.getInstance(Locale.US); 106 ((DecimalFormat)nf).applyPattern("#,##0.###"); 107 setDigits(nf, Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 0); 108 109 // From: 0.000...789 110 // To: 0.000...789 (same as From) 111 formatted.setLength(0); 112 from = "0." + nonsep_zero + "123456789"; 113 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 114 checkFormat(from, formatted, from, ((DecimalFormat)nf).getMultiplier()); 115 116 /* ------------------------------------------------------------------ */ 117 118 // From: -0.000...789 119 // To: -0.000...789 (same as From) 120 // ~ : FieldPosition(SIGN) 121 fp = new FieldPosition(NumberFormat.Field.SIGN); 122 formatted.setLength(0); 123 from = "-0." + nonsep_zero + "123456789"; 124 nf.format(new BigDecimal(from), formatted, fp); 125 checkFormat(from, formatted, from, ((DecimalFormat)nf).getMultiplier()); 126 checkFieldPosition(from, fp, 0, 1); 127 128 /* ------------------------------------------------------------------ */ 129 130 // From: 1234...7890.012...789 131 // To: 123,4...7,890.012...789 132 // ~~~~~~~~~~~~~ : FieldPosition(INTEGER_FIELD) 133 fp = new FieldPosition(DecimalFormat.INTEGER_FIELD); 134 formatted.setLength(0); 135 from = nonsep_int + "." + fra; 136 to = sep_int + "." + fra; 137 nf.format(new BigDecimal(from), formatted, fp); 138 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 139 checkFieldPosition(from, fp, 0, 479); 140 141 /* ------------------------------------------------------------------ */ 142 143 // From: -1234...7890.012...789 144 // To: -123,4...7,890.012...789 145 // ~~~~~~~~~ : FieldPosition(FRACTION_FIELD) 146 fp = new FieldPosition(DecimalFormat.FRACTION_FIELD); 147 formatted.setLength(0); 148 from = "-" + nonsep_int + "." + fra; 149 to = "-" + sep_int + "." + fra; 150 nf.format(new BigDecimal(from), formatted, fp); 151 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 152 checkFieldPosition(from, fp, 481, 841); 153 154 /* ------------------------------------------------------------------ */ 155 156 // From: 1234...78900000...0000.000...789 157 // To: 123,4...7,890,000,0...0,000.000...789 158 formatted.setLength(0); 159 from = nonsep_int + nonsep_zero + "." + nonsep_zero + fra; 160 to = sep_int + "," + sep_zero + "." + nonsep_zero + fra; 161 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 162 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 163 164 /* ------------------------------------------------------------------ */ 165 166 // From: -1234...78900000...0000.000...789 167 // To: -123,4...7,890,000,0...0,000.000...789 168 formatted.setLength(0); 169 from = "-" + nonsep_int + nonsep_zero + "." + nonsep_zero + fra; 170 to = "-" + sep_int + "," + sep_zero + "." + nonsep_zero + fra; 171 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 172 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 173 174 /* ------------------------------------------------------------------ */ 175 176 // From: 1234...78900000...0000 177 // To: 123,4...7,890,000,0...0,000 178 formatted.setLength(0); 179 from = nonsep_int + nonsep_zero; 180 to = sep_int + "," + sep_zero; 181 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 182 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 183 184 /* ------------------------------------------------------------------ */ 185 186 // From: -1234...78900000...0000 187 // To: -123,4...7,890,000,0...0,000 188 formatted.setLength(0); 189 from = "-" + nonsep_int + nonsep_zero; 190 to = "-" + sep_int + "," + sep_zero; 191 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 192 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 193 194 /* ------------------------------------------------------------------ */ 195 196 // From: 1234...78900000...0000.0...0 197 // To: 1,234...7,890,000,0...0,000 198 formatted.setLength(0); 199 from = nonsep_int + nonsep_zero + "." + nonsep_zero; 200 to = sep_int + "," + sep_zero; 201 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 202 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 203 204 /* ------------------------------------------------------------------ */ 205 206 // From: -1234...78900000...0000.0...0 207 // To: -1,234...7,890,000,0...0,000 208 formatted.setLength(0); 209 from = "-" + nonsep_int + nonsep_zero + "." + nonsep_zero; 210 to = "-" + sep_int + "," + sep_zero; 211 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 212 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 213 214 /* ------------------------------------------------------------------ */ 215 216 // From: 000...0000 217 // To: 0 218 formatted.setLength(0); 219 from = nonsep_zero; 220 to = "0"; 221 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 222 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 223 224 /* ------------------------------------------------------------------ */ 225 226 // From: -000...0000 227 // To: 0 228 formatted.setLength(0); 229 from = "-" + nonsep_zero; 230 to = "0"; 231 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 232 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 233 234 /* ------------------------------------------------------------------ */ 235 236 // From: 000...00001234 237 // To: 1,234 238 formatted.setLength(0); 239 from = nonsep_zero + "1234"; 240 to = "1,234"; 241 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 242 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 243 244 /* ------------------------------------------------------------------ */ 245 246 // From: -000...00001234 247 // To: -1,234 248 // ~ : FieldPosition(GROUPING_SEPARATOR) 249 fp = new FieldPosition(NumberFormat.Field.GROUPING_SEPARATOR); 250 formatted.setLength(0); 251 from = "-" + nonsep_zero + "1234"; 252 to = "-1,234"; 253 nf.format(new BigDecimal(from), formatted, fp); 254 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 255 checkFieldPosition(from, fp, 2, 3); 256 257 /* ------------------------------------------------------------------ */ 258 259 // From: 000...0000.0...0 260 // To: 0 261 formatted.setLength(0); 262 from = nonsep_zero + "." + nonsep_zero; 263 to = "0"; 264 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 265 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 266 267 /* ------------------------------------------------------------------ */ 268 269 ((DecimalFormat)nf).applyPattern("#,##0.0"); 270 setDigits(nf, Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 1); 271 272 // From: -000...0000.0...0 273 // To: 0.0 274 formatted.setLength(0); 275 from = "-" + nonsep_zero + "." + nonsep_zero; 276 to = "0.0"; 277 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 278 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 279 280 /* ------------------------------------------------------------------ */ 281 282 // From: 1234...7890.012...7890...0 283 // To: 1,234...7,890.0123...789 284 formatted.setLength(0); 285 from = nonsep_int + "." + fra + nonsep_zero; 286 to = sep_int + "." + fra; 287 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 288 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 289 290 /* ------------------------------------------------------------------ */ 291 292 // From: -1234...7890.012...7890...0 293 // To: -1,234...7,890.0123...789 294 formatted.setLength(0); 295 from = "-" + nonsep_int + "." + fra + nonsep_zero; 296 to = "-" + sep_int + "." + fra; 297 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 298 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 299 300 /* ------------------------------------------------------------------ */ 301 302 ((DecimalFormat)nf).applyPattern("0.###E0"); 303 setDigits(nf, 1, 1, Integer.MAX_VALUE, 0); 304 305 // From: 1123...890.012...789 306 // To : 1.123...8900123...789E360 307 // ~~~ : FieldPosition(EXPONENT) 308 fp = new FieldPosition(NumberFormat.Field.EXPONENT); 309 formatted.setLength(0); 310 from = "1" + nonsep_int + "." + fra; 311 to = "1." + nonsep_int + fra + "E360"; 312 nf.format(new BigDecimal(from), formatted, fp); 313 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 314 checkFieldPosition(from, fp, 723, 726); 315 316 /* ------------------------------------------------------------------ */ 317 318 // From: -1123...890.012...789 319 // To : -1.123...8900123...789E360 320 formatted.setLength(0); 321 from = "-1" + nonsep_int + "." + fra; 322 to = "-1." + nonsep_int + fra + "E360"; 323 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 324 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 325 326 /* ------------------------------------------------------------------ */ 327 328 ((DecimalFormat)nf).applyPattern("0.###E0"); 329 setDigits(nf, 1, 1, Integer.MAX_VALUE, 0); 330 331 // From: 0.000...0001123...890.012...789 332 // To : 1.123...8900123...789E-360 333 formatted.setLength(0); 334 from = "0." + nonsep_zero + "1" + fra; 335 to = "1." + fra + "E-361"; 336 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 337 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 338 339 /* ------------------------------------------------------------------ */ 340 341 // From: -0.000...0001123...890.012...789 342 // To : -1.123...8900123...789E-360 343 formatted.setLength(0); 344 from = "-0." + nonsep_zero + "1" + fra; 345 to = "-1." + fra + "E-361"; 346 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 347 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 348 349 /* ------------------------------------------------------------------ */ 350 351 // From: 1123...890.012...789000...000 352 // To : 1.123...8900123...789E360 353 formatted.setLength(0); 354 from = "1" + nonsep_int + "." + fra + nonsep_zero; 355 to = "1." + nonsep_int + fra + "E360"; 356 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 357 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 358 359 /* ------------------------------------------------------------------ */ 360 361 // From: -1123...890.012...789000...000 362 // To : -1.123...8900123...789E360 363 // ~ : FieldPosition(EXPONENT_SYMBOL) 364 fp = new FieldPosition(NumberFormat.Field.EXPONENT_SYMBOL); 365 formatted.setLength(0); 366 from = "-1" + nonsep_int + "." + fra + nonsep_zero; 367 to = "-1." + nonsep_int + fra + "E360"; 368 nf.format(new BigDecimal(from), formatted, fp); 369 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 370 checkFieldPosition(from, fp, 723, 724); 371 372 /* ------------------------------------------------------------------ */ 373 374 // From: 0.000...0001123...890.012...789000...000 375 // To : 1.123...8900123...789E-360 376 // ~ : FieldPosition(EXPONENT_SIGN) 377 fp = new FieldPosition(NumberFormat.Field.EXPONENT_SIGN); 378 formatted.setLength(0); 379 from = "0." + nonsep_zero + "1" + fra + nonsep_zero; 380 to = "1." + fra + "E-361"; 381 nf.format(new BigDecimal(from), formatted, fp); 382 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 383 checkFieldPosition(from, fp, 363, 364); 384 385 /* ------------------------------------------------------------------ */ 386 387 // From: -0.000...0001123...890.012...789000...000 388 // To : -1.123...8900123...789E-360 389 formatted.setLength(0); 390 from = "-0." + nonsep_zero + "1" + fra + nonsep_zero; 391 to = "-1." + fra + "E-361"; 392 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 393 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 394 395 /* ------------------------------------------------------------------ */ 396 397 // From: ABC1123...890.012...789 398 // To : ABC1.123...890.0123...789 399 formatted = new StringBuffer("ABC"); 400 from = "1" + nonsep_int + "." + fra; 401 to = "ABC1." + nonsep_int + fra + "E360"; 402 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 403 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 404 405 /* ------------------------------------------------------------------ */ 406 407 // From: ABC-1123...890.012...789 408 // To : ABC-1.123...890.0123...789 409 // ~ : FieldPosition(DECIMAL_SEPARATOR) 410 fp = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR); 411 formatted = new StringBuffer("ABC"); 412 from = "-1" + nonsep_int + "." + fra; 413 to = "ABC-1." + nonsep_int + fra + "E360"; 414 nf.format(new BigDecimal(from), formatted, fp); 415 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 416 checkFieldPosition(from, fp, 5, 6); 417 418 /* ------------------------------------------------------------------ */ 419 420 ((DecimalFormat)nf).applyPattern("#,##0.###"); 421 setDigits(nf, Integer.MAX_VALUE, 1, 726, 0); 422 423 // From: 0.000...000012...7890123456789 424 // To: 0.000...000012...789012346 (Shorter than From) 425 formatted.setLength(0); 426 from = "0." + nonsep_zero + fra + fra; 427 to = "0." + nonsep_zero + fra + "012346"; 428 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 429 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 430 431 ((DecimalFormat)nf).applyPattern("#,##0.###"); 432 setDigits(nf, Integer.MAX_VALUE, 1, 723, 0); 433 434 /* ------------------------------------------------------------------ */ 435 436 // From: -0.000...000012...7890123456789 437 // To: -0.000...000012...789012 (Shorter than From) 438 formatted.setLength(0); 439 from = "-0." + nonsep_zero + fra + fra; 440 to = "-0." + nonsep_zero + fra + "012"; 441 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 442 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 443 444 /* ------------------------------------------------------------------ */ 445 446 ((DecimalFormat)nf).applyPattern("00000.###E0"); 447 setDigits(nf, 5, 5, 370, 0); 448 449 // From: 1234567890.012...78901234567890 450 // To: 12345.67890012...789012346E5 451 formatted.setLength(0); 452 from = "1234567890." + fra + "0123456789"; 453 to = "12345.67890" + fra + "01235E5"; 454 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 455 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 456 457 /* ------------------------------------------------------------------ */ 458 459 ((DecimalFormat)nf).applyPattern("0.###E0"); 460 setDigits(nf, 1, 1, 364, 0); 461 462 // From: -0.000...0001012...7890123456789 463 // To: -1.012...789012E-361 464 formatted.setLength(0); 465 from = "-0." + nonsep_zero + "1" + fra + "0123456789"; 466 to = "-1." + fra + "0123E-361"; 467 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 468 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 469 470 /* ------------------------------------------------------------------ */ 471 472 ((DecimalFormat)nf).applyPattern("0.###E0"); 473 setDigits(nf, 1, 1, 366, 0); 474 475 // From: 1012...78901234567890 476 // To: 1.012...789012346E370 477 formatted.setLength(0); 478 from = "1" + fra + "0123456789"; 479 to = "1." + fra + "012346E370"; 480 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 481 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 482 483 /* ------------------------------------------------------------------ */ 484 485 ((DecimalFormat)nf).applyPattern("0.###E0"); 486 setDigits(nf, 1, 1, 363, 0); 487 488 // From: -1012...7890123456789 489 // To: -1.012...789012E370 490 formatted.setLength(0); 491 from = "-1" + fra + "0123456789"; 492 to = "-1." + fra + "012E370"; 493 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 494 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 495 496 /* ------------------------------------------------------------------ */ 497 498 ((DecimalFormat)nf).applyPattern("#,##0.###"); 499 setDigits(nf, Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 720); 500 501 // From: 1234...78900000...0000.0...0 502 // To: 1,234...7,890,000,0...0,000.0...0 503 formatted.setLength(0); 504 from = nonsep_int + nonsep_zero + "." + nonsep_zero + nonsep_zero; 505 to = sep_int + "," + sep_zero + "." + nonsep_zero + nonsep_zero; 506 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 507 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 508 509 /* ------------------------------------------------------------------ */ 510 511 // From: -1234...78900000...0000.0...0 512 // To: -1,234...7,890,000,0...0,000.0...0 513 formatted.setLength(0); 514 from = "-" + nonsep_int + nonsep_zero + "." + nonsep_zero + nonsep_zero; 515 to = "-" + sep_int + "," + sep_zero + "." + nonsep_zero + nonsep_zero; 516 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 517 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 518 } 519 520 /** 521 * Test for normal big numbers which have the fraction part with multiplier 522 */ 523 void test_Format_in_NumberFormat_BigDecimal_usingMultiplier() { 524 String from, to; 525 526 NumberFormat nf = NumberFormat.getInstance(Locale.US); 527 ((DecimalFormat)nf).applyPattern("#,##0.###"); 528 setDigits(nf, Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 0); 529 ((DecimalFormat)nf).setMultiplier(250000000); 530 ((DecimalFormat)nf).setDecimalSeparatorAlwaysShown(true); 531 532 // From: 1000...0000.000...000 533 // To: 250,0...0,000. 534 formatted.setLength(0); 535 from = "1" + nonsep_zero + "." + nonsep_zero; 536 to = "250,000,000," + sep_zero + "."; 537 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 538 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 539 540 /* ------------------------------------------------------------------ */ 541 542 ((DecimalFormat)nf).setDecimalSeparatorAlwaysShown(false); 543 544 // From: -1000...0000.000...000 545 // To: -250,0...0,000 546 formatted.setLength(0); 547 from = "-1" + nonsep_zero + "." + nonsep_zero; 548 to = "-250,000,000," + sep_zero; 549 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 550 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 551 552 /* ------------------------------------------------------------------ */ 553 554 ((DecimalFormat)nf).applyPattern("#,##0.###"); 555 setDigits(nf, Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 0); 556 ((DecimalFormat)nf).setMultiplier(-250000000); 557 ((DecimalFormat)nf).setDecimalSeparatorAlwaysShown(true); 558 559 // From: 1000...0000.000...000 560 // To: -250,0...0,000. 561 formatted.setLength(0); 562 from = "1" + nonsep_zero + "." + nonsep_zero; 563 to = "-250,000,000," + sep_zero + "."; 564 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 565 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 566 567 /* ------------------------------------------------------------------ */ 568 569 ((DecimalFormat)nf).setDecimalSeparatorAlwaysShown(false); 570 571 // From: -1000...0000.000...000 572 // To: 250,0...0,000 573 formatted.setLength(0); 574 from = "-1" + nonsep_zero + "." + nonsep_zero; 575 to = "250,000,000," + sep_zero; 576 nf.format(new BigDecimal(from), formatted, new FieldPosition(0)); 577 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 578 } 579 580 /** 581 * Test for normal big numbers which don't have the fraction part 582 */ 583 void test_Format_in_NumberFormat_BigInteger() { 584 String from, to; 585 586 NumberFormat nf = NumberFormat.getInstance(Locale.US); 587 if (!(nf instanceof DecimalFormat)) { 588 throw new RuntimeException("Couldn't get DecimalFormat instance."); 589 } 590 591 ((DecimalFormat)nf).applyPattern("#,##0.###"); 592 setDigits(nf, Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 0); 593 594 // From: 1234...7890 595 // To: 123,4...7,890 596 formatted.setLength(0); 597 from = nonsep_int; 598 to = sep_int; 599 nf.format(new BigInteger(from), formatted, new FieldPosition(0)); 600 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 601 602 /* ------------------------------------------------------------------ */ 603 604 // From: -1234...7890 605 // To: -123,4...7,890 606 // ~~~~~~~~~~~~~ : FieldPosition(INTEGER_FIELD) 607 fp = new FieldPosition(DecimalFormat.INTEGER_FIELD); 608 formatted.setLength(0); 609 from = "-" + nonsep_int; 610 to = "-" + sep_int; 611 nf.format(new BigInteger(from), formatted, fp); 612 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 613 checkFieldPosition(from, fp, 1, 480); 614 615 /* ------------------------------------------------------------------ */ 616 617 // From: 000...0001234...7890 618 // To: 123,4...7,890 619 formatted.setLength(0); 620 from = nonsep_zero + nonsep_int; 621 to = sep_int; 622 nf.format(new BigInteger(from), formatted, new FieldPosition(0)); 623 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 624 625 /* ------------------------------------------------------------------ */ 626 627 // From: -000...0001234...7890 628 // To: -123,4...7,890 629 // ~ : FieldPosition(SIGN) 630 fp = new FieldPosition(NumberFormat.Field.SIGN); 631 formatted.setLength(0); 632 from = "-" + nonsep_zero + nonsep_int; 633 to = "-" + sep_int; 634 nf.format(new BigInteger(from), formatted, fp); 635 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 636 checkFieldPosition(from, fp, 0, 1); 637 638 /* ------------------------------------------------------------------ */ 639 640 // From: 000...0000 641 // To: 0 642 formatted.setLength(0); 643 from = nonsep_zero; 644 to = "0"; 645 nf.format(new BigInteger(from), formatted, new FieldPosition(0)); 646 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 647 648 /* ------------------------------------------------------------------ */ 649 650 ((DecimalFormat)nf).applyPattern("#,##0.0"); 651 setDigits(nf, Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 1); 652 653 // From: -000...0000 654 // To: 0.0 655 fp = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR); 656 formatted.setLength(0); 657 from = "-" + nonsep_zero; 658 to = "0.0"; 659 nf.format(new BigInteger(from), formatted, fp); 660 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 661 checkFieldPosition(from, fp, 1, 2); 662 663 /* ------------------------------------------------------------------ */ 664 665 ((DecimalFormat)nf).applyPattern("0.###E0"); 666 setDigits(nf, 1, 1, Integer.MAX_VALUE, 0); 667 668 // From: 10123...789 669 // To : 1.0123...789E360 670 // ~~~ : FieldPosition(EXPONENT) 671 fp = new FieldPosition(NumberFormat.Field.EXPONENT); 672 formatted.setLength(0); 673 from = "1" + fra; 674 to = "1." + fra + "E360"; 675 nf.format(new BigInteger(from), formatted, fp); 676 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 677 checkFieldPosition(from, fp, 363, 366); 678 679 /* ------------------------------------------------------------------ */ 680 681 // From: -1012...789 682 // To : -1.012...789E360 683 formatted.setLength(0); 684 from = "-1" + fra; 685 to = "-1." + fra + "E360"; 686 nf.format(new BigInteger(from), formatted, new FieldPosition(0)); 687 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 688 689 /* ------------------------------------------------------------------ */ 690 691 ((DecimalFormat)nf).applyPattern("00000.###E0"); 692 setDigits(nf, 5, 5, Integer.MAX_VALUE, 720); 693 694 // From: 12345012...789000...000 695 // To : 12345.012...789000...000E720 696 // ~~~ : FieldPosition(EXPONENT) 697 fp = new FieldPosition(NumberFormat.Field.EXPONENT); 698 formatted.setLength(0); 699 from = "12345" + fra + nonsep_zero; 700 to = "12345." + fra + nonsep_zero + "E720"; 701 nf.format(new BigInteger(from), formatted, fp); 702 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 703 checkFieldPosition(from, fp, 727, 730); 704 705 /* ------------------------------------------------------------------ */ 706 707 ((DecimalFormat)nf).applyPattern("00000.###E0"); 708 setDigits(nf, 5, 5, Integer.MAX_VALUE, 365); 709 710 // From: -1234567890012...789000...000 711 // To : -12345.67890012...789E365 712 formatted.setLength(0); 713 from = "-1234567890" + fra; 714 to = "-12345.67890" + fra + "E365"; 715 nf.format(new BigInteger(from), formatted, new FieldPosition(0)); 716 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 717 } 718 719 /** 720 * Test for normal big numbers which don't have the fraction part with 721 * multiplier 722 */ 723 void test_Format_in_NumberFormat_BigInteger_usingMultiplier() { 724 String from, to; 725 726 NumberFormat nf = NumberFormat.getInstance(Locale.US); 727 728 ((DecimalFormat)nf).applyPattern("#,##0.###"); 729 ((DecimalFormat)nf).setMultiplier(250000000); 730 setDigits(nf, Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 0); 731 732 // From: 1000...0000 733 // To: 250,0...0,000 734 formatted.setLength(0); 735 from = "1" + nonsep_zero; 736 to = "250,000,000," + sep_zero; 737 nf.format(new BigInteger(from), formatted, new FieldPosition(0)); 738 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 739 740 /* ------------------------------------------------------------------ */ 741 742 // From: -1000...0000 743 // To: -250,0...0,000 744 formatted.setLength(0); 745 from = "-1" + nonsep_zero; 746 to = "-250,000,000," + sep_zero; 747 nf.format(new BigInteger(from), formatted, new FieldPosition(0)); 748 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 749 /* ------------------------------------------------------------------ */ 750 751 ((DecimalFormat)nf).applyPattern("#,##0.###"); 752 ((DecimalFormat)nf).setMultiplier(-250000000); 753 setDigits(nf, Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 0); 754 755 // From: 1000...0000 756 // To: -250,0...0,000 757 formatted.setLength(0); 758 from = "1" + nonsep_zero; 759 to = "-250,000,000," + sep_zero; 760 nf.format(new BigInteger(from), formatted, new FieldPosition(0)); 761 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 762 763 /* ------------------------------------------------------------------ */ 764 765 // From: -1000...0000 766 // To: 250,0...0,000 767 formatted.setLength(0); 768 from = "-1" + nonsep_zero; 769 to = "250,000,000," + sep_zero; 770 nf.format(new BigInteger(from), formatted, new FieldPosition(0)); 771 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 772 } 773 774 /** 775 * Test for normal Long numbers when maximum and minimum digits are 776 * specified 777 */ 778 void test_Format_in_NumberFormat_Long_checkDigits() { 779 String from, to; 780 781 NumberFormat nf = NumberFormat.getInstance(Locale.US); 782 if (!(nf instanceof DecimalFormat)) { 783 throw new RuntimeException("Couldn't get DecimalFormat instance."); 784 } 785 786 ((DecimalFormat)nf).applyPattern("#,##0.###"); 787 setDigits(nf, Integer.MAX_VALUE, 360, Integer.MAX_VALUE, 0); 788 789 // From: 1234567890 790 // To: 000,0...0,000,123,456,789 791 // ------------- 792 // 300 zeros 793 formatted.setLength(0); 794 from = "123456789"; 795 to = sep_zero.substring(0, 399) + ",123,456,789"; 796 nf.format(new Long(from), formatted, new FieldPosition(0)); 797 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 798 799 /* ------------------------------------------------------------------ */ 800 801 ((DecimalFormat)nf).applyPattern("##0.###"); 802 ((DecimalFormat)nf).setMultiplier(-1); 803 setDigits(nf, Integer.MAX_VALUE, 360, Integer.MAX_VALUE, 360); 804 805 // From: 1234567890 806 // To: -0000...0000123456789.000...000 807 // ------------- 808 // 300 zeros 809 formatted.setLength(0); 810 from = "123456789"; 811 to = "-" + nonsep_zero.substring(0, 300) + "123456789." + 812 nonsep_zero.substring(0, 340); 813 nf.format(new Long(from), formatted, new FieldPosition(0)); 814 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 815 816 /* ------------------------------------------------------------------ */ 817 818 ((DecimalFormat)nf).applyPattern("#,##0.###"); 819 ((DecimalFormat)nf).setMultiplier(Integer.MAX_VALUE); 820 setDigits(nf, Integer.MAX_VALUE, 360, Integer.MAX_VALUE, 0); 821 822 // From: Long.MAX_VALUE 823 // To: 000,0...0,000,019,807,040,619,342,712,359,383,728,129 824 // --------------- 825 // 280 zeros 826 formatted.setLength(0); 827 from = Long.toString(Long.MAX_VALUE); 828 to = sep_zero.substring(0, 373) + 829 "19,807,040,619,342,712,359,383,728,129"; 830 nf.format(new Long(from), formatted, new FieldPosition(0)); 831 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 832 833 /* ------------------------------------------------------------------ */ 834 835 ((DecimalFormat)nf).applyPattern("0.###E0"); 836 ((DecimalFormat)nf).setMultiplier(Integer.MIN_VALUE); 837 setDigits(nf, 1, 1, Integer.MAX_VALUE, 360); 838 839 // From: Long.MAX_VALUE 840 // To: -1.9807040628566084396238503936000...000E28 841 // --------- 842 // 312 zeros 843 formatted.setLength(0); 844 from = Long.toString(Long.MAX_VALUE); 845 to = "-1.9807040628566084396238503936" + 846 nonsep_zero.substring(0, 312) + "E28"; 847 nf.format(new Long(from), formatted, new FieldPosition(0)); 848 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 849 850 /* ------------------------------------------------------------------ */ 851 852 ((DecimalFormat)nf).applyPattern("##0.###E0"); 853 ((DecimalFormat)nf).setMultiplier(Integer.MAX_VALUE); 854 setDigits(nf, Integer.MAX_VALUE, 360, Integer.MAX_VALUE, 360); 855 856 // From: Long.MIN_VALUE 857 // To: -198070406193427123615312117760000...0000.000...000E-280 858 // ----------- --------- 859 // 280 zeros 340 zeros 860 formatted.setLength(0); 861 from = Long.toString(Long.MIN_VALUE); 862 to = "-19807040619342712361531211776" + 863 nonsep_zero.substring(0, 280) + "." + 864 nonsep_zero.substring(0, 340) + "E-280"; 865 nf.format(new Long(from), formatted, new FieldPosition(0)); 866 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 867 868 /* ------------------------------------------------------------------ */ 869 870 ((DecimalFormat)nf).applyPattern("#,##0.###"); 871 ((DecimalFormat)nf).setMultiplier(Integer.MIN_VALUE); 872 setDigits(nf, Integer.MAX_VALUE, 360, Integer.MAX_VALUE, 360); 873 874 // From: Long.MIN_VALUE 875 // To: 000,0...0,000,019,807,040,628,566,084,398,385,987,584.000...000 876 // --------------- --------- 877 // 280 zeros 340 zeros 878 formatted.setLength(0); 879 from = Long.toString(Long.MIN_VALUE); 880 to = sep_zero.substring(0, 373) + 881 "19,807,040,628,566,084,398,385,987,584." + 882 nonsep_zero.substring(0, 340); 883 nf.format(new Long(from), formatted, new FieldPosition(0)); 884 checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier()); 885 } 886 887 /** 888 * Test for special numbers 889 * Double.NaN 890 * Double.POSITIVE_INFINITY 891 * Double.NEGATIVE_INFINITY 892 */ 893 void test_Format_in_NumberFormat_SpecialNumber() { 894 String from, to; 895 896 NumberFormat nf = NumberFormat.getInstance(Locale.US); 897 if (!(nf instanceof DecimalFormat)) { 898 throw new RuntimeException("Couldn't get DecimalFormat instance."); 899 } 900 901 ((DecimalFormat)nf).applyPattern("#,##0.###"); 902 setDigits(nf, Integer.MAX_VALUE, 1, Integer.MAX_VALUE, 0); 903 904 double[] numbers = { 905 -0.0, 0.0, Double.NaN, 906 Double.POSITIVE_INFINITY, 5.1, 5.0, 907 Double.NEGATIVE_INFINITY, -5.1, -5.0, 908 }; 909 int multipliers[] = {0, 5, -5}; 910 String[][] expected = { 911 {"-0", "0", "\ufffd", "\ufffd", "0", "0", "\ufffd", "-0", "-0"}, 912 {"-0", "0", "\ufffd", "\u221e", "25.5", "25", "-\u221e", "-25.5", 913 "-25"}, 914 {"0", "-0", "\ufffd", "-\u221e", "-25.5", "-25", "\u221e", "25.5", 915 "25"}, 916 }; 917 918 for (int i = 0; i < multipliers.length; i++) { 919 ((DecimalFormat)nf).setMultiplier(multipliers[i]); 920 for (int j = 0; j < numbers.length; j++) { 921 formatted.setLength(0); 922 from = String.valueOf(numbers[j]); 923 nf.format(numbers[j], formatted, new FieldPosition(0)); 924 checkFormat(from, formatted, expected[i][j], 925 ((DecimalFormat)nf).getMultiplier()); 926 } 927 } 928 } 929 930 /** 931 * Test for Long.MIN_VALUE 932 * (Formatting Long.MIN_VALUE w/ multiplier=-1 used to return a wrong 933 * number.) 934 */ 935 void test_Format_in_NumberFormat_Other() { 936 String from, to; 937 938 NumberFormat nf = NumberFormat.getInstance(Locale.US); 939 if (!(nf instanceof DecimalFormat)) { 940 throw new RuntimeException("Couldn't get DecimalFormat instance."); 941 } 942 943 long[] numbers = { 944 Long.MIN_VALUE, 945 }; 946 int multipliers[] = {1, -1}; 947 String[][] expected = { 948 {"-9,223,372,036,854,775,808"}, // Long.MIN_VALUE 949 {"9,223,372,036,854,775,808"}, // Long.MIN_VALUE * (-1) 950 }; 951 952 for (int i = 0; i < multipliers.length; i++) { 953 ((DecimalFormat)nf).setMultiplier(multipliers[i]); 954 for (int j = 0; j < numbers.length; j++) { 955 formatted.setLength(0); 956 from = String.valueOf(numbers[j]); 957 nf.format(numbers[j], formatted, new FieldPosition(0)); 958 checkFormat(from, formatted, expected[i][j], 959 ((DecimalFormat)nf).getMultiplier()); 960 } 961 } 962 } 963 964 /** 965 * Test for MessageFormat 966 */ 967 void test_Format_in_MessageFormat() { 968 MessageFormat mf = new MessageFormat( 969 " {0, number}\n" + 970 " {0, number, integer}\n" + 971 " {0, number, currency}\n" + 972 " {0, number, percent}\n" + 973 " {0, number,0.###########E0}\n" + 974 975 " {1, number}\n" + 976 " {1, number, integer}\n" + 977 " {1, number, currency}\n" + 978 " {1, number, percent}\n" + 979 " {1, number,0.#######E0}\n", 980 Locale.US 981 ); 982 Object[] testArgs = { 983 new BigInteger("9876543210987654321098765432109876543210"), 984 new BigDecimal("-12345678901234567890.98765432109876543210987654321"), 985 }; 986 String expected = 987 " 9,876,543,210,987,654,321,098,765,432,109,876,543,210\n" + 988 " 9,876,543,210,987,654,321,098,765,432,109,876,543,210\n" + 989 " $9,876,543,210,987,654,321,098,765,432,109,876,543,210.00\n" + 990 " 987,654,321,098,765,432,109,876,543,210,987,654,321,000%\n" + 991 " 9.87654321099E39\n" + 992 993 " -12,345,678,901,234,567,890.988\n" + 994 " -12,345,678,901,234,567,891\n" + 995 " ($12,345,678,901,234,567,890.99)\n" + 996 " -1,234,567,890,123,456,789,099%\n" + 997 " -1.2345679E19\n" 998 ; 999 1000 if (!expected.equals(mf.format(testArgs))) { 1001 errln("Wrong format.\n got:\n" + mf.format(testArgs) + 1002 " expected:\n" + expected); 1003 } 1004 } 1005 1006 private void setDigits(NumberFormat nf, 1007 int i_max, int i_min, int f_max, int f_min) { 1008 nf.setMaximumIntegerDigits(i_max); 1009 nf.setMinimumIntegerDigits(i_min); 1010 nf.setMaximumFractionDigits(f_max); 1011 nf.setMinimumFractionDigits(f_min); 1012 } 1013 1014 private void checkFormat(String orig, StringBuffer got, String expected, 1015 int multiplier) { 1016 if (!expected.equals(new String(got))) { 1017 errln("Formatting... failed." + 1018 "\n original: " + orig + 1019 "\n multiplier: " + multiplier + 1020 "\n formatted: " + got + 1021 "\n expected: " + expected + "\n"); 1022 } 1023 } 1024 1025 private void checkFieldPosition(String orig, FieldPosition fp, int begin, 1026 int end) { 1027 int position; 1028 1029 if ((position = fp.getBeginIndex()) != begin) { 1030 errln("Formatting... wrong Begin index returned for " + 1031 fp.getFieldAttribute() + "." + 1032 "\n original: " + orig + 1033 "\n got: " + position + 1034 "\n expected: " + begin + "\n"); 1035 } 1036 if ((position = fp.getEndIndex()) != end) { 1037 errln("Formatting... wrong End index returned for " + 1038 fp.getFieldAttribute() + "." + 1039 "\n original: " + orig + 1040 "\n got: " + position + 1041 "\n expected: " + end + "\n"); 1042 } 1043 } 1044 }