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 BigDecimalParse 30 */ 31 32 import java.math.BigDecimal; 33 import java.text.*; 34 import java.util.*; 35 36 public class BigDecimalParse extends IntlTest { 37 38 public static void main(String[] args) throws Exception { 39 Locale loc = Locale.getDefault(); 40 try { 41 Locale.setDefault(Locale.US); 42 new BigDecimalParse().run(args); 43 } finally { 44 // restore the reserved locale 45 Locale.setDefault(loc); 46 } 47 } 48 49 static final String nonsep_int = 50 "123456789012345678901234567890123456789012345678901234567890" + 51 "123456789012345678901234567890123456789012345678901234567890" + 52 "123456789012345678901234567890123456789012345678901234567890" + 53 "123456789012345678901234567890123456789012345678901234567890" + 54 "123456789012345678901234567890123456789012345678901234567890" + 55 "123456789012345678901234567890123456789012345678901234567890"; 56 57 static final String sep_int = 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 "123,456,789,012,345,678,901,234,567,890," + 65 "123,456,789,012,345,678,901,234,567,890," + 66 "123,456,789,012,345,678,901,234,567,890," + 67 "123,456,789,012,345,678,901,234,567,890," + 68 "123,456,789,012,345,678,901,234,567,890," + 69 "123,456,789,012,345,678,901,234,567,890"; 70 71 static final String nonsep_zero = 72 "000000000000000000000000000000000000000000000000000000000000" + 73 "000000000000000000000000000000000000000000000000000000000000" + 74 "000000000000000000000000000000000000000000000000000000000000" + 75 "000000000000000000000000000000000000000000000000000000000000" + 76 "000000000000000000000000000000000000000000000000000000000000" + 77 "000000000000000000000000000000000000000000000000000000000000"; 78 79 static final String sep_zero = 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 "000,000,000,000,000,000,000,000,000,000," + 87 "000,000,000,000,000,000,000,000,000,000," + 88 "000,000,000,000,000,000,000,000,000,000," + 89 "000,000,000,000,000,000,000,000,000,000," + 90 "000,000,000,000,000,000,000,000,000,000," + 91 "000,000,000,000,000,000,000,000,000,000"; 92 93 static final String fra = 94 "012345678901234567890123456789012345678901234567890123456789" + 95 "012345678901234567890123456789012345678901234567890123456789" + 96 "012345678901234567890123456789012345678901234567890123456789" + 97 "012345678901234567890123456789012345678901234567890123456789" + 98 "012345678901234567890123456789012345678901234567890123456789" + 99 "012345678901234567890123456789012345678901234567890123456789"; 100 101 102 Number parsed = null; 103 ParsePosition pp; 104 boolean exceptionOccurred; 105 String msg; 106 DecimalFormat df; 107 108 /** 109 * Test for normal big numbers which have the fraction part 110 */ 111 void test_Parse_in_DecimalFormat_BigDecimal() { 112 df = new DecimalFormat(); 113 df.setParseBigDecimal(true); 114 115 // From: 1234...7890.012...789 116 // To: BigDecimal 1234...7890.012...789 117 check(nonsep_int + "." + fra, new BigDecimal(nonsep_int + "." + fra)); 118 119 // From: -1,234...7,890.012...789 120 // To: BigDecimal -1234...7890.012...789 121 check("-" + sep_int + "." + fra, 122 new BigDecimal("-" + nonsep_int + "." + fra)); 123 124 // From: 000...0000.0...0 125 // To: BigDecimal 0E-360 126 check(nonsep_zero + "." + nonsep_zero, 127 new BigDecimal(nonsep_zero + "." + nonsep_zero)); 128 129 // From: 0.000...0000123...789E370 130 // To: BigDecimal 0.0123...789 131 check("0.0000000000" + nonsep_zero + fra + "E370", 132 new BigDecimal("0.0000000000" + nonsep_zero + fra + "E370")); 133 134 // From: 0.1123...890E-360 135 // To: BigDecimal 1.123...890E-361 136 check("0.1" + nonsep_int + "E-360", 137 new BigDecimal("0.1" + nonsep_int + "E-360")); 138 139 // From: 000...0000.0...0123...7890 140 // To: BigDecimal 1.234...890E-361 141 check(nonsep_zero + "." + nonsep_zero + nonsep_int, 142 new BigDecimal(nonsep_zero + "." + nonsep_zero + nonsep_int)); 143 144 // From: 0.123...890E360 145 // To: BigDecimal 123...890 146 check("0." + nonsep_int + "E360", 147 new BigDecimal("0." + nonsep_int + "E360")); 148 } 149 150 /** 151 * Test for normal big numbers which have the fraction part with multiplier 152 */ 153 void test_Parse_in_DecimalFormat_BigDecimal_usingMultiplier() { 154 df = new DecimalFormat(); 155 df.setParseBigDecimal(true); 156 157 // From: 250,0...0,000.000...000 158 // To: 1000...0000.000...000 159 df.setMultiplier(250000000); 160 check("250,000,000," + sep_zero + "." + nonsep_zero, 161 new BigDecimal("1" + nonsep_zero + "." + nonsep_zero)); 162 163 // From: -250,0...0,000.000...000 164 // To: -1000...0000.000...000 165 check("-250,000,000," + sep_zero + "." + nonsep_zero, 166 new BigDecimal("-1" + nonsep_zero + "." + nonsep_zero)); 167 168 // From: 250,0...0,000.000...000 169 // To: -1000...0000.000...000 170 df.setMultiplier(-250000000); 171 check("250,000,000," + sep_zero + "." + nonsep_zero, 172 new BigDecimal("-1" + nonsep_zero + "." + nonsep_zero)); 173 174 // From: -250,0...0,000.000...000 175 // To: 1000...0000.000...000 176 check("-250,000,000," + sep_zero + "." + nonsep_zero, 177 new BigDecimal("1" + nonsep_zero + "." + nonsep_zero)); 178 179 // Confirm that ArithmeticException is handled properly 180 // From: 1000.000 181 // To: 333.333 182 df.setMultiplier(3); 183 check("1000.000", new BigDecimal("333.333")); 184 185 // Confirm that ArithmeticException is handled properly 186 // From: 10000.0000 187 // To: 303.0303 188 df.setMultiplier(33); 189 check("10000.0000", new BigDecimal("303.0303")); 190 } 191 192 /** 193 * Test for division by zero (BigDecimal) 194 */ 195 void test_Parse_in_DecimalFormat_BigDecimal_DivisionByZero() { 196 df = new DecimalFormat(); 197 df.setParseBigDecimal(true); 198 df.setMultiplier(0); 199 200 // From: 1000.000 201 // To: Double.POSITIVE_INFINITY 202 check("1000.000", new Double(Double.POSITIVE_INFINITY)); 203 204 // From: -1000 205 // To: Double.NEGATIVE_INFINITY 206 check("-1000", new Double(Double.NEGATIVE_INFINITY)); 207 208 // From: -0.00 209 // To: Double.NaN 210 check("-0.00", new Double(Double.NaN)); 211 } 212 213 /** 214 * Test for division by zero (Double) 215 */ 216 void test_Parse_in_DecimalFormat_Double_DivisionByZero() { 217 df = new DecimalFormat(); 218 df.setParseBigDecimal(false); 219 df.setMultiplier(0); 220 221 // From: 1000.000 222 // To: Double.POSITIVE_INFINITY 223 check("1000.000", new Double(Double.POSITIVE_INFINITY)); 224 225 // From: -1000.000 226 // To: Double.NEGATIVE_INFINITY 227 check("-1000.000", new Double(Double.NEGATIVE_INFINITY)); 228 229 // From: 0.0 230 // To: Double.NaN 231 check("0.0", new Double(Double.NaN)); 232 233 // From: -0.0 (Double) 234 // To: Double.NaN 235 check("-0.0", new Double(Double.NaN)); 236 237 // From: Double.NaN 238 // To: Double.NaN 239 check("\ufffd", new Double(Double.NaN)); 240 241 // From: Double.POSITIVE_INFINITY 242 // To: Double.NaN 243 check("\u221e", new Double(Double.POSITIVE_INFINITY)); 244 245 // From: Double.NEGATIVE_INFINITY 246 // To: Double.NaN 247 check("-\u221e", new Double(Double.NEGATIVE_INFINITY)); 248 } 249 250 /** 251 * Test for division by zero (Long) 252 */ 253 void test_Parse_in_DecimalFormat_Long_DivisionByZero() { 254 df = new DecimalFormat(); 255 df.setParseBigDecimal(false); 256 df.setMultiplier(0); 257 258 // From: 1000 259 // To: Double.POSITIVE_INFINITY 260 check("1000", new Double(Double.POSITIVE_INFINITY)); 261 262 // From: -1000 263 // To: Double.NEGATIVE_INFINITY 264 check("-1000", new Double(Double.NEGATIVE_INFINITY)); 265 266 // From: -000 (Long) 267 // To: Double.NaN 268 check("-000", new Double(Double.NaN)); 269 } 270 271 /** 272 * Test for normal big numbers which don't have the fraction part 273 */ 274 void test_Parse_in_DecimalFormat_BigInteger() { 275 df = new DecimalFormat(); 276 df.setParseBigDecimal(true); 277 278 // From: 123...890 279 // To: BigDecimal 123...890 280 check(nonsep_int + nonsep_int, new BigDecimal(nonsep_int + nonsep_int)); 281 282 // From: 123,4...7,890 283 // To: BigDecimal 1234...7890 284 check(sep_int + "," + sep_int, new BigDecimal(nonsep_int + nonsep_int)); 285 286 // From: -000...000123...890 287 // To: BigDecimal -123...890 288 check("-" + nonsep_zero + nonsep_int, new BigDecimal("-" + nonsep_int)); 289 290 // From: -000,0...0,000,123,4...7,890 291 // To: BigDecimal -123...890 292 check("-" + sep_zero + "," + sep_int, new BigDecimal("-" + nonsep_int)); 293 } 294 295 /** 296 * Test for normal big numbers which don't have the fraction part with 297 * multiplier 298 */ 299 void test_Parse_in_DecimalFormat_BigInteger_usingMultiplier() { 300 df = new DecimalFormat(); 301 df.setParseBigDecimal(true); 302 303 // From: 250,0...0,000 304 // To: 1000...0000 305 df.setMultiplier(250000000); 306 check("250,000,000," + sep_zero, new BigDecimal("1" + nonsep_zero)); 307 308 // From: -250,0...0,000 309 // To: -1000...0000 310 check("-250,000,000," + sep_zero, new BigDecimal("-1" + nonsep_zero)); 311 312 // From: 250,0...0,000 313 // To: -1000...0000 314 df.setMultiplier(-250000000); 315 check("250,000,000," + sep_zero, new BigDecimal("-1" + nonsep_zero)); 316 317 // From: -250,0...0,000 318 // To: 1000...0000 319 check("-250,000,000," + sep_zero, new BigDecimal("1" + nonsep_zero)); 320 321 // From: 250,0...0,000E-360 322 // To: -1000...0000.000...000 323 check("250,000,000," + sep_zero + "," + sep_zero + "E-360", 324 new BigDecimal("-1" + nonsep_zero + "." + nonsep_zero)); 325 326 // Confirm that a division which results in a irrational number is done 327 // properly 328 // From: 1000 329 // To: 333 330 df.setMultiplier(3); 331 check("1000", new BigDecimal("333")); 332 } 333 334 /** 335 * Test for special numbers 336 * Double.NaN 337 * Double.POSITIVE_INFINITY 338 * Double.NEGATIVE_INFINITY 339 */ 340 void test_Parse_in_DecimalFormat_SpecialNumber() { 341 df = new DecimalFormat(); 342 df.setParseBigDecimal(true); 343 344 String[] numbers = { 345 "0", "0.0", "25", "25.0", "25.5", "\u221e", "\ufffd", 346 "-0", "-0.0", "-25", "-25.0", "-25.5", "-\u221e", 347 }; 348 int multipliers[] = {5, -5}; 349 Number[][] expected = { 350 { 351 new BigDecimal("0"), new BigDecimal("0.0"), new BigDecimal("5"), 352 new BigDecimal("5.0"), new BigDecimal("5.1"), 353 new Double(Double.POSITIVE_INFINITY), new Double(Double.NaN), 354 new BigDecimal("0"), new BigDecimal("0.0"), 355 new BigDecimal("-5"), new BigDecimal("-5.0"), 356 new BigDecimal("-5.1"), 357 new Double(Double.NEGATIVE_INFINITY), new Double(Double.NaN), 358 }, 359 { 360 new BigDecimal("0"), new BigDecimal("0.0"), 361 new BigDecimal("-5"), new BigDecimal("-5.0"), 362 new BigDecimal("-5.1"), 363 new Double(Double.NEGATIVE_INFINITY), new Double(Double.NaN), 364 new BigDecimal("0"), new BigDecimal("0.0"), new BigDecimal("5"), 365 new BigDecimal("5.0"), new BigDecimal("5.1"), 366 new Double(Double.POSITIVE_INFINITY), 367 }, 368 }; 369 370 for (int i = 0; i < multipliers.length; i++) { 371 df.setMultiplier(multipliers[i]); 372 for (int j = 0; j < numbers.length; j++) { 373 check(String.valueOf(numbers[j]), expected[i][j]); 374 } 375 } 376 } 377 378 /** 379 * Test for special numbers 380 */ 381 void test_Parse_in_DecimalFormat_Other() { 382 df = new DecimalFormat(); 383 df.setParseBigDecimal(true); 384 385 String[] numbers = { 386 "-9223372036854775808", // Long.MIN_VALUE 387 }; 388 int multipliers[] = {1, -1}; 389 String[][] expected = { 390 {"-9223372036854775808"}, // Long.MIN_VALUE 391 {"9223372036854775808"}, // Long.MAX_VALUE+1 = abs(MIN_VALUE) 392 }; 393 394 for (int i = 0; i < multipliers.length; i++) { 395 df.setMultiplier(multipliers[i]); 396 for (int j = 0; j < numbers.length; j++) { 397 check(String.valueOf(numbers[j]), 398 new BigDecimal(expected[i][j])); 399 } 400 } 401 } 402 403 static final String[] patterns = { 404 " {0, number} ", 405 " {0, number} ", 406 " {0, number, currency} ", 407 " {0, number, currency} ", 408 " {0, number, percent} ", 409 " {0, number, percent} ", 410 " {0, number,#,##0.###E0} ", 411 " {0, number,#,##0.###E0} ", 412 413 " {0, number} ", 414 " {0, number} ", 415 " {0, number, integer} ", 416 " {0, number, integer} ", 417 " {0, number, currency} ", 418 " {0, number, currency} ", 419 " {0, number, percent} ", 420 " {0, number, percent} ", 421 " {0, number,#,##0.###E0} ", 422 " {0, number,#,##0.###E0} ", 423 }; 424 static final String[] from = { 425 " 12,345,678,901,234,567,890.98765432109876543210987654321 ", 426 " -12,345,678,901,234,567,890.98765432109876543210987654321 ", 427 " $12,345,678,901,234,567,890.98765432109876543210987654321 ", 428 " ($12,345,678,901,234,567,890.98765432109876543210987654321) ", 429 " 1,234,567,890,123,456,789,098.76543210987654321098765432100% ", 430 " -1,234,567,890,123,456,789,098.76543210987654321098765432100% ", 431 " 12,345,678,901,234,567,890.98765432109876543210987654321E-20 ", 432 " -12,345,678,901,234,567,890.98765432109876543210987654321E-20 ", 433 434 " 9,876,543,210,987,654,321,098,765,432,109,876,543,210 ", 435 " -9,876,543,210,987,654,321,098,765,432,109,876,543,210 ", 436 " 9,876,543,210,987,654,321,098,765,432,109,876,543,210E5 ", 437 " -9,876,543,210,987,654,321,098,765,432,109,876,543,210E-5 ", 438 " $9,876,543,210,987,654,321,098,765,432,109,876,543,210.00 ", 439 " ($9,876,543,210,987,654,321,098,765,432,109,876,543,210.00) ", 440 " 987,654,321,098,765,432,109,876,543,210,987,654,321,012% ", 441 " -987,654,321,098,765,432,109,876,543,210,987,654,321,012% ", 442 " 98,765,432,109,876,543,210.98765432109876543210E20 ", 443 " -987,654,321,098,765,432,109,876,543,210,987,654,321,000,000,000,000,000,000,000E-20 ", 444 }; 445 446 static final String[] expected1 = { // isParseIntegerOnly() == false 447 "12345678901234567890.98765432109876543210987654321", 448 "-12345678901234567890.98765432109876543210987654321", 449 "12345678901234567890.98765432109876543210987654321", 450 "-12345678901234567890.98765432109876543210987654321", 451 "12345678901234567890.98765432109876543210987654321", 452 "-12345678901234567890.98765432109876543210987654321", 453 "0.1234567890123456789098765432109876543210987654321", 454 "-0.1234567890123456789098765432109876543210987654321", 455 456 "9876543210987654321098765432109876543210", 457 "-9876543210987654321098765432109876543210", 458 "9.876543210987654321098765432109876543210E44", 459 "-98765432109876543210987654321098765.43210", 460 "9876543210987654321098765432109876543210.00", 461 "-9876543210987654321098765432109876543210.00", 462 "9876543210987654321098765432109876543210.12", 463 "-9876543210987654321098765432109876543210.12", 464 "9876543210987654321098765432109876543210", 465 "-9876543210987654321098765432109876543210.00000000000000000000", 466 }; 467 static final int[] parsePosition1 = { 468 60, 61, 61, 63, 64, 65, 64, 65, 469 57, 58, 59, 61, 61, 63, 60, 61, 54, 88, 470 }; 471 472 /** 473 * Test for MessageFormat: setParseIntegerOnly(false) 474 */ 475 void test_Parse_in_MessageFormat_NotParseIntegerOnly() { 476 for (int i=0; i < patterns.length; i++) { 477 pp = new ParsePosition(0); 478 Object[] parsed = null; 479 480 try { 481 MessageFormat mf = new MessageFormat(patterns[i]); 482 Format[] formats = mf.getFormats(); 483 for (int j=0; j < formats.length; j++) { 484 ((DecimalFormat)formats[j]).setParseBigDecimal(true); 485 } 486 487 parsed = mf.parse(from[i], pp); 488 489 if (pp.getErrorIndex() != -1) { 490 errln("Case" + (i+1) + 491 ": getErrorIndex() returns wrong value. expected:-1, got:"+ 492 pp.getErrorIndex() + " for " + from[i]); 493 } 494 if (pp.getIndex() != parsePosition1[i]) { 495 errln("Case" + (i+1) + 496 ": getIndex() returns wrong value. expected:" + 497 parsePosition1[i] + ", got:"+ pp.getIndex() + 498 " for " + from[i]); 499 } 500 } 501 catch(Exception e) { 502 errln("Unexpected exception: " + e.getMessage()); 503 } 504 505 checkType(from[i], getType(new BigDecimal(expected1[i])), 506 getType((Number)parsed[0])); 507 checkParse(from[i], new BigDecimal(expected1[i]), 508 (Number)parsed[0]); 509 } 510 } 511 512 static final String[] expected2 = { // isParseIntegerOnly() == true 513 "12345678901234567890", 514 "-12345678901234567890", 515 "12345678901234567890", 516 "-12345678901234567890", 517 "12345678901234567890", 518 "-12345678901234567890", 519 "0", 520 "0", 521 522 "9876543210987654321098765432109876543210", 523 "-9876543210987654321098765432109876543210", 524 "9.876543210987654321098765432109876543210E44", 525 "-98765432109876543210987654321098765.43210", 526 "9876543210987654321098765432109876543210", 527 "-9876543210987654321098765432109876543210", 528 "9876543210987654321098765432109876543210.12", 529 "-9876543210987654321098765432109876543210.12", 530 "9876543210987654321098765432109876543210", 531 "-9876543210987654321098765432109876543210.00000000000000000000", 532 }; 533 static final int[][] parsePosition2 = { // {errorIndex, index} 534 /* 535 * Should keep in mind that the expected result is different from 536 * DecimalFormat.parse() for some cases. 537 */ 538 {28, 0}, // parsing stopped at '.' 539 {29, 0}, // parsing stopped at '.' 540 {29, 0}, // parsing stopped at '.' 541 {2, 0}, // parsing stopped at '(' because cannot find ')' 542 {2, 0}, // parsing stopped at the first numeric 543 // because cannot find '%' 544 {2, 0}, // parsing stopped at the first numeric 545 // because cannot find '%' 546 {28, 0}, // parsing stopped at '.' 547 {29, 0}, // parsing stopped at '.' 548 549 {-1, 57}, {-1, 58}, {-1, 59}, {-1, 61}, 550 {56, 0}, // parsing stopped at '.' 551 // because cannot find '%' 552 {2, 0}, // parsing stopped at '(' because cannot find ')' 553 {-1, 60}, {-1, 61}, 554 {28, 0}, // parsing stopped at '.' 555 {-1, 88}, 556 }; 557 558 /** 559 * Test for MessageFormat: setParseIntegerOnly(true) 560 */ 561 void test_Parse_in_MessageFormat_ParseIntegerOnly() { 562 for (int i=0; i < patterns.length; i++) { 563 pp = new ParsePosition(0); 564 Object[] parsed = null; 565 566 try { 567 MessageFormat mf = new MessageFormat(patterns[i]); 568 Format[] formats = mf.getFormats(); 569 for (int j=0; j < formats.length; j++) { 570 ((DecimalFormat)formats[j]).setParseBigDecimal(true); 571 ((DecimalFormat)formats[j]).setParseIntegerOnly(true); 572 } 573 574 parsed = mf.parse(from[i], pp); 575 576 if (pp.getErrorIndex() != parsePosition2[i][0]) { 577 errln("Case" + (i+1) + 578 ": getErrorIndex() returns wrong value. expected:" + 579 parsePosition2[i][0] + ", got:"+ pp.getErrorIndex() + 580 " for " + from[i]); 581 } 582 if (pp.getIndex() != parsePosition2[i][1]) { 583 errln("Case" + (i+1) + 584 ": getIndex() returns wrong value. expected:" + 585 parsePosition2[i][1] + ", got:"+ pp.getIndex() + 586 " for " + from[i]); 587 } 588 } 589 catch(Exception e) { 590 errln("Unexpected exception: " + e.getMessage()); 591 } 592 593 if (parsePosition2[i][0] == -1) { 594 checkType(from[i], getType(new BigDecimal(expected2[i])), 595 getType((Number)parsed[0])); 596 checkParse(from[i], new BigDecimal(expected2[i]), 597 (Number)parsed[0]); 598 } 599 } 600 } 601 602 static final String[] from3 = { 603 "12,345,678,901,234,567,890.98765432109876543210987654321", 604 "-12,345,678,901,234,567,890.98765432109876543210987654321", 605 "9,876,543,210,987,654,321,098,765,432,109,876,543,210", 606 "-9,876,543,210,987,654,321,098,765,432,109,876,543,210", 607 "1234556790000E-8", 608 }; 609 static final String[] expected3 = { 610 "12345678901234567890", 611 "-12345678901234567890", 612 "9876543210987654321098765432109876543210", 613 "-9876543210987654321098765432109876543210", 614 "12345.56790000", 615 }; 616 static final int[][] parsePosition3 = { // {errorIndex, index} 617 {-1, 26}, 618 {-1, 27}, 619 {-1, 53}, 620 {-1, 54}, 621 {-1, 16}, 622 }; 623 624 /** 625 * Test for DecimalFormat: setParseIntegerOnly(true) 626 */ 627 void test_Parse_in_DecimalFormat_ParseIntegerOnly() { 628 DecimalFormat df = (DecimalFormat)NumberFormat.getIntegerInstance(); 629 df.setParseBigDecimal(true); 630 631 for (int i=0; i < from3.length; i++) { 632 pp = new ParsePosition(0); 633 Number parsed = null; 634 635 try { 636 parsed = df.parse(from3[i], pp); 637 638 if (pp.getErrorIndex() != parsePosition3[i][0]) { 639 errln("Case" + (i+1) + 640 ": getErrorIndex() returns wrong value. expected:" + 641 parsePosition3[i][0] + ", got:"+ pp.getErrorIndex() + 642 " for " + from3[i]); 643 } 644 if (pp.getIndex() != parsePosition3[i][1]) { 645 errln("Case" + (i+1) + 646 ": getIndex() returns wrong value. expected:" + 647 parsePosition3[i][1] + ", got:"+ pp.getIndex() + 648 " for " + from3[i]); 649 } 650 } 651 catch(Exception e) { 652 errln("Unexpected exception: " + e.getMessage()); 653 } 654 655 if (parsePosition3[i][0] == -1) { 656 checkType(from3[i], getType(new BigDecimal(expected3[i])), 657 getType(parsed)); 658 checkParse(from3[i], new BigDecimal(expected3[i]), parsed); 659 } 660 } 661 } 662 663 protected void check(String from, Number to) { 664 pp = new ParsePosition(0); 665 try { 666 parsed = df.parse(from, pp); 667 } 668 catch(Exception e) { 669 exceptionOccurred = true; 670 errln(e.getMessage()); 671 } 672 if (!exceptionOccurred) { 673 checkParse(from, to, parsed); 674 checkType(from, getType(to), getType(parsed)); 675 checkParsePosition(from, from.length(), pp.getIndex()); 676 } 677 } 678 679 private void checkParse(String orig, Number expected, Number got) { 680 if (!expected.equals(got)) { 681 errln("Parsing... failed." + 682 "\n original: " + orig + 683 "\n parsed: " + got + 684 "\n expected: " + expected + "\n"); 685 } 686 } 687 688 private void checkType(String orig, String expected, String got) { 689 if (!expected.equals(got)) { 690 errln("Parsing... unexpected Class returned." + 691 "\n original: " + orig + 692 "\n got: " + got + 693 "\n expected: " + expected + "\n"); 694 } 695 } 696 697 private void checkParsePosition(String orig, int expected, int got) { 698 if (expected != got) { 699 errln("Parsing... wrong ParsePosition returned." + 700 "\n original: " + orig + 701 "\n got: " + got + 702 "\n expected: " + expected + "\n"); 703 } 704 } 705 706 private String getType(Number number) { 707 return number.getClass().getName(); 708 } 709 }