12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others. 22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert * Copyright (C) 2001-2016, International Business Machines Corporation and 6aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert * others. All Rights Reserved. 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Port From: ICU4C v1.8.1 : format : NumberFormatTest 12bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Source File: $ICU4oot/source/test/intltest/numfmtst.cpp 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/ 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format; 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubertimport java.io.IOException; 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.math.BigInteger; 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.AttributedCharacterIterator; 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition; 216bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Corneliusimport java.text.Format; 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException; 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition; 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.ArrayList; 2587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport java.util.Iterator; 2687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport java.util.List; 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale; 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Set; 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test; 312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.dev.test.TestFmwk; 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestUtil; 3487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPIC.FieldContainer; 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUConfig; 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.LocaleUtility; 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.data.ResourceReader; 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.data.TokenIterator; 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.math.BigDecimal; 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.math.MathContext; 41b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃnimport com.ibm.icu.text.CompactDecimalFormat; 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormat; 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols; 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DisplayContext; 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.MeasureFormat; 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat; 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat.NumberFormatFactory; 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat.SimpleNumberFormatFactory; 49e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃnimport com.ibm.icu.text.NumberingSystem; 50b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃnimport com.ibm.icu.text.RuleBasedNumberFormat; 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Currency; 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.CurrencyAmount; 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale; 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertpublic class NumberFormatTest extends TestFmwk { 562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 57bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert private static ULocale EN = new ULocale("en"); 582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 59bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert private static Number toNumber(String s) { 60bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (s.equals("NaN")) { 61bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return Double.NaN; 62bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else if (s.equals("-Inf")) { 63bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return Double.NEGATIVE_INFINITY; 64bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else if (s.equals("Inf")) { 65bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return Double.POSITIVE_INFINITY; 66bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 67bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return new BigDecimal(s); 68bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert private DataDrivenNumberFormatTestUtility.CodeUnderTest ICU = 722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert new DataDrivenNumberFormatTestUtility.CodeUnderTest() { 73bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 74bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public Character Id() { return 'J'; } 752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 76bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public String format(NumberFormatTestData tuple) { 78bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DecimalFormat fmt = newDecimalFormat(tuple); 79bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.format(toNumber(tuple.format)); 80bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.output; 81bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 82bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected " + expected + ", got " + actual; 83bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 84bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 85bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 86bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 87bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public String toPattern(NumberFormatTestData tuple) { 89bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DecimalFormat fmt = newDecimalFormat(tuple); 90bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert StringBuilder result = new StringBuilder(); 91bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.toPattern != null) { 92bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.toPattern; 93bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.toPattern(); 94bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 95bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert result.append("Expected toPattern=" + expected + ", got " + actual); 96bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 97bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 98bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.toLocalizedPattern != null) { 99bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.toLocalizedPattern; 100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.toLocalizedPattern(); 101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert result.append("Expected toLocalizedPattern=" + expected + ", got " + actual); 103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return result.length() == 0 ? null : result.toString(); 106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 1092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public String parse(NumberFormatTestData tuple) { 110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DecimalFormat fmt = newDecimalFormat(tuple); 111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert ParsePosition ppos = new ParsePosition(0); 112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number actual = fmt.parse(tuple.parse, ppos); 113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (ppos.getIndex() == 0) { 114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!tuple.output.equals("fail")) { 115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse error expected."; 116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.output.equals("fail")) { 120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse succeeded: "+actual+", but was expected to fail."; 121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number expected = toNumber(tuple.output); 123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // number types cannot be compared, this is the best we can do. 124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (expected.doubleValue() != (actual.doubleValue())) { 125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected: " + expected + ", got: " + actual; 126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 1292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 1312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public String parseCurrency(NumberFormatTestData tuple) { 132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DecimalFormat fmt = newDecimalFormat(tuple); 133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert ParsePosition ppos = new ParsePosition(0); 134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert CurrencyAmount currAmt = fmt.parseCurrency(tuple.parse, ppos); 135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (ppos.getIndex() == 0) { 136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!tuple.output.equals("fail")) { 137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse error expected."; 138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.output.equals("fail")) { 142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse succeeded: "+currAmt+", but was expected to fail."; 143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number expected = toNumber(tuple.output); 145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number actual = currAmt.getNumber(); 146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // number types cannot be compared, this is the best we can do. 147bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (expected.doubleValue() != (actual.doubleValue())) { 148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected: " + expected + ", got: " + actual; 149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 15087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!tuple.outputCurrency.equals(currAmt.getCurrency().toString())) { 152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected currency: " + tuple.outputCurrency + ", got: " + currAmt.getCurrency(); 153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert /** 158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param tuple 159bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @return 160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */ 1612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert private DecimalFormat newDecimalFormat(NumberFormatTestData tuple) { 16287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DecimalFormat fmt = new DecimalFormat( 164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.pattern == null ? "0" : tuple.pattern, 165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert new DecimalFormatSymbols(tuple.locale == null ? EN : tuple.locale)); 166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert adjustDecimalFormat(tuple, fmt); 167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return fmt; 168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert /** 170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param tuple 171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param fmt 172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */ 1732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert private void adjustDecimalFormat(NumberFormatTestData tuple, DecimalFormat fmt) { 174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minIntegerDigits != null) { 175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumIntegerDigits(tuple.minIntegerDigits); 176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxIntegerDigits != null) { 178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMaximumIntegerDigits(tuple.maxIntegerDigits); 179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minFractionDigits != null) { 181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumFractionDigits(tuple.minFractionDigits); 182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxFractionDigits != null) { 184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMaximumFractionDigits(tuple.maxFractionDigits); 185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.currency != null) { 187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setCurrency(tuple.currency); 188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minGroupingDigits != null) { 190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops we don't support this. 191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useSigDigits != null) { 193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setSignificantDigitsUsed( 194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.useSigDigits != 0); 195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minSigDigits != null) { 197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumSignificantDigits(tuple.minSigDigits); 198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxSigDigits != null) { 200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMaximumSignificantDigits(tuple.maxSigDigits); 201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useGrouping != null) { 203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setGroupingUsed(tuple.useGrouping != 0); 204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.multiplier != null) { 206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMultiplier(tuple.multiplier); 207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.roundingIncrement != null) { 209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setRoundingIncrement(tuple.roundingIncrement.doubleValue()); 210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.formatWidth != null) { 212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setFormatWidth(tuple.formatWidth); 213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.padCharacter != null && tuple.padCharacter.length() > 0) { 215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPadCharacter(tuple.padCharacter.charAt(0)); 216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useScientific != null) { 218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setScientificNotation(tuple.useScientific != 0); 219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.grouping != null) { 221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setGroupingSize(tuple.grouping); 222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.grouping2 != null) { 224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setSecondaryGroupingSize(tuple.grouping2); 225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.roundingMode != null) { 227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setRoundingMode(tuple.roundingMode); 228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.currencyUsage != null) { 230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setCurrencyUsage(tuple.currencyUsage); 231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } if (tuple.minimumExponentDigits != null) { 232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumExponentDigits( 233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.minimumExponentDigits.byteValue()); 234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.exponentSignAlwaysShown != null) { 236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setExponentSignAlwaysShown( 237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.exponentSignAlwaysShown != 0); 238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.decimalSeparatorAlwaysShown != null) { 240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setDecimalSeparatorAlwaysShown( 241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.decimalSeparatorAlwaysShown != 0); 242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.padPosition != null) { 244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPadPosition(tuple.padPosition); 245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.positivePrefix != null) { 247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPositivePrefix(tuple.positivePrefix); 248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.positiveSuffix != null) { 250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPositiveSuffix(tuple.positiveSuffix); 251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.negativePrefix != null) { 253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setNegativePrefix(tuple.negativePrefix); 254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.negativeSuffix != null) { 256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setNegativeSuffix(tuple.negativeSuffix); 257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.localizedPattern != null) { 259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.applyLocalizedPattern(tuple.localizedPattern); 260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert int lenient = tuple.lenient == null ? 1 : tuple.lenient.intValue(); 262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setParseStrict(lenient == 0); 263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.parseIntegerOnly != null) { 264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setParseIntegerOnly(tuple.parseIntegerOnly != 0); 265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.decimalPatternMatchRequired != null) { 267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setDecimalPatternMatchRequired(tuple.decimalPatternMatchRequired != 0); 268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.parseNoExponent != null) { 270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops, not supported for now 271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert }; 274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 2752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert private DataDrivenNumberFormatTestUtility.CodeUnderTest JDK = 2772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert new DataDrivenNumberFormatTestUtility.CodeUnderTest() { 278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public Character Id() { return 'K'; } 2802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 2822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public String format(NumberFormatTestData tuple) { 283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert java.text.DecimalFormat fmt = newDecimalFormat(tuple); 284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.format(toNumber(tuple.format)); 285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.output; 286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected " + expected + ", got " + actual; 288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 2932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public String toPattern(NumberFormatTestData tuple) { 294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert java.text.DecimalFormat fmt = newDecimalFormat(tuple); 295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert StringBuilder result = new StringBuilder(); 296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.toPattern != null) { 297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.toPattern; 298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.toPattern(); 299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert result.append("Expected toPattern=" + expected + ", got " + actual); 301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.toLocalizedPattern != null) { 304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.toLocalizedPattern; 305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.toLocalizedPattern(); 306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert result.append("Expected toLocalizedPattern=" + expected + ", got " + actual); 308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return result.length() == 0 ? null : result.toString(); 311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 3142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public String parse(NumberFormatTestData tuple) { 315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert java.text.DecimalFormat fmt = newDecimalFormat(tuple); 316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert ParsePosition ppos = new ParsePosition(0); 317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number actual = fmt.parse(tuple.parse, ppos); 318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (ppos.getIndex() == 0) { 319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!tuple.output.equals("fail")) { 320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse error expected."; 321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.output.equals("fail")) { 325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse succeeded: "+actual+", but was expected to fail."; 326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number expected = toNumber(tuple.output); 328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // number types cannot be compared, this is the best we can do. 329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (expected.doubleValue() != actual.doubleValue()) { 330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected: " + expected + ", got: " + actual; 331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 3342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 3352d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert /** 338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param tuple 339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @return 340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */ 3412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert private java.text.DecimalFormat newDecimalFormat(NumberFormatTestData tuple) { 342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert java.text.DecimalFormat fmt = new java.text.DecimalFormat( 343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.pattern == null ? "0" : tuple.pattern, 344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert new java.text.DecimalFormatSymbols( 345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert (tuple.locale == null ? EN : tuple.locale).toLocale())); 346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert adjustDecimalFormat(tuple, fmt); 347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return fmt; 348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert /** 351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param tuple 352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param fmt 353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */ 3542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert private void adjustDecimalFormat(NumberFormatTestData tuple, java.text.DecimalFormat fmt) { 355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minIntegerDigits != null) { 356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumIntegerDigits(tuple.minIntegerDigits); 357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxIntegerDigits != null) { 359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMaximumIntegerDigits(tuple.maxIntegerDigits); 360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minFractionDigits != null) { 362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumFractionDigits(tuple.minFractionDigits); 363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxFractionDigits != null) { 365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMaximumFractionDigits(tuple.maxFractionDigits); 366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.currency != null) { 368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setCurrency(java.util.Currency.getInstance(tuple.currency.toString())); 369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minGroupingDigits != null) { 371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops we don't support this. 372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useSigDigits != null) { 374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops we don't support this 375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minSigDigits != null) { 377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops we don't support this 378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxSigDigits != null) { 380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops we don't support this 381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useGrouping != null) { 383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setGroupingUsed(tuple.useGrouping != 0); 384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.multiplier != null) { 386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMultiplier(tuple.multiplier); 387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.roundingIncrement != null) { 389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.formatWidth != null) { 392bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 393bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 394bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.padCharacter != null && tuple.padCharacter.length() > 0) { 395bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 396bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 397bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useScientific != null) { 398bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 399bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 400bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.grouping != null) { 401bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setGroupingSize(tuple.grouping); 402bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 403bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.grouping2 != null) { 404bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 405bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.roundingMode != null) { 407bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 408bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 409bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.currencyUsage != null) { 410bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 411bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 412bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minimumExponentDigits != null) { 413bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 414bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 415bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.exponentSignAlwaysShown != null) { 416bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 417bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 418bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.decimalSeparatorAlwaysShown != null) { 419bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setDecimalSeparatorAlwaysShown( 420bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.decimalSeparatorAlwaysShown != 0); 421bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 422bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.padPosition != null) { 423bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 424bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 425bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.positivePrefix != null) { 426bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPositivePrefix(tuple.positivePrefix); 427bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 428bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.positiveSuffix != null) { 429bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPositiveSuffix(tuple.positiveSuffix); 430bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 431bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.negativePrefix != null) { 432bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setNegativePrefix(tuple.negativePrefix); 433bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 434bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.negativeSuffix != null) { 435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setNegativeSuffix(tuple.negativeSuffix); 436bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 437bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.localizedPattern != null) { 438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.applyLocalizedPattern(tuple.localizedPattern); 439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 4402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 441bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // lenient parsing not supported by JDK 442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.parseIntegerOnly != null) { 443bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setParseIntegerOnly(tuple.parseIntegerOnly != 0); 444bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 445bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.decimalPatternMatchRequired != null) { 446bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops, not supported 447bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.parseNoExponent != null) { 449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops, not supported for now 450bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 451bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 452bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert }; 4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRoundingScientific10542() { 4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat format = 4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("0.00E0"); 4582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] roundingModes = { 4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal.ROUND_CEILING, 4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal.ROUND_DOWN, 4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal.ROUND_FLOOR, 4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal.ROUND_HALF_DOWN, 4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal.ROUND_HALF_EVEN, 4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal.ROUND_HALF_UP, 4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal.ROUND_UP}; 4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] descriptions = { 4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Round Ceiling", 4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Round Down", 4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Round Floor", 4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Round half down", 4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Round half even", 4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Round half up", 4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Round up"}; 4752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double[] values = {-0.003006, -0.003005, -0.003004, 0.003014, 0.003015, 0.003016}; 4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // The order of these expected values correspond to the order of roundingModes and the order of values. 4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] expected = { 4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.00E-3", "-3.00E-3", "-3.00E-3", "3.02E-3", "3.02E-3", "3.02E-3"}, 4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.00E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.01E-3", "3.01E-3"}, 4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.01E-3", "-3.01E-3", "-3.01E-3", "3.01E-3", "3.01E-3", "3.01E-3"}, 4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.01E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.01E-3", "3.02E-3"}, 4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.01E-3", "-3.00E-3", "-3.00E-3", "3.01E-3", "3.02E-3", "3.02E-3"}, 4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.01E-3", "-3.01E-3", "-3.00E-3", "3.01E-3", "3.02E-3", "3.02E-3"}, 4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.01E-3", "-3.01E-3", "-3.01E-3", "3.02E-3", "3.02E-3", "3.02E-3"}}; 4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert verifyRounding(format, values, expected, roundingModes, descriptions); 4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert values = new double[]{-3006.0, -3005, -3004, 3014, 3015, 3016}; 4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // The order of these expected values correspond to the order of roundingModes and the order of values. 4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expected = new String[][]{ 4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.00E3", "-3.00E3", "-3.00E3", "3.02E3", "3.02E3", "3.02E3"}, 4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.00E3", "-3.00E3", "-3.00E3", "3.01E3", "3.01E3", "3.01E3"}, 4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.01E3", "-3.01E3", "-3.01E3", "3.01E3", "3.01E3", "3.01E3"}, 4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.01E3", "-3.00E3", "-3.00E3", "3.01E3", "3.01E3", "3.02E3"}, 4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.01E3", "-3.00E3", "-3.00E3", "3.01E3", "3.02E3", "3.02E3"}, 4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.01E3", "-3.01E3", "-3.00E3", "3.01E3", "3.02E3", "3.02E3"}, 4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-3.01E3", "-3.01E3", "-3.01E3", "3.02E3", "3.02E3", "3.02E3"}}; 4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert verifyRounding(format, values, expected, roundingModes, descriptions); 4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert values = new double[]{0.0, -0.0}; 4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // The order of these expected values correspond to the order of roundingModes and the order of values. 5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expected = new String[][]{ 5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"0.00E0", "-0.00E0"}, 5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"0.00E0", "-0.00E0"}, 5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"0.00E0", "-0.00E0"}, 5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"0.00E0", "-0.00E0"}, 5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"0.00E0", "-0.00E0"}, 5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"0.00E0", "-0.00E0"}, 5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"0.00E0", "-0.00E0"}}; 5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert verifyRounding(format, values, expected, roundingModes, descriptions); 5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert values = new double[]{1e25, 1e25 + 1e15, 1e25 - 1e15}; 5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // The order of these expected values correspond to the order of roundingModes and the order of values. 5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expected = new String[][]{ 5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E25", "1.01E25", "1.00E25"}, 5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E25", "1.00E25", "9.99E24"}, 5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E25", "1.00E25", "9.99E24"}, 5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E25", "1.00E25", "1.00E25"}, 5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E25", "1.00E25", "1.00E25"}, 5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E25", "1.00E25", "1.00E25"}, 5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E25", "1.01E25", "1.00E25"}}; 5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert verifyRounding(format, values, expected, roundingModes, descriptions); 5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert values = new double[]{-1e25, -1e25 + 1e15, -1e25 - 1e15}; 5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // The order of these expected values correspond to the order of roundingModes and the order of values. 5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expected = new String[][]{ 5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E25", "-9.99E24", "-1.00E25"}, 5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E25", "-9.99E24", "-1.00E25"}, 5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E25", "-1.00E25", "-1.01E25"}, 5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E25", "-1.00E25", "-1.00E25"}, 5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E25", "-1.00E25", "-1.00E25"}, 5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E25", "-1.00E25", "-1.00E25"}, 5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E25", "-1.00E25", "-1.01E25"}}; 5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert verifyRounding(format, values, expected, roundingModes, descriptions); 5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert values = new double[]{1e-25, 1e-25 + 1e-35, 1e-25 - 1e-35}; 5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // The order of these expected values correspond to the order of roundingModes and the order of values. 5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expected = new String[][]{ 5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E-25", "1.01E-25", "1.00E-25"}, 5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E-25", "1.00E-25", "9.99E-26"}, 5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E-25", "1.00E-25", "9.99E-26"}, 5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E-25", "1.00E-25", "1.00E-25"}, 5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E-25", "1.00E-25", "1.00E-25"}, 5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E-25", "1.00E-25", "1.00E-25"}, 5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00E-25", "1.01E-25", "1.00E-25"}}; 5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert verifyRounding(format, values, expected, roundingModes, descriptions); 5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert values = new double[]{-1e-25, -1e-25 + 1e-35, -1e-25 - 1e-35}; 5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // The order of these expected values correspond to the order of roundingModes and the order of values. 5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expected = new String[][]{ 5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E-25", "-9.99E-26", "-1.00E-25"}, 5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E-25", "-9.99E-26", "-1.00E-25"}, 5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E-25", "-1.00E-25", "-1.01E-25"}, 5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E-25", "-1.00E-25", "-1.00E-25"}, 5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E-25", "-1.00E-25", "-1.00E-25"}, 5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E-25", "-1.00E-25", "-1.00E-25"}, 5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"-1.00E-25", "-1.00E-25", "-1.01E-25"}}; 5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert verifyRounding(format, values, expected, roundingModes, descriptions); 5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void verifyRounding(DecimalFormat format, double[] values, String[][] expected, int[] roundingModes, 5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] descriptions) { 5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < roundingModes.length; i++) { 5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.setRoundingMode(roundingModes[i]); 5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int j = 0; j < values.length; j++) { 5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(descriptions[i]+" " +values[j], expected[i][j], format.format(values[j])); 5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 5652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test10419RoundingWith0FractionDigits() { 5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Object[][] data = new Object[][]{ 5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_CEILING, 1.488, "2"}, 5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_DOWN, 1.588, "1"}, 5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_FLOOR, 1.588, "1"}, 5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_HALF_DOWN, 1.5, "1"}, 5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_HALF_EVEN, 2.5, "2"}, 5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_HALF_UP, 2.5, "3"}, 5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_UP, 1.5, "2"}, 5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nff = NumberFormat.getNumberInstance(ULocale.ENGLISH); 5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nff.setMaximumFractionDigits(0); 5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (Object[] item : data) { 5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nff.setRoundingMode(((Integer) item[0]).intValue()); 5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test10419", item[2], nff.format(item[1])); 5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseNegativeWithFaLocale() { 5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat parser = (DecimalFormat) NumberFormat.getInstance(new ULocale("fa")); 5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double value = parser.parse("-0,5").doubleValue(); 5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Expect -0.5", -0.5, value); 5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 5912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert TestFmwk.errln("Parsing -0.5 should have succeeded."); 5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseNegativeWithAlternativeMinusSign() { 5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat parser = (DecimalFormat) NumberFormat.getInstance(new ULocale("en")); 5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double value = parser.parse("\u208B0.5").doubleValue(); 6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Expect -0.5", -0.5, value); 6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 6022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert TestFmwk.errln("Parsing -0.5 should have succeeded."); 6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test various patterns 6072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestPatterns() { 6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String pat[] = { "#.#", "#.", ".#", "#" }; 6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int pat_length = pat.length; 6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String newpat[] = { "#0.#", "#0.", "#.0", "#" }; 6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String num[] = { "0", "0.", ".0", "0" }; 6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<pat_length; ++i) 6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat[i], sym); 6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String newp = fmt.toPattern(); 6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!newp.equals(newpat[i])) 6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Pattern " + pat[i] + " should transmute to " + newpat[i] + 6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "; " + newp + " seen instead"); 6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = ((NumberFormat)fmt).format(0); 6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(num[i])) 6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Pattern " + pat[i] + " should format zero as " + num[i] + 6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "; " + s + " seen instead"); 6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Min integer digits = " + fmt.getMinimumIntegerDigits()); 6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // BigInteger 0 - ticket#4731 6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat)fmt).format(BigInteger.ZERO); 6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(num[i])) 6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Pattern " + pat[i] + " should format BigInteger zero as " + num[i] + 6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "; " + s + " seen instead"); 6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Min integer digits = " + fmt.getMinimumIntegerDigits()); 6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test exponential pattern 6422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestExponential() { 6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0.###E0]" }; 6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int pat_length = pat.length; 6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 }; 6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int val_length = val.length; 6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String valFormat[] = { 6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 0.####E0 6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271", 6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 00.000E00 6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272", 6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // ##0.######E000 6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273", 6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 0.###E0;[0.###E0] 6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]" }; 6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*double valParse[] = 6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.01234, 123460000, 1.23E300, -3.1416E-271, 6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.01234, 123460000, 1.23E300, -3.1416E-271, 6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.01234, 123456800, 1.23E300, -3.141593E-271, 6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.01234, 123500000, 1.23E300, -3.142E-271, 6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert };*/ //The variable is never used 6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int lval[] = { 0, -1, 1, 123456789 }; 6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int lval_length = lval.length; 6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String lvalFormat[] = { 6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 0.####E0 6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0E0", "-1E0", "1E0", "1.2346E8", 6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 00.000E00 6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07", 6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // ##0.######E000 6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0E000", "-1E000", "1E000", "123.4568E006", 6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 0.###E0;[0.###E0] 6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0E0", "[1E0]", "1E0", "1.235E8" }; 6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int lvalParse[] = 6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, -1, 1, 123460000, 6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, -1, 1, 123460000, 6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, -1, 1, 123456800, 6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, -1, 1, 123500000, 6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int ival = 0, ilval = 0; 6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int p = 0; p < pat_length; ++p) { 6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat[p], sym); 6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pattern \"" + pat[p] + "\" -toPattern-> \"" + fmt.toPattern() + "\""); 6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int v; 6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (v = 0; v < val_length; ++v) { 6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s; 6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat) fmt).format(val[v]); 6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" " + val[v] + " -format-> " + s); 6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(valFormat[v + ival])) 6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected " + valFormat[v + ival]); 6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double a = fmt.parse(s, pos).doubleValue(); 7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pos.getIndex() == s.length()) { 7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" -parse-> " + Double.toString(a)); 7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Use epsilon comparison as necessary 7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else 7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a); 7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (v = 0; v < lval_length; ++v) { 7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s; 7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat) fmt).format(lval[v]); 7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" " + lval[v] + "L -format-> " + s); 7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(lvalFormat[v + ilval])) 7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("ERROR: Expected " + lvalFormat[v + ilval] + " Got: " + s); 7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long a = 0; 7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number A = fmt.parse(s, pos); 7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (A != null) { 7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert a = A.longValue(); 7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pos.getIndex() == s.length()) { 7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" -parse-> " + a); 7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (a != lvalParse[v + ilval]) 7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected " + lvalParse[v + ilval]); 7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else 7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + Long.toString(a)); 7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail to parse the string: " + s); 7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ival += val_length; 7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ilval += lval_length; 7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test the handling of quotes 7342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestQuotes() { 7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer pat; 7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = new StringBuffer("a'fo''o'b#"); 7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat.toString(), sym); 7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = ((NumberFormat)fmt).format(123); 7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pattern \"" + pat + "\""); 7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format 123 . " + s); 7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals("afo'ob123")) 7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected afo'ob123"); 7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s =""; 7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = new StringBuffer("a''b#"); 7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = new DecimalFormat(pat.toString(), sym); 7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat)fmt).format(123); 7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pattern \"" + pat + "\""); 7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format 123 . " + s); 7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals("a'b123")) 7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected a'b123"); 7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseCurrencyTrailingSymbol() { 7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // see sun bug 4709840 7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getCurrencyInstance(Locale.GERMANY); 7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert float val = 12345.67f; 7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str = fmt.format(val); 7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("val: " + val + " str: " + str); 7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = fmt.parse(str); 7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("num: " + num); 7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse of '" + str + "' threw exception: " + e); 7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test the handling of the currency symbol in patterns. 7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/ 7752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencySign() { 7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer pat = new StringBuffer(""); 7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char currency = 0x00A4; 7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // "\xA4#,##0.00;-\xA4#,##0.00" 7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat.append(currency).append("#,##0.00;-").append(currency).append("#,##0.00"); 7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat.toString(), sym); 7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = ((NumberFormat) fmt).format(1234.56); 7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = new StringBuffer(); 7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pattern \"" + fmt.toPattern() + "\""); 7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format " + 1234.56 + " . " + s); 7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("symbol, pos", "$1,234.56", s); 7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat) fmt).format(-1234.56); 7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format " + Double.toString(-1234.56) + " . " + s); 7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("symbol, neg", "-$1,234.56", s); 7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat.setLength(0); 7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // "\xA4\xA4 #,##0.00;\xA4\xA4 -#,##0.00" 7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat.append(currency).append(currency).append(" #,##0.00;").append(currency).append(currency).append(" -#,##0.00"); 7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = new DecimalFormat(pat.toString(), sym); 7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat) fmt).format(1234.56); 7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pattern \"" + fmt.toPattern() + "\""); 7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format " + Double.toString(1234.56) + " . " + s); 8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("name, pos", "USD 1,234.56", s); 8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat) fmt).format(-1234.56); 8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format " + Double.toString(-1234.56) + " . " + s); 8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("name, neg", "USD -1,234.56", s); 8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSpaceParsing() { 8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the data are: 8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the string to be parsed, parsed position, parsed error index 8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] DATA = { 8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$124", "4", "-1"}, 8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$124 $124", "4", "-1"}, 8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$124 ", "4", "-1"}, 8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$ 124 ", "5", "-1"}, 8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$\u00A0124 ", "5", "-1"}, 8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {" $ 124 ", "0", "0"}, // TODO: need to handle space correctly 8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"124$", "0", "3"}, // TODO: need to handle space correctly 8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // {"124 $", "5", "-1"}, TODO: OK or NOT? 8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"124 $", "0", "3"}, 8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat foo = NumberFormat.getCurrencyInstance(); 8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < DATA.length; ++i) { 8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition parsePosition = new ParsePosition(0); 8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String stringToBeParsed = DATA[i][0]; 8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int parsedPosition = Integer.parseInt(DATA[i][1]); 8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int errorIndex = Integer.parseInt(DATA[i][2]); 8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number result = foo.parse(stringToBeParsed, parsePosition); 8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (parsePosition.getIndex() != parsedPosition || 8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parsePosition.getErrorIndex() != errorIndex) { 8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED parse " + stringToBeParsed + "; parse position: " + parsePosition.getIndex() + "; error position: " + parsePosition.getErrorIndex()); 8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (parsePosition.getErrorIndex() == -1 && 8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result.doubleValue() != 124) { 8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED parse " + stringToBeParsed + "; value " + result.doubleValue()); 8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED " + e.toString()); 8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestMultiCurrencySign() { 8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] DATA = { 8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the fields in the following test are: 8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // locale, 8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency pattern (with negative pattern), 8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency number to be formatted, 8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency format using currency symbol name, such as "$" for USD, 8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency format using currency ISO name, such as "USD", 8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency format using plural name, such as "US dollars". 8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // for US locale 8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "1234.56", "$1,234.56", "USD1,234.56", "US dollars1,234.56"}, 8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "-1234.56", "-$1,234.56", "-USD1,234.56", "-US dollars1,234.56"}, 8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "1", "$1.00", "USD1.00", "US dollars1.00"}, 8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // for CHINA locale 8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "1234.56", "\uFFE51,234.56", "CNY1,234.56", "\u4EBA\u6C11\u5E011,234.56"}, 8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "-1234.56", "(\uFFE51,234.56)", "(CNY1,234.56)", "(\u4EBA\u6C11\u5E011,234.56)"}, 8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "1", "\uFFE51.00", "CNY1.00", "\u4EBA\u6C11\u5E011.00"} 8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String doubleCurrencyStr = "\u00A4\u00A4"; 8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String tripleCurrencyStr = "\u00A4\u00A4\u00A4"; 8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; ++i) { 8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String locale = DATA[i][0]; 8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = DATA[i][1]; 8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double numberToBeFormat = new Double(DATA[i][2]); 8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(new ULocale(locale)); 8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int j=1; j<=3; ++j) { 8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // j represents the number of currency sign in the pattern. 8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (j == 2) { 8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = pat.replaceAll("\u00A4", doubleCurrencyStr); 8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (j == 3) { 8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = pat.replaceAll("\u00A4\u00A4", tripleCurrencyStr); 8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat, sym); 8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = ((NumberFormat) fmt).format(numberToBeFormat); 8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][3] is the currency format result using a 8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // single currency sign. 8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][4] is the currency format result using 8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // double currency sign. 8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][5] is the currency format result using 8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // triple currency sign. 8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][j+2] is the currency format result using 8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 'j' number of currency sign. 8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String currencyFormatResult = DATA[i][2+j]; 8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(currencyFormatResult)) { 8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL format: Expected " + currencyFormatResult); 8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // mix style parsing 8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int k=3; k<=5; ++k) { 8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][3] is the currency format result using a 8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // single currency sign. 8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][4] is the currency format result using 9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // double currency sign. 9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][5] is the currency format result using 9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // triple currency sign. 9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String oneCurrencyFormat = DATA[i][k]; 9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fmt.parse(oneCurrencyFormat).doubleValue() != 9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberToBeFormat.doubleValue()) { 9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED parse " + oneCurrencyFormat); 9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED, DecimalFormat parse currency: " + e.toString()); 9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyFormatForMixParsing() { 9187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert MeasureFormat curFmt = MeasureFormat.getCurrencyFormat(new ULocale("en_US")); 9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] formats = { 9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "$1,234.56", // string to be parsed 9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "USD1,234.56", 9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "US dollars1,234.56", 9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234.56 US dollars" 9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < formats.length; ++i) { 9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String stringToBeParsed = formats[i]; 9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount parsedVal = (CurrencyAmount)curFmt.parseObject(stringToBeParsed); 9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number val = parsedVal.getNumber(); 9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!val.equals(new BigDecimal("1234.56"))) { 9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number. val=" + val); 9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!parsedVal.getCurrency().equals(Currency.getInstance("USD"))) { 9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the currency"); 9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse FAILED: " + e.toString()); 9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestDecimalFormatCurrencyParse() { 9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Locale.US 9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer pat = new StringBuffer(""); 9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char currency = 0x00A4; 9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // "\xA4#,##0.00;-\xA4#,##0.00" 9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat.append(currency).append(currency).append(currency).append("#,##0.00;-").append(currency).append(currency).append(currency).append("#,##0.00"); 9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat.toString(), sym); 9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] DATA = { 9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the data are: 9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // string to be parsed, the parsed result (number) 9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$1.00", "1"}, 9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"USD1.00", "1"}, 9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 US dollar", "1"}, 9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$1,234.56", "1234.56"}, 9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"USD1,234.56", "1234.56"}, 9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1,234.56 US dollar", "1234.56"}, 9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < DATA.length; ++i) { 9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String stringToBeParsed = DATA[i][0]; 9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double parsedResult = Double.parseDouble(DATA[i][1]); 9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = fmt.parse(stringToBeParsed); 9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (num.doubleValue() != parsedResult) { 9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL parse: Expected " + parsedResult); 9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED, DecimalFormat parse currency: " + e.toString()); 9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test localized currency patterns. 9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 9782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrency() { 9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] DATA = { 9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "fr", "CA", "", "1,50\u00a0$", 9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "de", "DE", "", "1,50\u00a0\u20AC", 9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "de", "DE", "PREEURO", "1,50\u00a0DM", 9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "fr", "FR", "", "1,50\u00a0\u20AC", 9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "fr", "FR", "PREEURO", "1,50\u00a0F", 9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; i+=4) { 9897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale locale = new Locale(DATA[i], DATA[i+1], DATA[i+2]); 9907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); 9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = fmt.format(1.50); 9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (s.equals(DATA[i+3])) { 9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: 1.50 x " + locale + " => " + s); 9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("FAIL: 1.50 x " + locale + " => " + s + 9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expected " + DATA[i+3]); 9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // format currency with CurrencyAmount 10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; i+=4) { 10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale locale = new Locale(DATA[i], DATA[i+1], DATA[i+2]); 10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency curr = Currency.getInstance(locale); 10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("\nName of the currency is: " + curr.getName(locale, Currency.LONG_NAME, new boolean[] {false})); 10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount cAmt = new CurrencyAmount(1.5, curr); 10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("CurrencyAmount object's hashCode is: " + cAmt.hashCode()); //cover hashCode 10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); 10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String sCurr = fmt.format(cAmt); 10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (sCurr.equals(DATA[i+3])) { 10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: 1.50 x " + locale + " => " + sCurr); 10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: 1.50 x " + locale + " => " + sCurr + 10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expected " + DATA[i+3]); 10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //Cover MeasureFormat.getCurrencyFormat() 10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale save = ULocale.getDefault(); 10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.setDefault(ULocale.US); 10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert MeasureFormat curFmt = MeasureFormat.getCurrencyFormat(); 10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String strBuf = curFmt.format(new CurrencyAmount(new Float(1234.56), Currency.getInstance("USD"))); 10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount parsedVal = (CurrencyAmount)curFmt.parseObject(strBuf); 10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number val = parsedVal.getNumber(); 10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!val.equals(new BigDecimal("1234.56"))) { 10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number. val=" + val); 10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!parsedVal.getCurrency().equals(Currency.getInstance("USD"))) { 10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the currency"); 10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (ParseException e) { 10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + e.getMessage()); 10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.setDefault(save); 10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyIsoPluralFormat() { 10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] DATA = { 10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the data are: 10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // locale, 10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency amount to be formatted, 10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency ISO code to be formatted, 10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // format result using CURRENCYSTYLE, 10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // format result using ISOCURRENCYSTYLE, 10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // format result using PLURALCURRENCYSTYLE, 10512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollars"}, 10522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dollars"}, 10532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"en_US", "-1234.56", "USD", "-$1,234.56", "-USD1,234.56", "-1,234.56 US dollars"}, 10542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"zh_CN", "1", "USD", "US$1.00", "USD1.00", "1.00美元"}, 10552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"zh_CN", "1234.56", "USD", "US$1,234.56", "USD1,234.56", "1,234.56美元"}, 10562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"zh_CN", "1", "CNY", "¥1.00", "CNY1.00", "1.00人民币"}, 10572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"zh_CN", "1234.56", "CNY", "¥1,234.56", "CNY1,234.56", "1,234.56人民币"}, 10582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"ru_RU", "1", "RUB", "1,00 \u20BD", "1,00 RUB", "1,00 российского рубля"}, 10592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"ru_RU", "2", "RUB", "2,00 \u20BD", "2,00 RUB", "2,00 российского рубля"}, 10602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"ru_RU", "5", "RUB", "5,00 \u20BD", "5,00 RUB", "5,00 российского рубля"}, 10612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert // test locale without currency information 10622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"root", "-1.23", "USD", "-US$ 1.23", "-USD 1.23", "-1.23 USD"}, 10632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"root@numbers=latn", "-1.23", "USD", "-US$ 1.23", "-USD 1.23", "-1.23 USD"}, // ensure that the root locale is still used with modifiers 10642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"root@numbers=arab", "-1.23", "USD", "\u061C-\u0661\u066B\u0662\u0663\u00A0US$", "\u061C-\u0661\u066B\u0662\u0663\u00A0USD", "\u061C-\u0661\u066B\u0662\u0663 USD"}, // ensure that the root locale is still used with modifiers 10652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"es_AR", "1", "INR", "INR\u00A01,00", "INR\u00A01,00", "1,00 rupia india"}, 10662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert {"ar_EG", "1", "USD", "١٫٠٠\u00A0US$", "١٫٠٠\u00A0USD", "١٫٠٠ دولار أمريكي"}, 10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; ++i) { 10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int k = NumberFormat.CURRENCYSTYLE; 10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert k <= NumberFormat.PLURALCURRENCYSTYLE; 10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ++k) { 10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // k represents currency format style. 10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( k != NumberFormat.CURRENCYSTYLE && 10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert k != NumberFormat.ISOCURRENCYSTYLE && 10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert k != NumberFormat.PLURALCURRENCYSTYLE ) { 10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String localeString = DATA[i][0]; 10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double numberToBeFormat = new Double(DATA[i][1]); 10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String currencyISOCode = DATA[i][2]; 10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = new ULocale(localeString); 10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat numFmt = NumberFormat.getInstance(locale, k); 10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numFmt.setCurrency(Currency.getInstance(currencyISOCode)); 10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String strBuf = numFmt.format(numberToBeFormat); 10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int resultDataIndex = k-1; 10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( k == NumberFormat.CURRENCYSTYLE ) { 10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert resultDataIndex = k+2; 10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][resultDataIndex] is the currency format result 10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // using 'k' currency style. 10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String formatResult = DATA[i][resultDataIndex]; 10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!strBuf.equals(formatResult)) { 10942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert errln("FAIL: localeID: " + localeString + ", expected(" + formatResult.length() + "): \"" + formatResult + "\", actual(" + strBuf.length() + "): \"" + strBuf + "\""); 10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test parsing, and test parsing for all currency formats. 10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int j = 3; j < 6; ++j) { 10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][3] is the currency format result using 11007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // CURRENCYSTYLE formatter. 11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][4] is the currency format result using 11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // ISOCURRENCYSTYLE formatter. 11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][5] is the currency format result using 11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // PLURALCURRENCYSTYLE formatter. 11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String oneCurrencyFormatResult = DATA[i][j]; 11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number val = numFmt.parse(oneCurrencyFormatResult); 11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (val.doubleValue() != numberToBeFormat.doubleValue()) { 11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getCurrencyFormat of locale " + localeString + " failed roundtripping the number. val=" + val + "; expected: " + numberToBeFormat); 11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (ParseException e) { 11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + e.getMessage()); 11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestMiscCurrencyParsing() { 11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] DATA = { 11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // each has: string to be parsed, parsed position, error position 11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 ", "0", "4"}, 11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 UAE dirha", "0", "4"}, 11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 us dollar", "14", "-1"}, 11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 US DOLLAR", "14", "-1"}, 11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 usd", "0", "4"}, 11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = new ULocale("en_US"); 11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; ++i) { 11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String stringToBeParsed = DATA[i][0]; 11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int parsedPosition = Integer.parseInt(DATA[i][1]); 11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int errorIndex = Integer.parseInt(DATA[i][2]); 11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat numFmt = NumberFormat.getInstance(locale, NumberFormat.CURRENCYSTYLE); 11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition parsePosition = new ParsePosition(0); 11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number val = numFmt.parse(stringToBeParsed, parsePosition); 11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (parsePosition.getIndex() != parsedPosition || 11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parsePosition.getErrorIndex() != errorIndex) { 11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse failed. expected error position: " + errorIndex + "; actual: " + parsePosition.getErrorIndex()); 11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse failed. expected position: " + parsedPosition +"; actual: " + parsePosition.getIndex()); 11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (parsePosition.getErrorIndex() == -1 && 11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert val.doubleValue() != 1.00) { 11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse failed. expected 1.00, actual:" + val); 11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseCurrency() { 11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class ParseCurrencyItem { 11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String localeString; 11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String descrip; 11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String currStr; 11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int numExpectPos; 11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int numExpectVal; 11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int curExpectPos; 11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int curExpectVal; 11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String curExpectCurr; 11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParseCurrencyItem(String locStr, String desc, String curr, int numExPos, int numExVal, int curExPos, int curExVal, String curExCurr) { 11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert localeString = locStr; 11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert descrip = desc; 11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert currStr = curr; 11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numExpectPos = numExPos; 11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numExpectVal = numExVal; 11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert curExpectPos = curExPos; 11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert curExpectVal = curExVal; 11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert curExpectCurr = curExCurr; 11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getLocaleString() { return localeString; } 11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getDescrip() { return descrip; } 11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getCurrStr() { return currStr; } 11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getNumExpectPos() { return numExpectPos; } 11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getNumExpectVal() { return numExpectVal; } 11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getCurExpectPos() { return curExpectPos; } 11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getCurExpectVal() { return curExpectVal; } 11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getCurExpectCurr() { return curExpectCurr; } 11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final ParseCurrencyItem[] parseCurrencyItems = { 11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "dollars2", "$2.00", 5, 2, 5, 2, "USD" ), 11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "dollars4", "$4", 2, 4, 2, 4, "USD" ), 11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "dollars9", "9\u00A0$", 0, 0, 0, 0, "" ), 11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "pounds3", "\u00A33.00", 0, 0, 5, 3, "GBP" ), 11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "pounds5", "\u00A35", 0, 0, 2, 5, "GBP" ), 11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "pounds7", "7\u00A0\u00A3", 0, 0, 0, 0, "" ), 11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "euros8", "\u20AC8", 0, 0, 2, 8, "EUR" ), 11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "pounds3", "\u00A33.00", 5, 3, 5, 3, "GBP" ), 11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "pounds5", "\u00A35", 2, 5, 2, 5, "GBP" ), 11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "pounds7", "7\u00A0\u00A3", 0, 0, 0, 0, "" ), 11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "euros4", "4,00\u00A0\u20AC", 0, 0, 0, 0, "" ), 11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "euros6", "6\u00A0\u20AC", 0, 0, 0, 0, "" ), 11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "euros8", "\u20AC8", 0, 0, 2, 8, "EUR" ), 11962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert new ParseCurrencyItem( "en_GB", "dollars4", "US$4", 0, 0, 4, 4, "USD" ), 11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "fr_FR", "euros4", "4,00\u00A0\u20AC", 6, 4, 6, 4, "EUR" ), 11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "fr_FR", "euros6", "6\u00A0\u20AC", 3, 6, 3, 6, "EUR" ), 12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "fr_FR", "euros8", "\u20AC8", 0, 0, 0, 0, "" ), 12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "fr_FR", "dollars2", "$2.00", 0, 0, 0, 0, "" ), 12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "fr_FR", "dollars4", "$4", 0, 0, 0, 0, "" ), 12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (ParseCurrencyItem item: parseCurrencyItems) { 12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String localeString = item.getLocaleString(); 12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale uloc = new ULocale(localeString); 12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = null; 12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = NumberFormat.getCurrencyInstance(uloc); 12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getCurrencyInstance fails for locale " + localeString); 12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String currStr = item.getCurrStr(); 12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition parsePos = new ParsePosition(0); 12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number numVal = fmt.parse(currStr, parsePos); 12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( parsePos.getIndex() != item.getNumExpectPos() || (numVal != null && numVal.intValue() != item.getNumExpectVal()) ) { 12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (numVal != null) { 12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() + 12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() + 12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", get " + parsePos.getIndex() + "/" + numVal.intValue() ); 12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() + 12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() + 12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", get " + parsePos.getIndex() + "/(NULL)" ); 12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parsePos.setIndex(0); 12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount currAmt = fmt.parseCurrency(currStr, parsePos); 12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( parsePos.getIndex() != item.getCurExpectPos() || (currAmt != null && (currAmt.getNumber().intValue() != item.getCurExpectVal() || 12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert currAmt.getCurrency().getCurrencyCode().compareTo(item.getCurExpectCurr()) != 0)) ) { 12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (currAmt != null) { 12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getCurrencyInstance parseCurrency " + localeString + "/" + item.getDescrip() + 12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expect pos/val/curr " + item.getCurExpectPos() + "/" + item.getCurExpectVal() + "/" + item.getCurExpectCurr() + 12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", get " + parsePos.getIndex() + "/" + currAmt.getNumber().intValue() + "/" + currAmt.getCurrency().getCurrencyCode() ); 12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 12397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getCurrencyInstance parseCurrency " + localeString + "/" + item.getDescrip() + 12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expect pos/val/curr " + item.getCurExpectPos() + "/" + item.getCurExpectVal() + "/" + item.getCurExpectCurr() + 12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", get " + parsePos.getIndex() + "/(NULL)" ); 12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 12482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public void TestParseCurrPatternWithDecStyle() { 12492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert String currpat = "¤#,##0.00"; 12502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert String parsetxt = "x0y$"; 12512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert DecimalFormat decfmt = (DecimalFormat)NumberFormat.getInstance(new ULocale("en_US"), NumberFormat.NUMBERSTYLE); 12522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert decfmt.applyPattern(currpat); 12532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert ParsePosition ppos = new ParsePosition(0); 12542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert Number value = decfmt.parse(parsetxt, ppos); 12552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert if (ppos.getIndex() != 0) { 12562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert errln("DecimalFormat.parse expected to fail but got ppos " + ppos.getIndex() + ", value " + value); 12572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 12582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 12592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test the Currency object handling, new as of ICU 2.2. 12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 12632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyObject() { 12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = 12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getCurrencyInstance(Locale.US); 12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, null, 1234.56, "$1,234.56"); 12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.FRANCE), 12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "\u20AC1,234.56"); // Euro 12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.JAPAN), 12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "\u00A51,235"); // Yen 12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(new Locale("fr", "CH", "")), 12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "CHF1,234.56"); // no more 0.05 rounding here, see cldrbug 5548 12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.US), 12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "$1,234.56"); 12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = NumberFormat.getCurrencyInstance(Locale.FRANCE); 12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, null, 1234.56, "1 234,56 \u20AC"); 12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.JAPAN), 12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "1 235 JPY"); // Yen 12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(new Locale("fr", "CH", "")), 12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "1 234,56 CHF"); // no more rounding here, see cldrbug 5548 12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.US), 12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "1 234,56 $US"); 12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.FRANCE), 12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "1 234,56 \u20AC"); // Euro 12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCompatibleCurrencies() { 13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = 13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getCurrencyInstance(Locale.US); 13032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert expectParseCurrency(fmt, Currency.getInstance(Locale.JAPAN), "\u00A51,235"); // Yen half-width 13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectParseCurrency(fmt, Currency.getInstance(Locale.JAPAN), "\uFFE51,235"); // Yen full-wdith 13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyPatterns() { 13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int i; 13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale[] locs = NumberFormat.getAvailableLocales(); 13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (i=0; i<locs.length; ++i) { 13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = NumberFormat.getCurrencyInstance(locs[i]); 13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Make sure currency formats do not have a variable number 13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // of fraction digits 13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int min = nf.getMinimumFractionDigits(); 13167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int max = nf.getMaximumFractionDigits(); 13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (min != max) { 13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String a = nf.format(1.0); 13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String b = nf.format(1.125); 13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + locs[i] + 13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " min fraction digits != max fraction digits; "+ 13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "x 1.0 => " + a + 13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "; x 1.125 => " + b); 13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Make sure EURO currency formats have exactly 2 fraction digits 13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (nf instanceof DecimalFormat) { 13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency curr = ((DecimalFormat) nf).getCurrency(); 13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (curr != null && "EUR".equals(curr.getCurrencyCode())) { 13307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (min != 2 || max != 2) { 13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String a = nf.format(1.0); 13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + locs[i] + 13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " is a EURO format but it does not have 2 fraction digits; "+ 13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "x 1.0 => " + 13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert a); 13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Do rudimentary testing of parsing. 13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParse() { 13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String arg = "0.0"; 13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat format = new DecimalFormat("00"); 13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double aNumber = 0l; 13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert aNumber = format.parse(arg).doubleValue(); 13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert System.out.println(e); 13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("parse(" + arg + ") = " + aNumber); 13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test proper rounding by the format method. 13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRounding487() { 13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = NumberFormat.getInstance(); 13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingTest(nf, 0.00159999, 4, "0.0016"); 13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingTest(nf, 0.00995, 4, "0.01"); 13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingTest(nf, 12.3995, 3, "12.4"); 13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingTest(nf, 12.4999, 0, "12"); 13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingTest(nf, - 19.5, 0, "-20"); 13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test the functioning of the secondary grouping value. 13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSecondaryGrouping() { 13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat f = new DecimalFormat("#,##,###", US); 13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(f, 123456789L, "12,34,56,789"); 13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(f, "#,##,###"); 13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.applyPattern("#,###"); 13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setSecondaryGroupingSize(4); 13897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(f, 123456789L, "12,3456,789"); 13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(f, "#,####,###"); 13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat g = NumberFormat.getInstance(new Locale("hi", "IN")); 13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String out = ""; 13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long l = 1876543210L; 13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert out = g.format(l); 13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect "1,87,65,43,210", but with Hindi digits 13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 01234567890123 13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean ok = true; 14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (out.length() != 14) { 14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ok = false; 14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < out.length(); ++i) { 14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean expectGroup = false; 14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert switch (i) { 14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 1 : 14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 4 : 14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 7 : 14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 10 : 14107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectGroup = true; 14117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 14127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Later -- fix this to get the actual grouping 14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // character from the resource bundle. 14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean isGroup = (out.charAt(i) == 0x002C); 14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (isGroup != expectGroup) { 14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ok = false; 14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!ok) { 14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL Expected "+ l + " x hi_IN . \"1,87,65,43,210\" (with Hindi digits), got \"" 14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + out + "\""); 14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok " + l + " x hi_IN . \"" + out + "\""); 14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert /* 14312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * Internal test utility. 14322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert */ 14332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert private void roundingTest(NumberFormat nf, double x, int maxFractionDigits, final String expected) { 14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setMaximumFractionDigits(maxFractionDigits); 14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String out = nf.format(x); 14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(x + " formats with " + maxFractionDigits + " fractional digits to " + out); 14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!out.equals(expected)) 14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected " + expected); 14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Upgrade to alphaWorks 14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestExponent() { 14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt1 = new DecimalFormat("0.###E0", US); 14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt2 = new DecimalFormat("0.###E+0", US); 14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int n = 1234; 14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt1, n, "1.234E3"); 14517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt2, n, "1.234E+3"); 14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt1, "1.234E+3", n); // Either format should parse "E+3" 14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Upgrade to alphaWorks 14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestScientific() { 14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test pattern round-trip 14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String PAT[] = { "#E0", "0.####E0", "00.000E00", "##0.####E000", "0.###E0;[0.###E0]" }; 14667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int PAT_length = PAT.length; 14677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int DIGITS[] = { 14687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // min int, max int, min frac, max frac 14697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, 1, 0, 0, // "#E0" 14707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1, 1, 0, 4, // "0.####E0" 14717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2, 2, 3, 3, // "00.000E00" 14727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1, 3, 0, 4, // "##0.####E000" 14737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1, 1, 0, 3, // "0.###E0;[0.###E0]" 14747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 14757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < PAT_length; ++i) { 14767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = PAT[i]; 14777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = new DecimalFormat(pat, US); 14787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat2 = df.toPattern(); 14797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pat.equals(pat2)) { 14807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok Pattern rt \"" + pat + "\" . \"" + pat2 + "\""); 14817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 14827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL Pattern rt \"" + pat + "\" . \"" + pat2 + "\""); 14837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Make sure digit counts match what we expect 14857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (df.getMinimumIntegerDigits() != DIGITS[4 * i] 14867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert || df.getMaximumIntegerDigits() != DIGITS[4 * i + 1] 14877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert || df.getMinimumFractionDigits() != DIGITS[4 * i + 2] 14887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert || df.getMaximumFractionDigits() != DIGITS[4 * i + 3]) { 14897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL \""+ pat+ "\" min/max int; min/max frac = " 14907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + df.getMinimumIntegerDigits() + "/" 14917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + df.getMaximumIntegerDigits() + ";" 14927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + df.getMinimumFractionDigits() + "/" 14937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + df.getMaximumFractionDigits() + ", expect " 14947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + DIGITS[4 * i] + "/" 14957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + DIGITS[4 * i + 1] + ";" 14967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + DIGITS[4 * i + 2] + "/" 14977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + DIGITS[4 * i + 3]); 14987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 15007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("#E0", US), 12345.0, "1.2345E4"); 15027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("0E0", US), 12345.0, "1E4"); 15037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // pattern of NumberFormat.getScientificInstance(Locale.US) = "0.######E0" not "#E0" 15057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // so result = 1.234568E4 not 1.2345678901E4 15067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //when the pattern problem is finalized, delete comment mark'//' 15077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //of the following code 15087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(NumberFormat.getScientificInstance(Locale.US), 12345.678901, "1.2345678901E4"); 15097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Testing NumberFormat.getScientificInstance(ULocale) ..."); 15107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(NumberFormat.getScientificInstance(ULocale.US), 12345.678901, "1.2345678901E4"); 15117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("##0.###E0", US), 12345.0, "12.34E3"); 15137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("##0.###E0", US), 12345.00001, "12.35E3"); 15147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("##0.####E0", US), 12345, "12.345E3"); 15157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // pattern of NumberFormat.getScientificInstance(Locale.US) = "0.######E0" not "#E0" 15177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // so result = 1.234568E4 not 1.2345678901E4 15187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(NumberFormat.getScientificInstance(Locale.FRANCE), 12345.678901, "1,2345678901E4"); 15197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Testing NumberFormat.getScientificInstance(ULocale) ..."); 15207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(NumberFormat.getScientificInstance(ULocale.FRANCE), 12345.678901, "1,2345678901E4"); 15217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("##0.####E0", US), 789.12345e-9, "789.12E-9"); 15237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("##0.####E0", US), 780.e-9, "780E-9"); 15247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat(".###E0", US), 45678.0, ".457E5"); 15257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(".###E0", US), 0, ".0E0"); 15267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 15277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat[] { new DecimalFormat("#E0", US), 15287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("##E0", US), 15297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("####E0", US), 15307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("0E0", US), 15317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("00E0", US), 15327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("000E0", US), 15337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 15347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Long(45678000), 15357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new String[] { "4.5678E7", 15367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "45.678E6", 15377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "4567.8E4", 15387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "5E7", 15397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "46E6", 15407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "457E5", 15417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 15427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ); 15437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! Unroll this test into individual tests below... 15457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 15477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("#E0", US), 45678000, "4.5678E7"); 15487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("##E0", US), 45678000, "45.678E6"); 15497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("####E0", US), 45678000, "4567.8E4"); 15507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("0E0", US), 45678000, "5E7"); 15517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("00E0", US), 45678000, "46E6"); 15527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("000E0", US), 45678000, "457E5"); 15537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 15547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("###E0", US, status), 15557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Object[] { new Double(0.0000123), "12.3E-6", 15567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(0.000123), "123E-6", 15577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(0.00123), "1.23E-3", 15587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(0.0123), "12.3E-3", 15597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(0.123), "123E-3", 15607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(1.23), "1.23E0", 15617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(12.3), "12.3E0", 15627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(123), "123E0", 15637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(1230), "1.23E3", 15647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }); 15657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! Unroll this test into individual tests below... 15677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 15697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 0.0000123, "12.3E-6"); 15707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 0.000123, "123E-6"); 15717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 0.00123, "1.23E-3"); 15727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 0.0123, "12.3E-3"); 15737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 0.123, "123E-3"); 15747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 1.23, "1.23E0"); 15757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 12.3, "12.3E0"); 15767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 123.0, "123E0"); 15777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 1230.0, "1.23E3"); 15787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 15797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("0.#E+00", US, status), 15807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Object[] { new Double(0.00012), "1.2E-04", 15817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Long(12000), "1.2E+04", 15827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }); 15837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! Unroll this test into individual tests below... 15857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 15877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("0.#E+00", US), 0.00012, "1.2E-04"); 15887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("0.#E+00", US), 12000, "1.2E+04"); 15897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 15907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 15927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Upgrade to alphaWorks 15937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 15942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 15957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestPad() { 15967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 15987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("*^##.##", US), 0, "^^^^0"); 15997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("*^##.##", US), -1.3, "^-1.3"); 16007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2( 16017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US), 16027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, 16037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.0E0______ g-m/s^2"); 16047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect( 16057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US), 16067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1.0 / 3, 16077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "333.333E-3_ g-m/s^2"); 16087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US), 0, "0.0______ g-m/s^2"); 16097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect( 16107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("##0.0####*_ 'g-m/s^2'", US), 16117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1.0 / 3, 16127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.33333__ g-m/s^2"); 16137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test padding before a sign 16157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String formatStr = "*x#,###,###,##0.0#;*x(###,###,##0.0#)"; 16167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -10, "xxxxxxxxxx(10.0)"); 16177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -1000, "xxxxxxx(1,000.0)"); 16187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -1000000, "xxx(1,000,000.0)"); 16197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -100.37, "xxxxxxxx(100.37)"); 16207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -10456.37, "xxxxx(10,456.37)"); 16217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -1120456.37, "xx(1,120,456.37)"); 16227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -112045600.37, "(112,045,600.37)"); 16237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -1252045600.37, "(1,252,045,600.37)"); 16247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 10, "xxxxxxxxxxxx10.0"); 16267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 1000, "xxxxxxxxx1,000.0"); 16277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 1000000, "xxxxx1,000,000.0"); 16287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 100.37, "xxxxxxxxxx100.37"); 16297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 10456.37, "xxxxxxx10,456.37"); 16307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 1120456.37, "xxxx1,120,456.37"); 16317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 112045600.37, "xx112,045,600.37"); 16327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 10252045600.37, "10,252,045,600.37"); 16337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test padding between a sign and a number 16357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String formatStr2 = "#,###,###,##0.0#*x;(###,###,##0.0#*x)"; 16367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -10, "(10.0xxxxxxxxxx)"); 16377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -1000, "(1,000.0xxxxxxx)"); 16387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -1000000, "(1,000,000.0xxx)"); 16397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -100.37, "(100.37xxxxxxxx)"); 16407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -10456.37, "(10,456.37xxxxx)"); 16417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -1120456.37, "(1,120,456.37xx)"); 16427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -112045600.37, "(112,045,600.37)"); 16437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -1252045600.37, "(1,252,045,600.37)"); 16447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 10, "10.0xxxxxxxxxxxx"); 16467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 1000, "1,000.0xxxxxxxxx"); 16477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 1000000, "1,000,000.0xxxxx"); 16487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 100.37, "100.37xxxxxxxxxx"); 16497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 10456.37, "10,456.37xxxxxxx"); 16507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 1120456.37, "1,120,456.37xxxx"); 16517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 112045600.37, "112,045,600.37xx"); 16527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 10252045600.37, "10,252,045,600.37"); 16537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //testing the setPadCharacter(UnicodeString) and getPadCharacterString() 16557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("#", US); 16567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char padString = 'P'; 16577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadCharacter(padString); 16587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "*P##.##", DecimalFormat.PAD_BEFORE_PREFIX, 5, padString); 16597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadCharacter('^'); 16607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "*^#", DecimalFormat.PAD_BEFORE_PREFIX, 1, '^'); 16617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //commented untill implementation is complete 16627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* fmt.setPadCharacter((UnicodeString)"^^^"); 16637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "*^^^#", DecimalFormat.kPadBeforePrefix, 3, (UnicodeString)"^^^"); 16647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert padString.remove(); 16657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert padString.append((UChar)0x0061); 16667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert padString.append((UChar)0x0302); 16677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadCharacter(padString); 16687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UChar patternChars[]={0x002a, 0x0061, 0x0302, 0x0061, 0x0302, 0x0023, 0x0000}; 16697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UnicodeString pattern(patternChars); 16707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, pattern , DecimalFormat.kPadBeforePrefix, 4, padString); 16717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 16727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 16737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 16757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Upgrade to alphaWorks 16767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 16772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 16787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestPatterns2() { 16797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 16807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("#", US); 16817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char hat = 0x005E; /*^*/ 16837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "*^#", DecimalFormat.PAD_BEFORE_PREFIX, 1, hat); 16857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "$*^#", DecimalFormat.PAD_AFTER_PREFIX, 2, hat); 16867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "#*^", DecimalFormat.PAD_BEFORE_SUFFIX, 1, hat); 16877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "#$*^", DecimalFormat.PAD_AFTER_SUFFIX, 2, hat); 16887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "$*^$#", -1); 16897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "#$*^$", -1); 16907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "'pre'#,##0*x'post'", DecimalFormat.PAD_BEFORE_SUFFIX, 12, (char) 0x0078 /*x*/); 16917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "''#0*x", DecimalFormat.PAD_BEFORE_SUFFIX, 3, (char) 0x0078 /*x*/); 16927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "'I''ll'*a###.##", DecimalFormat.PAD_AFTER_PREFIX, 10, (char) 0x0061 /*a*/); 16937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.applyPattern("AA#,##0.00ZZ"); 16957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadCharacter(hat); 16967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(10); 16987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadPosition(DecimalFormat.PAD_BEFORE_PREFIX); 17007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "*^AA#,##0.00ZZ"); 17017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadPosition(DecimalFormat.PAD_BEFORE_SUFFIX); 17037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA#,##0.00*^ZZ"); 17047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadPosition(DecimalFormat.PAD_AFTER_SUFFIX); 17067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA#,##0.00ZZ*^"); 17077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 12 3456789012 17097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String exp = "AA*^#,##0.00ZZ"; 17107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(12); 17117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadPosition(DecimalFormat.PAD_AFTER_PREFIX); 17127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, exp); 17137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(13); 17157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 12 34567890123 17167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA*^##,##0.00ZZ"); 17177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(14); 17197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 12 345678901234 17207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA*^###,##0.00ZZ"); 17217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(15); 17237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 12 3456789012345 17247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA*^####,##0.00ZZ"); // This is the interesting case 17257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(16); 17277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 12 34567890123456 17287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA*^#,###,##0.00ZZ"); 17297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 17327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRegistration() { 17337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final ULocale SRC_LOC = ULocale.FRANCE; 17347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final ULocale SWAP_LOC = ULocale.US; 17357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestFactory extends SimpleNumberFormatFactory { 17377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat currencyStyle; 17387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestFactory() { 17407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert super(SRC_LOC, true); 17417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert currencyStyle = NumberFormat.getIntegerInstance(SWAP_LOC); 17427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 17457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public NumberFormat createFormat(ULocale loc, int formatType) { 17467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (formatType == FORMAT_CURRENCY) { 17477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return currencyStyle; 17487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 17507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f0 = NumberFormat.getIntegerInstance(SWAP_LOC); 17547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f1 = NumberFormat.getIntegerInstance(SRC_LOC); 17557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f2 = NumberFormat.getCurrencyInstance(SRC_LOC); 17567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Object key = NumberFormat.registerFactory(new TestFactory()); 17577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f3 = NumberFormat.getCurrencyInstance(SRC_LOC); 17587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f4 = NumberFormat.getIntegerInstance(SRC_LOC); 17597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.unregister(key); // restore for other tests 17607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f5 = NumberFormat.getCurrencyInstance(SRC_LOC); 17617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert float n = 1234.567f; 17637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f0 swap int: " + f0.format(n)); 17647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f1 src int: " + f1.format(n)); 17657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f2 src cur: " + f2.format(n)); 17667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f3 reg cur: " + f3.format(n)); 17677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f4 reg int: " + f4.format(n)); 17687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f5 unreg cur: " + f5.format(n)); 17697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!f3.format(n).equals(f0.format(n))) { 17717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("registered service did not match"); 17727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!f4.format(n).equals(f1.format(n))) { 17747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("registered service did not inherit"); 17757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!f5.format(n).equals(f2.format(n))) { 17777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("unregistered service did not match original"); 17787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 17827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestScientific2() { 17837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // jb 2552 17847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = (DecimalFormat)NumberFormat.getCurrencyInstance(); 17857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = new Double(12.34); 17867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, num, "$12.34"); 17877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setScientificNotation(true); 17887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, num, "$1.23E1"); 17897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setScientificNotation(false); 17907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, num, "$12.34"); 17917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 17947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestScientificGrouping() { 17957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // jb 2552 17967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("###.##E0"); 17977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, .01234, "12.3E-3"); 17987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, .1234, "123E-3"); 17997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, 1.234, "1.23E0"); 18007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, 12.34, "12.3E0"); 18017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, 123.4, "123E0"); 18027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, 1234, "1.23E3"); 18037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // additional coverage tests 18067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // sigh, can't have static inner classes, why not? 18087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final class PI extends Number { 18107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 18117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * For serialization 18127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 18137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final long serialVersionUID = -305601227915602172L; 18147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private PI() {} 18167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 18177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int intValue() { return (int)Math.PI; } 18187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 18197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public long longValue() { return (long)Math.PI; } 18207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 18217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public float floatValue() { return (float)Math.PI; } 18227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 18237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public double doubleValue() { return Math.PI; } 18247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 18257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public byte byteValue() { return (byte)Math.PI; } 18267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 18277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public short shortValue() { return (short)Math.PI; } 18287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final Number INSTANCE = new PI(); 18307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 18337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCoverage() { 18347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getNumberInstance(); // default locale 18357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(fmt.format(new BigInteger("1234567890987654321234567890987654321", 10))); 18367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = NumberFormat.getScientificInstance(); // default locale 18387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(fmt.format(PI.INSTANCE)); 18407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 18427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(fmt.format("12345")); 18437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("numberformat of string did not throw exception"); 18447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (Exception e) { 18467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("PASS: numberformat of string failed as expected"); 18477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int hash = fmt.hashCode(); 18507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("hash code " + hash); 18517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("compare to string returns: " + fmt.equals("")); 18537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // For ICU 2.6 - alan 18557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 18567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = new DecimalFormat("'*&'' '\u00A4' ''&*' #,##0.00", US); 18577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setCurrency(Currency.getInstance("INR")); 18587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, 1.0, "*&' \u20B9 '&* 1.00"); 18597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, -2.0, "-*&' \u20B9 '&* 2.00"); 18607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.applyPattern("#,##0.00 '*&'' '\u00A4' ''&*'"); 18617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, 2.0, "2.00 *&' \u20B9 '&*"); 18627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, -1.0, "-1.00 *&' \u20B9 '&*"); 18637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert java.math.BigDecimal r; 18657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert r = df.getRoundingIncrement(); 18677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (r != null) { 18687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: rounding = " + r + ", expect null"); 18697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (df.isScientificNotation()) { 18727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: isScientificNotation = true, expect false"); 18737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.applyPattern("0.00000"); 18767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setScientificNotation(true); 18777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!df.isScientificNotation()) { 18787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: isScientificNotation = false, expect true"); 18797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setMinimumExponentDigits((byte)2); 18817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (df.getMinimumExponentDigits() != 2) { 18827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getMinimumExponentDigits = " + 18837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.getMinimumExponentDigits() + ", expect 2"); 18847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setExponentSignAlwaysShown(true); 18867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!df.isExponentSignAlwaysShown()) { 18877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: isExponentSignAlwaysShown = false, expect true"); 18887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setSecondaryGroupingSize(0); 18907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (df.getSecondaryGroupingSize() != 0) { 18917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getSecondaryGroupingSize = " + 18927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.getSecondaryGroupingSize() + ", expect 0"); 18937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, 3.14159, "3.14159E+00"); 18957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DecimalFormatSymbols#getInstance 18977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decsym1 = DecimalFormatSymbols.getInstance(); 18987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decsym2 = new DecimalFormatSymbols(); 18997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!decsym1.equals(decsym2)) { 19007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: DecimalFormatSymbols returned by getInstance()" + 19017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "does not match new DecimalFormatSymbols()."); 19027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert decsym1 = DecimalFormatSymbols.getInstance(Locale.JAPAN); 19047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert decsym2 = DecimalFormatSymbols.getInstance(ULocale.JAPAN); 19057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!decsym1.equals(decsym2)) { 19067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: DecimalFormatSymbols returned by getInstance(Locale.JAPAN)" + 19077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "does not match the one returned by getInstance(ULocale.JAPAN)."); 19087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DecimalFormatSymbols#getAvailableLocales/#getAvailableULocales 19117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale[] allLocales = DecimalFormatSymbols.getAvailableLocales(); 19127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (allLocales.length == 0) { 19137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Got a empty list for DecimalFormatSymbols.getAvailableLocales"); 19147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 19157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("PASS: " + allLocales.length + 19167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " available locales returned by DecimalFormatSymbols.getAvailableLocales"); 19177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale[] allULocales = DecimalFormatSymbols.getAvailableULocales(); 19197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (allULocales.length == 0) { 19207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Got a empty list for DecimalFormatSymbols.getAvailableLocales"); 19217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 19227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("PASS: " + allULocales.length + 19237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " available locales returned by DecimalFormatSymbols.getAvailableULocales"); 19247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 19287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestWhiteSpaceParsing() { 19297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 19307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("a b#0c ", US); 19317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int n = 1234; 19327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "a b1234c ", n); 19337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "a b1234c ", n); 19347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 19377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test currencies whose display name is a ChoiceFormat. 19387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 19392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 19407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestComplexCurrency() { 19417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // CLDR No Longer uses complex currency symbols. 19427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Skipping this test. 19437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Locale loc = new Locale("kn", "IN", ""); 19447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // NumberFormat fmt = NumberFormat.getCurrencyInstance(loc); 19457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect2(fmt, 1.0, "Re.\u00a01.00"); 19477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect(fmt, 1.001, "Re.\u00a01.00"); // tricky 19487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect2(fmt, 12345678.0, "Rs.\u00a01,23,45,678.00"); 19497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect2(fmt, 0.5, "Rs.\u00a00.50"); 19507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect2(fmt, -1.0, "-Re.\u00a01.00"); 19517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect2(fmt, -10.0, "-Rs.\u00a010.00"); 19527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 19557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyKeyword() { 19567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = new ULocale("th_TH@currency=QQQ"); 19577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat format = NumberFormat.getCurrencyInstance(locale); 19587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String result = format.format(12.34f); 19597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!"QQQ12.34".equals(result)) { 19607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("got unexpected currency: " + result); 19617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 19657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test alternate numbering systems 19667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 19672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 19687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestNumberingSystems() { 19697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestNumberingSystemItem { 19707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String localeName; 19717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final double value; 19727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final boolean isRBNF; 19737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String expectedResult; 19747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestNumberingSystemItem(String loc, double val, boolean rbnf, String exp) { 19767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert localeName = loc; 19777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = val; 19787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert isRBNF = rbnf; 19797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectedResult = exp; 19807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final TestNumberingSystemItem[] DATA = { 19847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "en_US@numbers=thai", 1234.567, false, "\u0e51,\u0e52\u0e53\u0e54.\u0e55\u0e56\u0e57" ), 19857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "en_US@numbers=thai", 1234.567, false, "\u0E51,\u0E52\u0E53\u0E54.\u0E55\u0E56\u0E57" ), 19867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "en_US@numbers=hebr", 5678.0, true, "\u05D4\u05F3\u05EA\u05E8\u05E2\u05F4\u05D7" ), 19877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "en_US@numbers=arabext", 1234.567, false, "\u06F1\u066c\u06F2\u06F3\u06F4\u066b\u06F5\u06F6\u06F7" ), 19887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "de_DE@numbers=foobar", 1234.567, false, "1.234,567" ), 19897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "ar_EG", 1234.567, false, "\u0661\u066c\u0662\u0663\u0664\u066b\u0665\u0666\u0667" ), 19907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "th_TH@numbers=traditional", 1234.567, false, "\u0E51,\u0E52\u0E53\u0E54.\u0E55\u0E56\u0E57" ), // fall back to native per TR35 19917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "ar_MA", 1234.567, false, "1.234,567" ), 19927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "en_US@numbers=hanidec", 1234.567, false, "\u4e00,\u4e8c\u4e09\u56db.\u4e94\u516d\u4e03" ), 19937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "ta_IN@numbers=native", 1234.567, false, "\u0BE7,\u0BE8\u0BE9\u0BEA.\u0BEB\u0BEC\u0BED" ), 19947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "ta_IN@numbers=traditional", 1235.0, true, "\u0BF2\u0BE8\u0BF1\u0BE9\u0BF0\u0BEB" ), 19957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "ta_IN@numbers=finance", 1234.567, false, "1,234.567" ), // fall back to default per TR35 19967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "zh_TW@numbers=native", 1234.567, false, "\u4e00,\u4e8c\u4e09\u56db.\u4e94\u516d\u4e03" ), 19977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "zh_TW@numbers=traditional", 1234.567, true, "\u4E00\u5343\u4E8C\u767E\u4E09\u5341\u56DB\u9EDE\u4E94\u516D\u4E03" ), 19987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "zh_TW@numbers=finance", 1234.567, true, "\u58F9\u4EDF\u8CB3\u4F70\u53C3\u62FE\u8086\u9EDE\u4F0D\u9678\u67D2" ) 19997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 20007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (TestNumberingSystemItem item : DATA) { 20037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale loc = new ULocale(item.localeName); 20047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getInstance(loc); 20057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (item.isRBNF) { 20067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect3(fmt,item.value,item.expectedResult); 20077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 20087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt,item.value,item.expectedResult); 20097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2013e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn // Coverage tests for methods not being called otherwise. 20142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 2015e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn public void TestNumberingSystemCoverage() { 2016e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn // Test getAvaliableNames 2017e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn String[] availableNames = NumberingSystem.getAvailableNames(); 2018e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn if (availableNames == null || availableNames.length <= 0) { 2019e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn errln("ERROR: NumberingSystem.getAvailableNames() returned a null or empty array."); 2020e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn } else { 2021e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn boolean latnFound = false; 2022e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn for (String name : availableNames){ 2023e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn if ("latn".equals(name)) { 2024e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn latnFound = true; 2025e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn break; 2026e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn } 2027e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn } 20282d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2029e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn if (!latnFound) { 2030e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn errln("ERROR: 'latn' numbering system not found on NumberingSystem.getAvailableNames()."); 2031e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn } 2032e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn } 20332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2034e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn // Test NumberingSystem.getInstance() 2035e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn NumberingSystem ns1 = NumberingSystem.getInstance(); 2036e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn if (ns1 == null || ns1.isAlgorithmic()) { 2037e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn errln("ERROR: NumberingSystem.getInstance() returned a null or invalid NumberingSystem"); 2038e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn } 20392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2040e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn // Test NumberingSystem.getInstance(int,boolean,String) 2041e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn /* Parameters used: the ones used in the default constructor 2042e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn * radix = 10; 2043e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn * algorithmic = false; 2044e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn * desc = "0123456789"; 2045e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn */ 2046e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn NumberingSystem ns2 = NumberingSystem.getInstance(10, false, "0123456789"); 2047e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn if (ns2 == null || ns2.isAlgorithmic()) { 2048e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn errln("ERROR: NumberingSystem.getInstance(int,boolean,String) returned a null or invalid NumberingSystem"); 2049e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn } 20502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2051e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn // Test NumberingSystem.getInstance(Locale) 2052e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn NumberingSystem ns3 = NumberingSystem.getInstance(Locale.ENGLISH); 2053e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn if (ns3 == null || ns3.isAlgorithmic()) { 2054e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn errln("ERROR: NumberingSystem.getInstance(Locale) returned a null or invalid NumberingSystem"); 2055e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn } 2056e32684d8bb58005d8188da8c732a4d407713f003Felipe BalbontÃn } 20577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 20597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test6816() { 20607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency cur1 = Currency.getInstance(new Locale("und", "PH")); 20617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nfmt = NumberFormat.getCurrencyInstance(new Locale("und", "PH")); 20637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decsym = ((DecimalFormat)nfmt).getDecimalFormatSymbols(); 20647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency cur2 = decsym.getCurrency(); 20657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( !cur1.getCurrencyCode().equals("PHP") || !cur2.getCurrencyCode().equals("PHP")) { 20677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Currencies should match PHP: cur1 = "+cur1.getCurrencyCode()+"; cur2 = "+cur2.getCurrencyCode()); 20687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 20737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestThreadedFormat() { 20747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class FormatTask implements Runnable { 20767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt; 20777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buf; 20787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean inc; 20797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert float num; 20807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FormatTask(DecimalFormat fmt, int index) { 20827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.fmt = fmt; 20837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.buf = new StringBuffer(); 20847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.inc = (index & 0x1) == 0; 20857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.num = inc ? 0 : 10000; 20867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Override 20897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void run() { 20907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (inc) { 20917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (num < 10000) { 20927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf.append(fmt.format(num) + "\n"); 20937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num += 3.14159; 20947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 20967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (num > 0) { 20977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf.append(fmt.format(num) + "\n"); 20987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num -= 3.14159; 20997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String result() { 21047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return buf.toString(); 21057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("0.####"); 21097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FormatTask[] tasks = new FormatTask[8]; 21107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < tasks.length; ++i) { 21117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tasks[i] = new FormatTask(fmt, i); 21127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestUtil.runUntilDone(tasks); 21157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 2; i < tasks.length; i++) { 21177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str1 = tasks[i].result(); 21187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str2 = tasks[i-2].result(); 21197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!str1.equals(str2)) { 21207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert System.out.println("mismatch at " + i); 21217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert System.out.println(str1); 21227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert System.out.println(str2); 21237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("decimal format thread mismatch"); 21247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 21267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str1 = str2; 21287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 21327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestPerMill() { 21337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("###.###\u2030"); 21347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("0.4857 x ###.###\u2030", 21357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "485.7\u2030", fmt.format(0.4857)); 21367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.ENGLISH); 21387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setPerMill('m'); 21397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt2 = new DecimalFormat("", sym); 21407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt2.applyLocalizedPattern("###.###m"); 21417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("0.4857 x ###.###m", 21427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "485.7m", fmt2.format(0.4857)); 21437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 21467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestIllegalPatterns() { 21477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test cases: 21487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Prefix with "-:" for illegal patterns 21497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Prefix with "+:" for legal patterns 21507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String DATA[] = { 21517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Unquoted special characters in the suffix are illegal 21527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-:000.000|###", 21537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "+:000.000'|###'", 21547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 21557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; ++i) { 21567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat=DATA[i]; 21577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean valid = pat.charAt(0) == '+'; 21587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = pat.substring(2); 21597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Exception e = null; 21607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 21617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // locale doesn't matter here 21627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat(pat); 21637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException e1) { 21647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e = e1; 21657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IndexOutOfBoundsException e1) { 21667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e = e1; 21677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String msg = (e==null) ? "success" : e.getMessage(); 21697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((e==null) == valid) { 21707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: pattern \"" + pat + "\": " + msg); 21717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 21727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: pattern \"" + pat + "\" should have " + 21737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (valid?"succeeded":"failed") + "; got " + msg); 21747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 21797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Parse a CurrencyAmount using the given NumberFormat, with 21807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the 'delim' character separating the number and the currency. 21817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 21827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static CurrencyAmount parseCurrencyAmount(String str, NumberFormat fmt, 21837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char delim) 21847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throws ParseException { 21857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int i = str.indexOf(delim); 21867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CurrencyAmount(fmt.parse(str.substring(0,i)), 21877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency.getInstance(str.substring(i+1))); 21887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 21917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Return an integer representing the next token from this 21927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * iterator. The integer will be an index into the given list, or 21937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * -1 if there are no more tokens, or -2 if the token is not on 21947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the list. 21957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 21967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static int keywordIndex(String tok) { 21977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<KEYWORDS.length; ++i) { 21987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (tok.equals(KEYWORDS[i])) { 21997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return i; 22007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return -1; 22037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 22057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String KEYWORDS[] = { 22067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*0*/ "ref=", // <reference pattern to parse numbers> 22077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*1*/ "loc=", // <locale for formats> 22087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*2*/ "f:", // <pattern or '-'> <number> <exp. string> 22097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*3*/ "fp:", // <pattern or '-'> <number> <exp. string> <exp. number> 22107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*4*/ "rt:", // <pattern or '-'> <(exp.) number> <(exp.) string> 22117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*5*/ "p:", // <pattern or '-'> <string> <exp. number> 22127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*6*/ "perr:", // <pattern or '-'> <invalid string> 22137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*7*/ "pat:", // <pattern or '-'> <exp. toPattern or '-' or 'err'> 22147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*8*/ "fpc:", // <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt> 22157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*9*/ "strict=", // true or false 22167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 22177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2218aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert @SuppressWarnings("resource") // InputStream is will be closed by the ResourceReader. 22192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 22207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCases() { 22217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String caseFileName = "NumberFormatTestCases.txt"; 22227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert java.io.InputStream is = NumberFormatTest.class.getResourceAsStream(caseFileName); 22237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 22247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ResourceReader reader = new ResourceReader(is, caseFileName, "utf-8"); 22257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TokenIterator tokens = new TokenIterator(reader); 22267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 22277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale loc = new Locale("en", "US", ""); 22287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat ref = null, fmt = null; 22297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert MeasureFormat mfmt = null; 22307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = null, str = null, mloc = null; 22317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean strict = false; 22327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 22337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 22347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (;;) { 22357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String tok = tokens.next(); 22367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (tok == null) { 22377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 22387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String where = "(" + tokens.getLineNumber() + ") "; 22407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int cmd = keywordIndex(tok); 22417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert switch (cmd) { 22427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 0: 22437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // ref= <reference pattern> 22447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ref = new DecimalFormat(tokens.next(), 22457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormatSymbols(Locale.US)); 22467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ref.setParseStrict(strict); 22477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Setting reference pattern to:\t" + ref); 22487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 22497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 1: 22507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // loc= <locale> 22517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert loc = LocaleUtility.getLocaleFromName(tokens.next()); 22527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = ((DecimalFormat) NumberFormat.getInstance(loc)).toPattern(); 22537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Setting locale to:\t" + loc + ", \tand pattern to:\t" + pat); 22547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 22557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 2: // f: 22567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 3: // fp: 22577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 4: // rt: 22587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 5: // p: 22597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tok = tokens.next(); 22607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!tok.equals("-")) { 22617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = tok; 22627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 22647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = new DecimalFormat(pat, new DecimalFormatSymbols(loc)); 22657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseStrict(strict); 22667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException iae) { 22677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + "Pattern \"" + pat + '"'); 22687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert iae.printStackTrace(); 22697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tokens.next(); // consume remaining tokens 22707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //tokens.next(); 22717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cmd == 3) tokens.next(); 22727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 22737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = null; 22757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 22767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cmd == 2 || cmd == 3 || cmd == 4) { 22777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // f: <pattern or '-'> <number> <exp. string> 22787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // fp: <pattern or '-'> <number> <exp. string> <exp. number> 22797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // rt: <pattern or '-'> <number> <string> 22807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String num = tokens.next(); 22817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = tokens.next(); 22827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = ref.parse(num); 22837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + '"' + pat + "\".format(" + num + ")", 22847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str, fmt.format(n)); 22857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cmd == 3) { // fp: 22867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n = ref.parse(tokens.next()); 22877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cmd != 2) { // != f: 22897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + '"' + pat + "\".parse(\"" + str + "\")", 22907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n, fmt.parse(str)); 22917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // p: <pattern or '-'> <string to parse> <exp. number> 22947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert else { 22957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = tokens.next(); 22967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String expstr = tokens.next(); 22977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number parsed = fmt.parse(str); 22987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number exp = ref.parse(expstr); 22997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + '"' + pat + "\".parse(\"" + str + "\")", 23007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert exp, parsed); 23017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 23037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + '"' + pat + "\".parse(\"" + str + 23047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\") threw an exception"); 23057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e.printStackTrace(); 23067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 23087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 6: 23097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // perr: <pattern or '-'> <invalid string> 23107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Under construction"); 23117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 23127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 7: 23137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // pat: <pattern> <exp. toPattern, or '-' or 'err'> 23147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String testpat = tokens.next(); 23157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String exppat = tokens.next(); 23167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean err = exppat.equals("err"); 23177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testpat.equals("-")) { 23187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (err) { 23197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Invalid command \"pat: - err\" at " + tokens.describePosition()); 23207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 23217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert testpat = pat; 23237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (exppat.equals("-")) exppat = testpat; 23257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 23267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat f = null; 23277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testpat == pat) { // [sic] 23287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f = fmt; 23297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 23307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f = new DecimalFormat(testpat); 23317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setParseStrict(strict); 23327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (err) { 23347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + "Invalid pattern \"" + testpat + 23357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\" was accepted"); 23367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 23377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + '"' + testpat + "\".toPattern()", 23387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert exppat, f.toPattern()); 23397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException iae2) { 23417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (err) { 23427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: " + where + "Invalid pattern \"" + testpat + 23437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\" threw an exception"); 23447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 23457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + "Valid pattern \"" + testpat + 23467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\" threw an exception"); 23477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert iae2.printStackTrace(); 23487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 23517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 8: // fpc: 23527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tok = tokens.next(); 23537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!tok.equals("-")) { 23547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert mloc = tok; 23557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale l = new ULocale(mloc); 23567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 23577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert mfmt = MeasureFormat.getCurrencyFormat(l); 23587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException iae) { 23597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + "Loc \"" + tok + '"'); 23607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert iae.printStackTrace(); 23617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tokens.next(); // consume remaining tokens 23627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tokens.next(); 23637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tokens.next(); 23647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 23657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = null; 23687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 23697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // fpc: <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt> 23707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String currAmt = tokens.next(); 23717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = tokens.next(); 23727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount target = parseCurrencyAmount(currAmt, ref, '/'); 23737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String formatResult = mfmt.format(target); 23747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + "getCurrencyFormat(" + mloc + ").format(" + currAmt + ")", 23757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str, formatResult); 23767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert target = parseCurrencyAmount(tokens.next(), ref, '/'); 23777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount parseResult = (CurrencyAmount) mfmt.parseObject(str); 23787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")", 23797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert target, parseResult); 23807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 23817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + '"' + pat + "\".parse(\"" + str + 23827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\") threw an exception"); 23837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e.printStackTrace(); 23847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 23867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 9: // strict= true or false 23877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert strict = "true".equalsIgnoreCase(tokens.next()); 23887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Setting strict to:\t" + strict); 23897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 23907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case -1: 23917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Unknown command \"" + tok + "\" at " + tokens.describePosition()); 23927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 23937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (java.io.IOException e) { 23967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new RuntimeException(e); 2397aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert } finally { 2398aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert try { 2399aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert reader.close(); 2400aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert } catch (IOException ignored) { 2401aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert } 24027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 24037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 24047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 24052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 24067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFieldPositionDecimal() { 24077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 24087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositivePrefix("FOO"); 24097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositiveSuffix("BA"); 24107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buffer = new StringBuffer(); 24117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR); 24127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(35.47, buffer, fp); 24137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("35.47", "FOO35.47BA", buffer.toString()); 24147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp begin", 5, fp.getBeginIndex()); 24157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp end", 6, fp.getEndIndex()); 24167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 24177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 24182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 24197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFieldPositionInteger() { 24207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 24217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositivePrefix("FOO"); 24227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositiveSuffix("BA"); 24237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buffer = new StringBuffer(); 24247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(NumberFormat.Field.INTEGER); 24257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(35.47, buffer, fp); 24267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("35.47", "FOO35.47BA", buffer.toString()); 24277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp begin", 3, fp.getBeginIndex()); 24287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp end", 5, fp.getEndIndex()); 24297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 24307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 24312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 24327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFieldPositionFractionButInteger() { 24337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 24347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositivePrefix("FOO"); 24357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositiveSuffix("BA"); 24367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buffer = new StringBuffer(); 24377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(NumberFormat.Field.FRACTION); 24387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(35, buffer, fp); 24397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("35", "FOO35BA", buffer.toString()); 24407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp begin", 5, fp.getBeginIndex()); 24417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp end", 5, fp.getEndIndex()); 24427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 24437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 24442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 24457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFieldPositionFraction() { 24467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 24477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositivePrefix("FOO"); 24487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositiveSuffix("BA"); 24497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buffer = new StringBuffer(); 24507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(NumberFormat.Field.FRACTION); 24517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(35.47, buffer, fp); 24527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("35.47", "FOO35.47BA", buffer.toString()); 24537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp begin", 6, fp.getBeginIndex()); 24547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp end", 8, fp.getEndIndex()); 24557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 24567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 24572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 2458ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius public void TestFieldPositionCurrency() { 2459ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.US); 2460ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius double amount = 35.47; 2461ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius double negAmount = -34.567; 2462ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius FieldPosition cp = new FieldPosition(NumberFormat.Field.CURRENCY); 24632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2464ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer0 = new StringBuffer(); 2465ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(amount, buffer0, cp); 2466ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("$35.47", "$35.47", buffer0.toString()); 2467ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 0, cp.getBeginIndex()); 2468ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 1, cp.getEndIndex()); 24692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2470ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer01 = new StringBuffer(); 2471ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(negAmount, buffer01, cp); 2472ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-$34.57", "-$34.57", buffer01.toString()); 2473ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 1, cp.getBeginIndex()); 24742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert assertEquals("cp end", 2, cp.getEndIndex()); 24752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2476ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.setCurrency(Currency.getInstance(Locale.FRANCE)); 2477ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer1 = new StringBuffer(); 2478ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(amount, buffer1, cp); 2479ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("€35.47", "€35.47", buffer1.toString()); 2480ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 0, cp.getBeginIndex()); 2481ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 1, cp.getEndIndex()); 2482ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2483ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.setCurrency(Currency.getInstance(new Locale("fr", "ch", ""))); 2484ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer2 = new StringBuffer(); 2485ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(amount, buffer2, cp); 2486ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("CHF35.47", "CHF35.47", buffer2.toString()); 2487ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 0, cp.getBeginIndex()); 2488ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 3, cp.getEndIndex()); 2489ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2490ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer20 = new StringBuffer(); 2491ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(negAmount, buffer20, cp); 2492ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-CHF34.57", "-CHF34.57", buffer20.toString()); 2493ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 1, cp.getBeginIndex()); 2494ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 4, cp.getEndIndex()); 24952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2496ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.FRANCE); 2497ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer3 = new StringBuffer(); 2498ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(amount, buffer3, cp); 2499ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("35,47 €", "35,47 €", buffer3.toString()); 2500ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 6, cp.getBeginIndex()); 2501ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 7, cp.getEndIndex()); 2502ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2503ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer4 = new StringBuffer(); 2504ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(negAmount, buffer4, cp); 2505ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-34,57 €", "-34,57 €", buffer4.toString()); 2506ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 7, cp.getBeginIndex()); 2507ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 8, cp.getEndIndex()); 25082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2509ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.setCurrency(Currency.getInstance(new Locale("fr", "ch"))); 2510ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer5 = new StringBuffer(); 2511ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(negAmount, buffer5, cp); 2512ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-34,57 CHF", "-34,57 CHF", buffer5.toString()); 2513ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 7, cp.getBeginIndex()); 2514ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 10, cp.getEndIndex()); 25152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2516ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius NumberFormat plCurrencyFmt = NumberFormat.getInstance(new Locale("fr", "ch"), NumberFormat.PLURALCURRENCYSTYLE); 2517ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer6 = new StringBuffer(); 2518ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt.format(negAmount, buffer6, cp); 2519ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-34.57 francs suisses", "-34.57 francs suisses", buffer6.toString()); 2520ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 7, cp.getBeginIndex()); 25212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert assertEquals("cp end", 21, cp.getEndIndex()); 25222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2523ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius // Positive value with PLURALCURRENCYSTYLE. 2524ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "ch"), NumberFormat.PLURALCURRENCYSTYLE); 2525ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer7 = new StringBuffer(); 2526ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt.format(amount, buffer7, cp); 2527ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("35.47スイス フラン", "35.47スイス フラン", buffer7.toString()); 2528ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 5, cp.getBeginIndex()); 2529ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 12, cp.getEndIndex()); 25302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2531ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius // PLURALCURRENCYSTYLE for non-ASCII. 2532ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "de"), NumberFormat.PLURALCURRENCYSTYLE); 2533ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer8 = new StringBuffer(); 2534ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt.format(negAmount, buffer8, cp); 2535ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-34.57ユーロ", "-34.57ユーロ", buffer8.toString()); 2536ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 6, cp.getBeginIndex()); 2537ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 9, cp.getEndIndex()); 25382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2539ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.JAPAN); 2540ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.setCurrency(Currency.getInstance(new Locale("ja", "jp"))); 2541ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer9 = new StringBuffer(); 2542ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(negAmount, buffer9, cp); 2543ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-¥35", "-¥35", buffer9.toString()); 2544ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 1, cp.getBeginIndex()); 2545ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 2, cp.getEndIndex()); 25462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2547ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius // Negative value with PLURALCURRENCYSTYLE. 2548ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "ch"), NumberFormat.PLURALCURRENCYSTYLE); 2549ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer10 = new StringBuffer(); 2550ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt.format(negAmount, buffer10, cp); 2551ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-34.57スイス フラン", "-34.57スイス フラン", buffer10.toString()); 2552ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 6, cp.getBeginIndex()); 2553ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 13, cp.getEndIndex()); 25542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 2555ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius // Nagative value with PLURALCURRENCYSTYLE, Arabic digits. 2556ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("ar", "eg")); 2557ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt = NumberFormat.getInstance(new Locale("ar", "eg"), NumberFormat.PLURALCURRENCYSTYLE); 2558ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer11 = new StringBuffer(); 2559ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt.format(negAmount, buffer11, cp); 25602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert assertEquals("-٣٤٫٥٧ جنيه مصري", "-٣٤٫٥٧ جنيه مصري", buffer11.toString()); 2561ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 8, cp.getBeginIndex()); 2562ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 17, cp.getEndIndex()); 2563ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius } 25642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 25652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 25667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRounding() { 25677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 25687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (false) { // for debugging specific value 25697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setRoundingMode(BigDecimal.ROUND_HALF_UP); 25707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkRounding(nf, new BigDecimal("300.0300000000"), 0, new BigDecimal("0.020000000")); 25717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // full tests 25737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] roundingIncrements = {1, 2, 5, 20, 50, 100}; 25747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] testValues = {0, 300}; 25757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int j = 0; j < testValues.length; ++j) { 25767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int mode = BigDecimal.ROUND_UP; mode < BigDecimal.ROUND_HALF_EVEN; ++mode) { 25777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setRoundingMode(mode); 25787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int increment = 0; increment < roundingIncrements.length; ++increment) { 25797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal base = new BigDecimal(testValues[j]); 25807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal rInc = new BigDecimal(roundingIncrements[increment]); 25817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkRounding(nf, base, 20, rInc); 25827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rInc = new BigDecimal("1.000000000").divide(rInc); 25837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkRounding(nf, base, 20, rInc); 25847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 25907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRoundingPattern() { 25917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestRoundingPatternItem { 25927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern; 25937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double roundingIncrement; 25947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double testCase; 25957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String expected; 25967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestRoundingPatternItem(String pattern, double roundingIncrement, double testCase, String expected) { 25987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.pattern = pattern; 25997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.roundingIncrement = roundingIncrement; 26007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.testCase = testCase; 26017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.expected = expected; 26027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 26047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestRoundingPatternItem []tests = { 26067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestRoundingPatternItem("##0.65", 0.65, 1.234, "1.30"), 26077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestRoundingPatternItem("#50", 50.0, 1230, "1250") 26087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 26097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 26117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String result; 26127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal bd; 26137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < tests.length; i++) { 26147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.applyPattern(tests[i].pattern); 26157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = df.format(tests[i].testCase); 26177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!tests[i].expected.equals(result)) { 26197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("String Pattern Rounding Test Failed: Pattern: \"" + tests[i].pattern + "\" Number: " + tests[i].testCase + " - Got: " + result + " Expected: " + tests[i].expected); 26207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bd = new BigDecimal(tests[i].roundingIncrement); 26237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setRoundingIncrement(bd); 26257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = df.format(tests[i].testCase); 26277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!tests[i].expected.equals(result)) { 26297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("BigDecimal Rounding Test Failed: Pattern: \"" + tests[i].pattern + "\" Number: " + tests[i].testCase + " - Got: " + result + " Expected: " + tests[i].expected); 26307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 26357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestBigDecimalRounding() { 26367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String figure = "50.000000004"; 26377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double dbl = new Double(figure); 26387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal dec = new BigDecimal(figure); 26397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat f = (DecimalFormat) NumberFormat.getInstance(); 26417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.applyPattern("00.00######"); 26427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("double format", "50.00", f.format(dbl)); 26447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("bigdec format", "50.00", f.format(dec)); 26457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int maxFracDigits = f.getMaximumFractionDigits(); 26477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal roundingIncrement = new BigDecimal("1").movePointLeft(maxFracDigits); 26487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setRoundingIncrement(roundingIncrement); 26507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setRoundingMode(BigDecimal.ROUND_DOWN); 26517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Rounding down", f.format(dbl), f.format(dec)); 26527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setRoundingIncrement(roundingIncrement); 26547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setRoundingMode(BigDecimal.ROUND_HALF_UP); 26557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Rounding half up", f.format(dbl), f.format(dec)); 26567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void checkRounding(DecimalFormat nf, BigDecimal base, int iterations, BigDecimal increment) { 26597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setRoundingIncrement(increment.toBigDecimal()); 26607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal lastParsed = new BigDecimal(Integer.MIN_VALUE); // used to make sure that rounding is monotonic 26617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = -iterations; i <= iterations; ++i) { 26627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal iValue = base.add(increment.multiply(new BigDecimal(i)).movePointLeft(1)); 26637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal smallIncrement = new BigDecimal("0.00000001"); 26647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (iValue.signum() != 0) { 26657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert smallIncrement.multiply(iValue); // scale unless zero 26667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // we not only test the value, but some values in a small range around it. 26687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lastParsed = checkRound(nf, iValue.subtract(smallIncrement), lastParsed); 26697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lastParsed = checkRound(nf, iValue, lastParsed); 26707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lastParsed = checkRound(nf, iValue.add(smallIncrement), lastParsed); 26717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private BigDecimal checkRound(DecimalFormat nf, BigDecimal iValue, BigDecimal lastParsed) { 26757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String formatedBigDecimal = nf.format(iValue); 26767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String formattedDouble = nf.format(iValue.doubleValue()); 26777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!equalButForTrailingZeros(formatedBigDecimal, formattedDouble)) { 26787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failure at: " + iValue + " (" + iValue.doubleValue() + ")" 26807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tRounding-mode: " + roundingModeNames[nf.getRoundingMode()] 26817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tRounding-increment: " + nf.getRoundingIncrement() 26827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tdouble: " + formattedDouble 26837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tBigDecimal: " + formatedBigDecimal); 26847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 26867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Value: " + iValue 26877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tRounding-mode: " + roundingModeNames[nf.getRoundingMode()] 26887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tRounding-increment: " + nf.getRoundingIncrement() 26897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tdouble: " + formattedDouble 26907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tBigDecimal: " + formatedBigDecimal); 26917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 26937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Number should have compareTo(...) 26947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal parsed = toBigDecimal(nf.parse(formatedBigDecimal)); 26957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (lastParsed.compareTo(parsed) > 0) { 26967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Rounding wrong direction!: " + lastParsed + " > " + parsed); 26977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lastParsed = parsed; 26997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 27007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Parse Failure with: " + formatedBigDecimal); 27017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return lastParsed; 27037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static BigDecimal toBigDecimal(Number number) { 27067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return number instanceof BigDecimal ? (BigDecimal) number 27077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert : number instanceof BigInteger ? new BigDecimal((BigInteger)number) 27087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert : number instanceof java.math.BigDecimal ? new BigDecimal((java.math.BigDecimal)number) 27097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert : number instanceof Double ? new BigDecimal(number.doubleValue()) 27107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert : number instanceof Float ? new BigDecimal(number.floatValue()) 27117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert : new BigDecimal(number.longValue()); 27127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static String[] roundingModeNames = { 27157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "ROUND_UP", "ROUND_DOWN", "ROUND_CEILING", "ROUND_FLOOR", 27167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "ROUND_HALF_UP", "ROUND_HALF_DOWN", "ROUND_HALF_EVEN", 27177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "ROUND_UNNECESSARY" 27187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 27197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static boolean equalButForTrailingZeros(String formatted1, String formatted2) { 27217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (formatted1.length() == formatted2.length()) return formatted1.equals(formatted2); 27227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return stripFinalZeros(formatted1).equals(stripFinalZeros(formatted2)); 27237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static String stripFinalZeros(String formatted) { 27267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int len1 = formatted.length(); 27277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char ch; 27287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (len1 > 0 && ((ch = formatted.charAt(len1-1)) == '0' || ch == '.')) --len1; 27297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (len1==1 && ((ch = formatted.charAt(len1-1)) == '-')) --len1; 27307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return formatted.substring(0,len1); 27317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //------------------------------------------------------------------ 27347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Support methods 27357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //------------------------------------------------------------------ 27367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test 27387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect2(NumberFormat fmt, Number n, String exp) { 27397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Don't round-trip format test, since we explicitly do it 27407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, n, exp, false); 27417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, exp, n); 27427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test 27447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect3(NumberFormat fmt, Number n, String exp) { 27457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Don't round-trip format test, since we explicitly do it 27467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect_rbnf(fmt, n, exp, false); 27477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect_rbnf(fmt, exp, n); 27487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test (convenience) 27517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect2(NumberFormat fmt, double n, String exp) { 27527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt, new Double(n), exp); 27537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test (convenience) 27557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect3(NumberFormat fmt, double n, String exp) { 27567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect3(fmt, new Double(n), exp); 27577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test (convenience) 27607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect2(NumberFormat fmt, long n, String exp) { 27617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt, new Long(n), exp); 27627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test (convenience) 27647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect3(NumberFormat fmt, long n, String exp) { 27657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect3(fmt, new Long(n), exp); 27667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format test 27697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, Number n, String exp, boolean rt) { 27707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer saw = new StringBuffer(); 27717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 27727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.format(n, saw, pos); 27737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = ((DecimalFormat)fmt).toPattern(); 27747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (saw.toString().equals(exp)) { 27757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok " + n + " x " + 27767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat + " = \"" + 27777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert saw + "\""); 27787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // We should be able to round-trip the formatted string => 27797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // number => string (but not the other way around: number 27807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // => string => number2, might have number2 != number): 27817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rt) { 27827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 27837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n2 = fmt.parse(exp); 27847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer saw2 = new StringBuffer(); 27857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.format(n2, saw2, pos); 27867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!saw2.toString().equals(exp)) { 27877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 27887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL \"" + exp + "\" => " + n2 + " => \"" + saw2 + '"'); 27897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 27917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 27927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", " + e.getMessage()); 27937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 27947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 27977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect() format test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 27987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL " + n + " x " + pat + " = \"" + saw + "\", expected \"" + exp + "\""); 27997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format test 28027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect_rbnf(NumberFormat fmt, Number n, String exp, boolean rt) { 28037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer saw = new StringBuffer(); 28047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 28057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.format(n, saw, pos); 28067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (saw.toString().equals(exp)) { 28077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok " + n + " = \"" + 28087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert saw + "\""); 28097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // We should be able to round-trip the formatted string => 28107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // number => string (but not the other way around: number 28117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // => string => number2, might have number2 != number): 28127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rt) { 28137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 28147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n2 = fmt.parse(exp); 28157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer saw2 = new StringBuffer(); 28167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.format(n2, saw2, pos); 28177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!saw2.toString().equals(exp)) { 28187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect_rbnf() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 28197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL \"" + exp + "\" => " + n2 + " => \"" + saw2 + '"'); 28207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 28227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect_rbnf() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 28237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", " + e.getMessage()); 28247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 28257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 28287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect_rbnf() format test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 28297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL " + n + " = \"" + saw + "\", expected \"" + exp + "\""); 28307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format test (convenience) 28347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, Number n, String exp) { 28357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, n, exp, true); 28367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format test (convenience) 28397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, double n, String exp) { 28407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, new Double(n), exp); 28417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format test (convenience) 28447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, long n, String exp) { 28457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, new Long(n), exp); 28467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Parse test 28497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, String str, Number n) { 28507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = null; 28517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 28527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num = fmt.parse(str); 28537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 28547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(e.getMessage()); 28557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 28567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = ((DecimalFormat)fmt).toPattern(); 28587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // A little tricky here -- make sure Double(12345.0) and 28597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Long(12345) match. 28607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (num.equals(n) || num.doubleValue() == n.doubleValue()) { 28617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok \"" + str + "\" x " + 28627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat + " = " + 28637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num); 28647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 28657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect() parse test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 28667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL \"" + str + "\" x " + pat + " = " + num + ", expected " + n); 28677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Parse test 28717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect_rbnf(NumberFormat fmt, String str, Number n) { 28727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = null; 28737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 28747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num = fmt.parse(str); 28757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 28767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(e.getMessage()); 28777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 28787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // A little tricky here -- make sure Double(12345.0) and 28807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Long(12345) match. 28817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (num.equals(n) || num.doubleValue() == n.doubleValue()) { 28827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok \"" + str + " = " + 28837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num); 28847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 28857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect_rbnf() parse test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 28867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL \"" + str + " = " + num + ", expected " + n); 28877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Parse test (convenience) 28917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, String str, double n) { 28927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, str, new Double(n)); 28937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Parse test (convenience) 28967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, String str, long n) { 28977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, str, new Long(n)); 28987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void expectCurrency(NumberFormat nf, Currency curr, 29017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double value, String string) { 29027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = (DecimalFormat) nf; 29037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (curr != null) { 29047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setCurrency(curr); 29057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = fmt.format(value).replace('\u00A0', ' '); 29077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (s.equals(string)) { 29097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: " + value + " x " + curr + " => " + s); 29107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 29117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + value + " x " + curr + " => " + s + 29127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expected " + string); 29137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expectPad(DecimalFormat fmt, String pat, int pos) { 29177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, pat, pos, 0, (char)0); 29187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expectPad(DecimalFormat fmt, final String pat, int pos, int width, final char pad) { 29217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int apos = 0, awidth = 0; 29227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char apadStr; 29237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 29247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.applyPattern(pat); 29257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert apos = fmt.getPadPosition(); 29267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert awidth = fmt.getFormatWidth(); 29277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert apadStr = fmt.getPadCharacter(); 29287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 29297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert apos = -1; 29307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert awidth = width; 29317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert apadStr = pad; 29327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (apos == pos && awidth == width && apadStr == pad) { 29357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok \"" + pat + "\" pos=" 29367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + apos + ((pos == -1) ? "" : " width=" + awidth + " pad=" + apadStr)); 29377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 29387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL \"" + pat + "\" pos=" + apos + " width=" 29397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + awidth + " pad=" + apadStr + ", expected " 29407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + pos + " " + width + " " + pad); 29417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expectPat(DecimalFormat fmt, final String exp) { 29457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = fmt.toPattern(); 29467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pat.equals(exp)) { 29477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok \"" + pat + "\""); 29487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 29497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL \"" + pat + "\", expected \"" + exp + "\""); 29507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void expectParseCurrency(NumberFormat fmt, Currency expected, String text) { 29557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 29567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount currencyAmount = fmt.parseCurrency(text, pos); 29577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertTrue("Parse of " + text + " should have succeeded.", pos.getIndex() > 0); 29582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert assertEquals("Currency should be correct.", expected, currencyAmount.getCurrency()); 29597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 29627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestJB3832(){ 29637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = new ULocale("pt_PT@currency=PTE"); 29647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat format = NumberFormat.getCurrencyInstance(locale); 29657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency curr = Currency.getInstance(locale); 29667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("\nName of the currency is: " + curr.getName(locale, Currency.LONG_NAME, new boolean[] {false})); 29677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount cAmt = new CurrencyAmount(1150.50, curr); 29687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("CurrencyAmount object's hashCode is: " + cAmt.hashCode()); //cover hashCode 29697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str = format.format(cAmt); 29707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String expected = "1,150$50\u00a0\u200b"; 29717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(!expected.equals(str)){ 29727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Did not get the expected output Expected: "+expected+" Got: "+ str); 29737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 29777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestStrictParse() { 29787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] pass = { 29797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0", // single zero before end of text is not leading 29807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0 ", // single zero at end of number is not leading 29817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.", // single zero before period (or decimal, it's ambiguous) is not leading 29827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0,", // single zero before comma (not group separator) is not leading 29837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.0", // single zero before decimal followed by digit is not leading 29847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0. ", // same as above before period (or decimal) is not leading 29857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.100,5", // comma stops parse of decimal (no grouping) 29867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ".00", // leading decimal is ok, even with zeros 29877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1234567", // group separators are not required 29887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12345, ", // comma not followed by digit is not a group separator, but end of number 29897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234, ", // if group separator is present, group sizes must be appropriate 29907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234,567", // ...secondary too 29917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0E", // an exponent not followed by zero or digits is not an exponent 29927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "00", // leading zero before zero - used to be error - see ticket #7913 29937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "012", // leading zero before digit - used to be error - see ticket #7913 29947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0,456", // leading zero before group separator - used to be error - see ticket #7913 29957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 29967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] fail = { 29977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,2", // wrong number of digits after group separator 29987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ",0", // leading group separator before zero 29997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ",1", // leading group separator before digit 30007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ",.02", // leading group separator before decimal 30017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,.02", // group separator before decimal 30027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,,200", // multiple group separators 30037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,45", // wrong number of digits in primary group 30047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,45 that", // wrong number of digits in primary group 30057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,45.34", // wrong number of digits in primary group 30067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1234,567", // wrong number of digits in secondary group 30077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,567", // wrong number of digits in secondary group 30087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,23,456,7890", // wrong number of digits in primary and secondary groups 30097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 30107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH); 30127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseBatch(nf, pass, fail); 30137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] scientificPass = { 30157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0E2", // single zero before exponent is ok 30167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1234E2", // any number of digits before exponent is ok 30177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234E", // an exponent string not followed by zero or digits is not an exponent 30187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "00E2", // leading zeroes now allowed in strict mode - see ticket # 30197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 30207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] scientificFail = { 30217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234E2", // group separators with exponent fail 30227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 30237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH); 30257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseBatch(nf, scientificPass, scientificFail); 30267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] mixedPass = { 30287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,567", 30297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,567,", 30307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,567, that", 30317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,567 that", 30327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 30337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] mixedFail = { 30347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,56", 30357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,56,", 30367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,56, that ", 30377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,56 that", 30387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 30397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = new DecimalFormat("#,##,##0.#"); 30417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseBatch(nf, mixedPass, mixedFail); 30427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void runStrictParseBatch(DecimalFormat nf, String[] pass, String[] fail) { 30457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setParseStrict(false); 30467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseTests("should pass", nf, pass, true); 30477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseTests("should also pass", nf, fail, true); 30487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setParseStrict(true); 30497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseTests("should still pass", nf, pass, true); 30507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseTests("should fail", nf, fail, false); 30517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void runStrictParseTests(String msg, DecimalFormat nf, String[] tests, boolean pass) { 30547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(""); 30557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("pattern: '" + nf.toPattern() + "'"); 30567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(msg); 30577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < tests.length; ++i) { 30587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str = tests[i]; 30597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pp = new ParsePosition(0); 30607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nf.parse(str, pp); 30617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String formatted = n != null ? nf.format(n) : "null"; 30627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String err = pp.getErrorIndex() == -1 ? "" : "(error at " + pp.getErrorIndex() + ")"; 30637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((err.length() == 0) != pass) { 30647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("'" + str + "' parsed '" + 30657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str.substring(0, pp.getIndex()) + 30667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "' returned " + n + " formats to '" + 30677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert formatted + "' " + err); 30687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 30697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (err.length() > 0) { 30707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert err = "got expected " + err; 30717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("'" + str + "' parsed '" + 30737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str.substring(0, pp.getIndex()) + 30747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "' returned " + n + " formats to '" + 30757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert formatted + "' " + err); 30767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 30802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 30817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestJB5251(){ 30827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //save default locale 30837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale defaultLocale = ULocale.getDefault(); 30847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.setDefault(new ULocale("qr_QR")); 30857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 30867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getInstance(); 30877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (Exception e) { 30897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Numberformat threw exception for non-existent locale. It should use the default."); 30907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //reset default locale 30927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.setDefault(defaultLocale); 30937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 30967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseReturnType() { 30977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] defaultNonBigDecimals = { 30987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123", // Long 30997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.0", // Long 31007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.0", // Long 31017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12345678901234567890" // BigInteger 31027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 31037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] doubles = { 31057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-0.0", 31067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "NaN", 31077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\u221E" // Infinity 31087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 31097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 31117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = new DecimalFormat("#.#", sym); 31127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (nf.isParseBigDecimal()) { 31147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: isParseDecimal() must return false by default"); 31157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // isParseBigDecimal() is false 31187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < defaultNonBigDecimals.length; i++) { 31197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 31207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nf.parse(defaultNonBigDecimals[i]); 31217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (n instanceof BigDecimal) { 31227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse returns BigDecimal instance"); 31237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 31257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse of '" + defaultNonBigDecimals[i] + "' threw exception: " + e); 31267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // parse results for doubls must be always Double 31297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < doubles.length; i++) { 31307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 31317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nf.parse(doubles[i]); 31327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!(n instanceof Double)) { 31337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse does not return Double instance"); 31347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 31367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse of '" + doubles[i] + "' threw exception: " + e); 31377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // force this DecimalFormat to return BigDecimal 31417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setParseBigDecimal(true); 31427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!nf.isParseBigDecimal()) { 31437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: isParseBigDecimal() must return true"); 31447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // isParseBigDecimal() is true 31477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < defaultNonBigDecimals.length; i++) { 31487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 31497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nf.parse(defaultNonBigDecimals[i]); 31507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!(n instanceof BigDecimal)) { 31517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse does not return BigDecimal instance"); 31527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 31547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse of '" + defaultNonBigDecimals[i] + "' threw exception: " + e); 31557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // parse results for doubls must be always Double 31587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < doubles.length; i++) { 31597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 31607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nf.parse(doubles[i]); 31617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!(n instanceof Double)) { 31627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse does not return Double instance"); 31637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 31657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse of '" + doubles[i] + "' threw exception: " + e); 31667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 31717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestNonpositiveMultiplier() { 31727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = new DecimalFormat("0"); 31737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test zero multiplier 31757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 31777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setMultiplier(0); 31787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // bad 31807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("DecimalFormat.setMultiplier(0) did not throw an IllegalArgumentException"); 31817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException ex) { 31827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // good 31837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test negative multiplier 31867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 31887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setMultiplier(-1); 31897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (df.getMultiplier() != -1) { 31917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("DecimalFormat.setMultiplier(-1) did not change the multiplier to -1"); 31927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 31937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // good 31967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException ex) { 31977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // bad 31987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("DecimalFormat.setMultiplier(-1) threw an IllegalArgumentException"); 31997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 32007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(df, "1122.123", -1122.123); 32037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(df, "-1122.123", 1122.123); 32047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(df, "1.2", -1.2); 32057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(df, "-1.2", 1.2); 32067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, Long.MAX_VALUE, BigInteger.valueOf(Long.MAX_VALUE).negate().toString()); 32087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, Long.MIN_VALUE, BigInteger.valueOf(Long.MIN_VALUE).negate().toString()); 32097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, Long.MAX_VALUE / 2, BigInteger.valueOf(Long.MAX_VALUE / 2).negate().toString()); 32107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, Long.MIN_VALUE / 2, BigInteger.valueOf(Long.MIN_VALUE / 2).negate().toString()); 32117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, BigDecimal.valueOf(Long.MAX_VALUE), BigDecimal.valueOf(Long.MAX_VALUE).negate().toString()); 32137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, BigDecimal.valueOf(Long.MIN_VALUE), BigDecimal.valueOf(Long.MIN_VALUE).negate().toString()); 32147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, java.math.BigDecimal.valueOf(Long.MAX_VALUE), java.math.BigDecimal.valueOf(Long.MAX_VALUE).negate().toString()); 32167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, java.math.BigDecimal.valueOf(Long.MIN_VALUE), java.math.BigDecimal.valueOf(Long.MIN_VALUE).negate().toString()); 32177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 32207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestJB5358() { 32217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int numThreads = 10; 32227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String numstr = "12345"; 32237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double expected = 12345; 32247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 32257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("#.#", sym); 32267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ArrayList errors = new ArrayList(); 32277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParseThreadJB5358[] threads = new ParseThreadJB5358[numThreads]; 32297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < numThreads; i++) { 32307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert threads[i] = new ParseThreadJB5358((DecimalFormat)fmt.clone(), numstr, expected, errors); 32317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert threads[i].start(); 32327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < numThreads; i++) { 32347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 32357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert threads[i].join(); 32367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (InterruptedException ie) { 32377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ie.printStackTrace(); 32387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (errors.size() != 0) { 32417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer errBuf = new StringBuffer(); 32427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < errors.size(); i++) { 32437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errBuf.append((String)errors.get(i)); 32447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errBuf.append("\n"); 32457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + errBuf); 32477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static private class ParseThreadJB5358 extends Thread { 32517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final DecimalFormat decfmt; 32527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String numstr; 32537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final double expect; 32547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final ArrayList errors; 32557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public ParseThreadJB5358(DecimalFormat decfmt, String numstr, double expect, ArrayList errors) { 32577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.decfmt = decfmt; 32587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.numstr = numstr; 32597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.expect = expect; 32607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.errors = errors; 32617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 32647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void run() { 32657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 10000; i++) { 32667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 32677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = decfmt.parse(numstr); 32687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (n.doubleValue() != expect) { 32697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert synchronized(errors) { 32707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errors.add(new String("Bad parse result - expected:" + expect + " actual:" + n.doubleValue())); 32717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Throwable t) { 32747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert synchronized(errors) { 32757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errors.add(new String(t.getClass().getName() + " - " + t.getMessage())); 32767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 32837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSetCurrency() { 32847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decf1 = DecimalFormatSymbols.getInstance(ULocale.US); 32857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decf2 = DecimalFormatSymbols.getInstance(ULocale.US); 32867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert decf2.setCurrencySymbol("UKD"); 32877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat format1 = new DecimalFormat("000.000", decf1); 32887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat format2 = new DecimalFormat("000.000", decf2); 32897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency euro = Currency.getInstance("EUR"); 32907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format1.setCurrency(euro); 32917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format2.setCurrency(euro); 32927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Reset with currency symbol", format1, format2); 32937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 32967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Testing the method public StringBuffer format(Object number, ...) 32977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 32982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 32997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFormat() { 33007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = NumberFormat.getInstance(); 33017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer sb = new StringBuffer("dummy"); 33027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(0); 33037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "if (number instanceof Long)" is true 33057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(new Long("0"), sb, fp); 33077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 33097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for a Long object. Error: " + e); 33107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else if (number instanceof BigInteger)" is true 33137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format((Object)new BigInteger("0"), sb, fp); 33157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 33177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for a BigInteger object. Error: " + e); 33187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else if (number instanceof java.math.BigDecimal)" is true 33217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format((Object)new java.math.BigDecimal("0"), sb, fp); 33237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 33257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for a java.math.BigDecimal object. Error: " + e); 33267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else if (number instanceof com.ibm.icu.math.BigDecimal)" is true 33297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format((Object)new com.ibm.icu.math.BigDecimal("0"), sb, fp); 33317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 33337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for a com.ibm.icu.math.BigDecimal object. Error: " + e); 33347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else if (number instanceof CurrencyAmount)" is true 33377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount ca = new CurrencyAmount(0.0, Currency.getInstance(new ULocale("en_US"))); 33397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format((Object)ca, sb, fp); 33407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 33427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for a CurrencyAmount object. Error: " + e); 33437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else if (number instanceof Number)" is true 33467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(0.0, sb, fp); 33487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 33507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "to return an exception for a Number object. Error: " + e); 33517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else" is true 33547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(new Object(), sb, fp); 33567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was suppose to " 33577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for an invalid object."); 33587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(new String("dummy"), sb, fp); 33637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was suppose to " 33647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for an invalid object."); 33657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 3370b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn * Coverage tests for the implementation of abstract format methods not being called otherwise 3371b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn */ 3372b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn public void TestFormatAbstractImplCoverage() { 3373b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn NumberFormat df = DecimalFormat.getInstance(Locale.ENGLISH); 3374b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn NumberFormat cdf = CompactDecimalFormat.getInstance(Locale.ENGLISH, CompactDecimalFormat.CompactStyle.SHORT); 3375b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn NumberFormat rbf = new RuleBasedNumberFormat(ULocale.ENGLISH, RuleBasedNumberFormat.SPELLOUT); 3376b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn 3377b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn /* 3378b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn * Test NumberFormat.format(BigDecimal,StringBuffer,FieldPosition) 3379b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn */ 3380b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn StringBuffer sb = new StringBuffer(); 3381b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn String result = df.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString(); 3382b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn if (!"2,000.43".equals(result)) { 3383b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn errln("DecimalFormat failed. Expected: 2,000.43 - Actual: " + result); 3384b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn } 3385b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn 3386b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn sb.delete(0, sb.length()); 3387b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn result = cdf.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString(); 3388b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn if (!"2K".equals(result)) { 3389b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn errln("DecimalFormat failed. Expected: 2K - Actual: " + result); 3390b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn } 3391b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn 3392b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn sb.delete(0, sb.length()); 3393b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn result = rbf.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString(); 3394b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn if (!"two thousand point four three".equals(result)) { 3395b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn errln("DecimalFormat failed. Expected: 'two thousand point four three' - Actual: '" + result + "'"); 33962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 3397b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn } 3398b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn 3399b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn /* 34007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public final static NumberFormat getInstance(int style) public static NumberFormat 34017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * getInstance(Locale inLocale, int style) public static NumberFormat getInstance(ULocale desiredLocale, int choice) 34027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 34047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestGetInstance() { 34057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests "public final static NumberFormat getInstance(int style)" 3406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert int maxStyle = NumberFormat.STANDARDCURRENCYSTYLE; 34077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] invalid_cases = { NumberFormat.NUMBERSTYLE - 1, NumberFormat.NUMBERSTYLE - 2, 34097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert maxStyle + 1, maxStyle + 2 }; 34107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = NumberFormat.NUMBERSTYLE; i < maxStyle; i++) { 34127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 34137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getInstance(i); 34147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 34157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getInstance(int style) was not suppose to " 34167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for passing value of " + i); 34177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < invalid_cases.length; i++) { 34217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 34227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getInstance(invalid_cases[i]); 34237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getInstance(int style) was suppose to " 34247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for passing value of " + invalid_cases[i]); 34257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 34267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests "public static NumberFormat getInstance(Locale inLocale, int style)" 34307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] localeCases = { "en_US", "fr_FR", "de_DE", "jp_JP" }; 34317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = NumberFormat.NUMBERSTYLE; i < maxStyle; i++) { 34337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int j = 0; j < localeCases.length; j++) { 34347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 34357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getInstance(new Locale(localeCases[j]), i); 34367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 34377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getInstance(Locale inLocale, int style) was not suppose to " 34387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for passing value of " + localeCases[j] + ", " + i); 34397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests "public static NumberFormat getInstance(ULocale desiredLocale, int choice)" 34447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "if (choice < NUMBERSTYLE || choice > PLURALCURRENCYSTYLE)" is true 34457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < invalid_cases.length; i++) { 34467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 34477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getInstance((ULocale) null, invalid_cases[i]); 34487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getInstance(ULocale inLocale, int choice) was not suppose to " 34497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for passing value of " + invalid_cases[i]); 34507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 34517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the class public static abstract class NumberFormatFactory 34577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 34597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestNumberFormatFactory() { 34607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The following class allows the method public NumberFormat createFormat(Locale loc, int formatType) to be 34627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * tested. 34637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestFactory extends NumberFormatFactory { 34657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Set<String> getSupportedLocaleNames() { 34677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public NumberFormat createFormat(ULocale loc, int formatType) { 34727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The following class allows the method public NumberFormat createFormat(ULocale loc, int formatType) to be 34787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * tested. 34797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestFactory1 extends NumberFormatFactory { 34817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Set<String> getSupportedLocaleNames() { 34837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public NumberFormat createFormat(Locale loc, int formatType) { 34887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestFactory tf = new TestFactory(); 34937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestFactory1 tf1 = new TestFactory1(); 34947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public boolean visible() 34977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (tf.visible() != true) { 3499b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn errln("NumberFormatFactory.visible() was suppose to return true."); 35007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 35037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public NumberFormat createFormat(Locale loc, int formatType) 35047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 35057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (tf.createFormat(new Locale(""), 0) != null) { 3506b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn errln("NumberFormatFactory.createFormat(Locale loc, int formatType) " + "was suppose to return null"); 35077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 35107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public NumberFormat createFormat(ULocale loc, int formatType) 35117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 35127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (tf1.createFormat(new ULocale(""), 0) != null) { 3513b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe BalbontÃn errln("NumberFormatFactory.createFormat(ULocale loc, int formatType) " + "was suppose to return null"); 35147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 35187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the class public static abstract class SimpleNumberFormatFactory extends NumberFormatFactory 35197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 35202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 35217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSimpleNumberFormatFactory() { 35227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestSimpleNumberFormatFactory extends SimpleNumberFormatFactory { 35237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 35247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public SimpleNumberFormatFactory(Locale locale) 35257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 35267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestSimpleNumberFormatFactory() { 35277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert super(new Locale("")); 35287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("unused") 35317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestSimpleNumberFormatFactory tsnff = new TestSimpleNumberFormatFactory(); 35327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 35357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public static ULocale[] getAvailableLocales() 35367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 35377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("static-access") 35382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 35397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestGetAvailableLocales() { 35407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "if (shim == null)" is true 35417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("serial") 35427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestGetAvailableLocales extends NumberFormat { 35437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { 35457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) { 35507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(BigInteger number, StringBuffer toAppendTo, FieldPosition pos) { 35557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) { 35607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) { 35657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Number parse(String text, ParsePosition parsePosition) { 35707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 35757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestGetAvailableLocales test = new TestGetAvailableLocales(); 35767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.getAvailableLocales(); 35777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 35787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getAvailableLocales() was not suppose to " 35797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception when getting getting available locales."); 35807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 35847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public void setMinimumIntegerDigits(int newValue) 35857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 35862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 35877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSetMinimumIntegerDigits() { 35887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = NumberFormat.getInstance(); 35897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // For valid array, it is displayed as {min value, max value} 35907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "if (minimumIntegerDigits > maximumIntegerDigits)" is true 35917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[][] cases = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 2, 0 }, { 2, 1 }, { 10, 0 } }; 35927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] expectedMax = { 0, 1, 1, 2, 2, 10 }; 35937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cases.length != expectedMax.length) { 35947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Can't continue test case method TestSetMinimumIntegerDigits " 35957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "since the test case arrays are unequal."); 35967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 35977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < cases.length; i++) { 35987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setMaximumIntegerDigits(cases[i][1]); 35997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setMinimumIntegerDigits(cases[i][0]); 36007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (nf.getMaximumIntegerDigits() != expectedMax[i]) { 36017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.setMinimumIntegerDigits(int newValue " 36027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "did not return an expected result for parameter " + cases[i][1] + " and " + cases[i][0] 36037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + " and expected " + expectedMax[i] + " but got " + nf.getMaximumIntegerDigits()); 36047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 36107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public int getRoundingMode() public void setRoundingMode(int roundingMode) 36117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 36122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 36137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRoundingMode() { 36147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("serial") 36157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestRoundingMode extends NumberFormat { 36167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 36177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { 36187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 36197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 36227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) { 36237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 36247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 36277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(BigInteger number, StringBuffer toAppendTo, FieldPosition pos) { 36287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 36297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 36327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) { 36337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 36347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 36377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) { 36387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 36397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 36427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Number parse(String text, ParsePosition parsePosition) { 36437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 36447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestRoundingMode tgrm = new TestRoundingMode(); 36477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests the function 'public void setRoundingMode(int roundingMode)' 36497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 36507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tgrm.setRoundingMode(0); 36517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.setRoundingMode(int) was suppose to return an exception"); 36527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 36537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests the function 'public int getRoundingMode()' 36567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 36577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tgrm.getRoundingMode(); 36587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getRoundingMode() was suppose to return an exception"); 36597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 36607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 36647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Testing lenient decimal/grouping separator parsing 36657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 36662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 36677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestLenientSymbolParsing() { 36687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(); 36697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(); 36707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "12\u300234", 12.34); 36727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Ticket#7345 - case 1 36747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Even strict parsing, the decimal separator set in the symbols 36757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // should be successfully parsed. 36767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setDecimalSeparator('\u3002'); 36787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // non-strict 36807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setDecimalFormatSymbols(sym); 36817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // strict - failed before the fix for #7345 36837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseStrict(true); 36847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "23\u300245", 23.45); 36857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseStrict(false); 36867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Ticket#7345 - case 2 36897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Decimal separator variants other than DecimalFormatSymbols.decimalSeparator 36907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // should not hide the grouping separator DecimalFormatSymbols.groupingSeparator. 36917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setDecimalSeparator('.'); 36927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setGroupingSeparator(','); 36937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setDecimalFormatSymbols(sym); 36947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "1,234.56", 1234.56); 36967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setGroupingSeparator('\uFF61'); 36987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setDecimalFormatSymbols(sym); 36997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "2\uFF61345.67", 2345.67); 37017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Ticket#7128 37037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 37047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setGroupingSeparator(','); 37057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setDecimalFormatSymbols(sym); 37067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String skipExtSepParse = ICUConfig.get("com.ibm.icu.text.DecimalFormat.SkipExtendedSeparatorParsing", "false"); 37087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (skipExtSepParse.equals("true")) { 37097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // When the property SkipExtendedSeparatorParsing is true, 37107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DecimalFormat does not use the extended equivalent separator 37117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // data and only uses the one in DecimalFormatSymbols. 37127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "23 456", 23); 37137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 37147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Lenient separator parsing is enabled by default. 37157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // A space character below is interpreted as a 37167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // group separator, even ',' is used as grouping 37177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // separator in the symbols. 37187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "12 345", 12345); 37197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 37237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Testing currency driven max/min fraction digits problem 37247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * reported by ticket#7282 37257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 37262d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 37277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyFractionDigits() { 37287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double value = 99.12345; 37297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Create currency instance 37317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat cfmt = NumberFormat.getCurrencyInstance(new ULocale("ja_JP")); 37327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text1 = cfmt.format(value); 37337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Reset the same currency and format the test value again 37357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cfmt.setCurrency(cfmt.getCurrency()); 37367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text2 = cfmt.format(value); 37377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // output1 and output2 must be identical 37397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!text1.equals(text2)) { 37407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format() should return the same result - text1=" 37417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + text1 + " text2=" + text2); 37427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 37467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Testing rounding to negative zero problem 37477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * reported by ticket#7609 37487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 37492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 37507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestNegZeroRounding() { 37517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(); 37537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setRoundingMode(MathContext.ROUND_HALF_UP); 37547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setMinimumFractionDigits(1); 37557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setMaximumFractionDigits(1); 37567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text1 = df.format(-0.01); 37577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setRoundingIncrement(0.1); 37597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text2 = df.format(-0.01); 37607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // output1 and output2 must be identical 37627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!text1.equals(text2)) { 37637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format() should return the same result - text1=" 37647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + text1 + " text2=" + text2); 37657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 37707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyAmountCoverage() { 37717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount ca, cb; 37727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 37747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ca = new CurrencyAmount(null, null); 37757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NullPointerException should have been thrown."); 37767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (NullPointerException ex) { 37777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 37797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ca = new CurrencyAmount(new Integer(0), null); 37807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NullPointerException should have been thrown."); 37817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (NullPointerException ex) { 37827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ca = new CurrencyAmount(new Integer(0), Currency.getInstance(new ULocale("ja_JP"))); 37857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cb = new CurrencyAmount(new Integer(1), Currency.getInstance(new ULocale("ja_JP"))); 37867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (ca.equals(null)) { 37877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Comparison should return false."); 37887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!ca.equals(ca)) { 37907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Comparision should return true."); 37917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (ca.equals(cb)) { 37937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Comparison should return false."); 37947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 37987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestExponentParse() { 37997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition parsePos = new ParsePosition(0); 38007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US); 38017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("#####", symbols); 38027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number result = fmt.parse("5.06e-27", parsePos); 38037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( result.doubleValue() != 5.06E-27 || parsePos.getIndex() != 8) { 38047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("ERROR: ERROR: parse failed - expected 5.06E-27, 8; got " + result.doubleValue() + ", " + parsePos.getIndex()); 38057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 38097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestExplicitParents() { 38107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // We use these for testing because decimal and grouping separators will be inherited from es_419 38117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // starting with CLDR 2.0 38127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] DATA = { 38137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "CO", "", "1.250,75", 38147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "ES", "", "1.250,75", 38157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "GQ", "", "1.250,75", 38167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "MX", "", "1,250.75", 38177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "US", "", "1,250.75", 38187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "VE", "", "1.250,75", 38197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 38217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; i+=4) { 38237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale locale = new Locale(DATA[i], DATA[i+1], DATA[i+2]); 38247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getInstance(locale); 38257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = fmt.format(1250.75); 38267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (s.equals(DATA[i+3])) { 38277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: 1250.75 x " + locale + " => " + s); 38287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 38297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: 1250.75 x " + locale + " => " + s + 38307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expected " + DATA[i+3]); 38317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 38367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test case for #9240 38377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ICU4J 49.1 DecimalFormat did not clone the internal object holding 38387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * formatted text attribute information properly. Therefore, DecimalFormat 38397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * created by cloning may return incorrect results or may throw an exception 38407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * when formatToCharacterIterator is invoked from multiple threads. 38417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 38422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 38437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFormatToCharacterIteratorThread() { 38447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final int COUNT = 10; 38457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt1 = new DecimalFormat("#0"); 38477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt2 = (DecimalFormat)fmt1.clone(); 38487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] res1 = new int[COUNT]; 38507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] res2 = new int[COUNT]; 38517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Thread t1 = new Thread(new FormatCharItrTestThread(fmt1, 1, res1)); 38537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Thread t2 = new Thread(new FormatCharItrTestThread(fmt2, 100, res2)); 38547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert t1.start(); 38567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert t2.start(); 38577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 38597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert t1.join(); 38607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert t2.join(); 38617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (InterruptedException e) { 38627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //TODO 38637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int val1 = res1[0]; 38667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int val2 = res2[0]; 38677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < COUNT; i++) { 38697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (res1[i] != val1) { 38707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Inconsistent first run limit in test thread 1"); 38717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (res2[i] != val2) { 38737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Inconsistent first run limit in test thread 2"); 38747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 38797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseMaxDigits() { 38807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(); 38817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String number = "100000000000"; 38827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int newParseMax = number.length() - 1; 38837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseMaxDigits(-1); 38857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Default value is 1000 */ 38877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fmt.getParseMaxDigits() != 1000) { 38887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail valid value checking in setParseMaxDigits."); 38897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 38927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fmt.parse(number).doubleValue() == Float.POSITIVE_INFINITY) { 38937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Got Infinity but should NOT when parsing number: " + number); 38947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseMaxDigits(newParseMax); 38977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fmt.parse(number).doubleValue() != Float.POSITIVE_INFINITY) { 38997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Did not get Infinity but should when parsing number: " + number); 39007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException ex) { 39027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static class FormatCharItrTestThread implements Runnable { 39077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final NumberFormat fmt; 39087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int num; 39097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int[] result; 39107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FormatCharItrTestThread(NumberFormat fmt, int num, int[] result) { 39127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.fmt = fmt; 39137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.num = num; 39147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.result = result; 39157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Override 39187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void run() { 39197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < result.length; i++) { 39207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert AttributedCharacterIterator acitr = fmt.formatToCharacterIterator(num); 39217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert acitr.first(); 39227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result[i] = acitr.getRunLimit(); 39237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 39287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRoundingBehavior() { 39297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final Object[][] TEST_CASES = { 39307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 39317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.US, // ULocale - null for default locale 39327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "#.##", // Pattern 39337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer.valueOf(BigDecimal.ROUND_DOWN), // Rounding Mode or null (implicit) 39347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(0.0d), // Rounding increment, Double or BigDecimal, or null (implicit) 39357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(123.4567d), // Input value, Long, Double, BigInteger or BigDecimal 39367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.45" // Expected result, null for exception 39377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 39387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 39397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.US, 39407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "#.##", 39417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert null, 39427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(0.1d), 39437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(123.4567d), 39447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.5" 39457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 39467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 39477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.US, 39487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "#.##", 39497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer.valueOf(BigDecimal.ROUND_DOWN), 39507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(0.1d), 39517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(123.4567d), 39527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.4" 39537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 39547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 39557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.US, 39567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "#.##", 39577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer.valueOf(BigDecimal.ROUND_UNNECESSARY), 39587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert null, 39597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(123.4567d), 39607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert null 39617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 39627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 39637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.US, 39647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "#.##", 39657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer.valueOf(BigDecimal.ROUND_DOWN), 39667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert null, 39677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Long.valueOf(1234), 39687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1234" 39697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 39707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 39717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int testNum = 1; 39737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (Object[] testCase : TEST_CASES) { 39757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 0: locale 39767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 1: pattern 39777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = testCase[0] == null ? ULocale.getDefault() : (ULocale)testCase[0]; 39787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern = (String)testCase[1]; 39797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance(locale)); 39817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 2: rounding mode 39837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer roundingMode = null; 39847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testCase[2] != null) { 39857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingMode = (Integer)testCase[2]; 39867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setRoundingMode(roundingMode); 39877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 3: rounding increment 39907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testCase[3] != null) { 39917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testCase[3] instanceof Double) { 39927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setRoundingIncrement((Double)testCase[3]); 39937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (testCase[3] instanceof BigDecimal) { 39947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setRoundingIncrement((BigDecimal)testCase[3]); 39957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (testCase[3] instanceof java.math.BigDecimal) { 39967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setRoundingIncrement((java.math.BigDecimal)testCase[3]); 39977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 4: input number 40017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = null; 40027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean bException = false; 40037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 40047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = fmt.format(testCase[4]); 40057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ArithmeticException e) { 40067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bException = true; 40077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (bException) { 40107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testCase[5] != null) { 40117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Test case #" + testNum + ": ArithmeticException was thrown."); 40127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 40147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testCase[5] == null) { 40157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Test case #" + testNum + 40167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ": ArithmeticException must be thrown, but got formatted result: " + 40177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s); 40187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 40192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert assertEquals("Test case #" + testNum, testCase[5], s); 40207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert testNum++; 40247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 40287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSignificantDigits() { 40297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double input[] = { 40307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, 0, 40317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 123, -123, 40327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12345, -12345, 40337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 123.45, -123.45, 40347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 123.44501, -123.44501, 40357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.001234, -0.001234, 40367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.00000000123, -0.00000000123, 40377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.0000000000000000000123, -0.0000000000000000000123, 40387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1.2, -1.2, 40397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.0000000012344501, -0.0000000012344501, 40407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 123445.01, -123445.01, 40417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12344501000000000000000000000000000.0, -12344501000000000000000000000000000.0, 40427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 40437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] expected = { 40447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.00", "0.00", 40457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123", "-123", 40467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12345", "-12345", 40477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.45", "-123.45", 40487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.45", "-123.45", 40497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.001234", "-0.001234", 40507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.00000000123", "-0.00000000123", 40517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.0000000000000000000123", "-0.0000000000000000000123", 40527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.20", "-1.20", 40537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.0000000012345", "-0.0000000012345", 40547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123450", "-123450", 40557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12345000000000000000000000000000000", "-12345000000000000000000000000000000", 40567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 40577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat numberFormat = 40587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (DecimalFormat) NumberFormat.getInstance(ULocale.US); 40597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setSignificantDigitsUsed(true); 40607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMinimumSignificantDigits(3); 40617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMaximumSignificantDigits(5); 40627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setGroupingUsed(false); 40637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < input.length; i++) { 40647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("TestSignificantDigits", expected[i], numberFormat.format(input[i])); 40657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 40697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestBug9936() { 40707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat numberFormat = 40717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (DecimalFormat) NumberFormat.getInstance(ULocale.US); 40727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertFalse("", numberFormat.areSignificantDigitsUsed()); 40737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setSignificantDigitsUsed(true); 40757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertTrue("", numberFormat.areSignificantDigitsUsed()); 40767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setSignificantDigitsUsed(false); 40787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertFalse("", numberFormat.areSignificantDigitsUsed()); 40797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMinimumSignificantDigits(3); 40817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertTrue("", numberFormat.areSignificantDigitsUsed()); 40827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setSignificantDigitsUsed(false); 40847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMaximumSignificantDigits(6); 40852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert assertTrue("", numberFormat.areSignificantDigitsUsed()); 40867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 40897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestShowZero() { 40907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat numberFormat = 40917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (DecimalFormat) NumberFormat.getInstance(ULocale.US); 40927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setSignificantDigitsUsed(true); 40937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMaximumSignificantDigits(3); 40947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("TestShowZero", "0", numberFormat.format(0.0)); 40957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 40987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyPlurals() { 40997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] tests = { 41007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "USD", "1", "1 US dollar"}, 41017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "USD", "1.0", "1.0 US dollars"}, 41027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "USD", "1.00", "1.00 US dollars"}, 41037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "USD", "1.99", "1.99 US dollars"}, 41047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "AUD", "1", "1 Australian dollar"}, 41057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "AUD", "1.00", "1.00 Australian dollars"}, 41067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"sl", "USD", "1", "1 ameri\u0161ki dolar"}, 41077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"sl", "USD", "2", "2 ameri\u0161ka dolarja"}, 41087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"sl", "USD", "3", "3 ameri\u0161ki dolarji"}, 41097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"sl", "USD", "5", "5 ameriških dolarjev"}, 41107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"fr", "USD", "1.99", "1,99 dollar des États-Unis"}, 41117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"ru", "RUB", "1", "1 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0439 \u0440\u0443\u0431\u043B\u044C"}, 41127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"ru", "RUB", "2", "2 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0445 \u0440\u0443\u0431\u043B\u044F"}, 41137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"ru", "RUB", "5", "5 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0445 \u0440\u0443\u0431\u043B\u0435\u0439"}, 41147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 41157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (String test[] : tests) { 41167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat numberFormat = (DecimalFormat) DecimalFormat.getInstance(new ULocale(test[0]), NumberFormat.PLURALCURRENCYSTYLE); 41177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setCurrency(Currency.getInstance(test[1])); 41187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double number = Double.parseDouble(test[2]); 41197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int dotPos = test[2].indexOf('.'); 41207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int decimals = dotPos < 0 ? 0 : test[2].length() - dotPos - 1; 41217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int digits = dotPos < 0 ? test[2].length() : test[2].length() - 1; 41227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMaximumFractionDigits(decimals); 41237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMinimumFractionDigits(decimals); 41247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String actual = numberFormat.format(number); 41257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(test[0] + "\t" + test[1] + "\t" + test[2], test[3], actual); 41267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMaximumSignificantDigits(digits); 41277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMinimumSignificantDigits(digits); 41287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert actual = numberFormat.format(number); 41297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(test[0] + "\t" + test[1] + "\t" + test[2], test[3], actual); 41307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 41347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCustomCurrencySignAndSeparator() { 41357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols custom = new DecimalFormatSymbols(ULocale.US); 41367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom.setCurrencySymbol("*"); 41387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom.setMonetaryGroupingSeparator('^'); 41397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom.setMonetaryDecimalSeparator(':'); 41407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("\u00A4 #,##0.00", custom); 41427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String numstr = "* 1^234:56"; 41447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt, 1234.56, numstr); 41457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 41487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseSignsAndMarks() { 41497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class SignsAndMarksItem { 41507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String locale; 41517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean lenient; 41527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String numString; 41537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public double value; 41547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Simple constructor 41557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public SignsAndMarksItem(String loc, boolean lnt, String numStr, double val) { 41567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert locale = loc; 41577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lenient = lnt; 41587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numString = numStr; 41597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = val; 41607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 41627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final SignsAndMarksItem[] items = { 41637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // *** Note, ICU4J lenient number parsing does not handle arbitrary whitespace, but can 41647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // treat some whitespace as a grouping separator. The cases marked *** below depend 41657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // on isGroupingUsed() being set for the locale, which in turn depends on grouping 41667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // separators being present in the decimalFormat pattern for the locale (& num sys). 41677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 41687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // locale lenient numString value 41697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", false, "12", 12 ), 41707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", true, "12", 12 ), 41717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", false, "-23", -23 ), 41727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", true, "-23", -23 ), 41737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", true, "- 23", -23 ), // *** 41747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", false, "\u200E-23", -23 ), 41757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", true, "\u200E-23", -23 ), 41767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", true, "\u200E- 23", -23 ), // *** 41777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", false, "\u0663\u0664", 34 ), 41797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", true, "\u0663\u0664", 34 ), 41807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", false, "-\u0664\u0665", -45 ), 41817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", true, "-\u0664\u0665", -45 ), 41827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", true, "- \u0664\u0665", -45 ), // *** 41837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", false, "\u200F-\u0664\u0665", -45 ), 41847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", true, "\u200F-\u0664\u0665", -45 ), 41857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", true, "\u200F- \u0664\u0665", -45 ), // *** 41867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", false, "\u06F5\u06F6", 56 ), 41887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", true, "\u06F5\u06F6", 56 ), 41897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", false, "-\u06F6\u06F7", -67 ), 41907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", true, "-\u06F6\u06F7", -67 ), 41917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", true, "- \u06F6\u06F7", -67 ), // *** 41927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", false, "\u200E-\u200E\u06F6\u06F7", -67 ), 41937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", true, "\u200E-\u200E\u06F6\u06F7", -67 ), 41947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", true, "\u200E-\u200E \u06F6\u06F7", -67 ), // *** 41952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 41967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", false, "12", 12 ), 41977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", true, "12", 12 ), 41987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", false, "-23", -23 ), 41997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", true, "-23", -23 ), 42007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", true, "- 23", -23 ), // *** 42017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", false, "\u200E-23", -23 ), 42027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", true, "\u200E-23", -23 ), 42037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", true, "\u200E- 23", -23 ), // *** 42047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", false, "\u0663\u0664", 34 ), 42067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", true, "\u0663\u0664", 34 ), 42077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", false, "-\u0664\u0665", -45 ), 42087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", true, "-\u0664\u0665", -45 ), 42097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", true, "- \u0664\u0665", -45 ), // *** 42107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", false, "\u200F-\u0664\u0665", -45 ), 42117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", true, "\u200F-\u0664\u0665", -45 ), 42127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", true, "\u200F- \u0664\u0665", -45 ), // *** 42137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", false, "12", 12 ), 42157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", true, "12", 12 ), 42167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", false, "-23", -23 ), 42177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", true, "-23", -23 ), 42187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", true, "- 23", -23 ), // *** 42197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", false, "\u200E-23", -23 ), 42207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", true, "\u200E-23", -23 ), 42217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", true, "\u200E- 23", -23 ), // *** 42227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", false, "\u06F5\u06F6", 56 ), 42247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", true, "\u06F5\u06F6", 56 ), 42257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", false, "\u2212\u06F6\u06F7", -67 ), 42267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", true, "\u2212\u06F6\u06F7", -67 ), 42277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", true, "\u2212 \u06F6\u06F7", -67 ), // *** 42287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", false, "\u200E\u2212\u200E\u06F6\u06F7", -67 ), 42297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", true, "\u200E\u2212\u200E\u06F6\u06F7", -67 ), 42307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", true, "\u200E\u2212\u200E \u06F6\u06F7", -67 ), // *** 42317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", false, "\u06F5\u06F6", 56 ), 42337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "\u06F5\u06F6", 56 ), 42347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", false, "-\u06F6\u06F7", -67 ), 42357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "-\u06F6\u06F7", -67 ), 42367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "- \u06F6\u06F7", -67 ), // *** 42377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", false, "\u200E-\u200E\u06F6\u06F7", -67 ), 42387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "\u200E-\u200E\u06F6\u06F7", -67 ), 42397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "\u200E-\u200E \u06F6\u06F7", -67 ), // *** 42407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", false, "-\u200E\u06F6\u06F7", -67 ), 42417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "-\u200E\u06F6\u06F7", -67 ), 42427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "-\u200E \u06F6\u06F7", -67 ), // *** 42437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 42447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (SignsAndMarksItem item: items) { 42457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = new ULocale(item.locale); 42467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat numfmt = NumberFormat.getInstance(locale); 42477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (numfmt != null) { 42487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numfmt.setParseStrict(!item.lenient); 42497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition ppos = new ParsePosition(0); 42507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = numfmt.parse(item.numString, ppos); 42517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (num != null && ppos.getIndex() == item.numString.length()) { 42527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double parsedValue = num.doubleValue(); 42537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (parsedValue != item.value) { 42547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: locale " + item.locale + ", lenient " + item.lenient + ", parse of \"" + item.numString + "\" gives value " + parsedValue); 42557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 42577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: locale " + item.locale + ", lenient " + item.lenient + ", parse of \"" + item.numString + "\" gives position " + ppos.getIndex()); 42587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 42607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: NumberFormat.getInstance for locale " + item.locale); 42617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 42667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestContext() { 42677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // just a minimal sanity check for now 42687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nfmt = NumberFormat.getInstance(); 42697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DisplayContext context = nfmt.getContext(DisplayContext.Type.CAPITALIZATION); 42707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (context != DisplayContext.CAPITALIZATION_NONE) { 42717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Initial NumberFormat.getContext() is not CAPITALIZATION_NONE"); 42727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nfmt.setContext(DisplayContext.CAPITALIZATION_FOR_STANDALONE); 42747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert context = nfmt.getContext(DisplayContext.Type.CAPITALIZATION); 42757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (context != DisplayContext.CAPITALIZATION_FOR_STANDALONE) { 42767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: NumberFormat.getContext() does not return the value set, CAPITALIZATION_FOR_STANDALONE"); 42777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 42817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestAccountingCurrency() { 42827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] tests = { 4283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert //locale num curr fmt per loc curr std fmt curr acct fmt rt 4284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US", "1234.5", "$1,234.50", "$1,234.50", "$1,234.50", "true"}, 4285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US@cf=account", "1234.5", "$1,234.50", "$1,234.50", "$1,234.50", "true"}, 4286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US", "-1234.5", "-$1,234.50", "-$1,234.50", "($1,234.50)", "true"}, 4287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US@cf=standard", "-1234.5", "-$1,234.50", "-$1,234.50", "($1,234.50)", "true"}, 4288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US@cf=account", "-1234.5", "($1,234.50)", "-$1,234.50", "($1,234.50)", "true"}, 4289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US", "0", "$0.00", "$0.00", "$0.00", "true"}, 4290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US", "-0.2", "-$0.20", "-$0.20", "($0.20)", "true"}, 4291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US@cf=standard", "-0.2", "-$0.20", "-$0.20", "($0.20)", "true"}, 4292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US@cf=account", "-0.2", "($0.20)", "-$0.20", "($0.20)", "true"}, 4293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"ja_JP", "10000", "¥10,000", "¥10,000", "¥10,000", "true" }, 4294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"ja_JP", "-1000.5", "-¥1,000", "-¥1,000", "(¥1,000)", "false"}, 4295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"ja_JP@cf=account", "-1000.5", "(¥1,000)", "-¥1,000", "(¥1,000)", "false"}, 4296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"de_DE", "-23456.7", "-23.456,70\u00A0€", "-23.456,70\u00A0€", "-23.456,70\u00A0€", "true" }, 42977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 42987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (String[] data : tests) { 42997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale loc = new ULocale(data[0]); 43007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double num = Double.parseDouble(data[1]); 4301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String fmtPerLocExpected = data[2]; 4302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String fmtStandardExpected = data[3]; 4303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String fmtAccountExpected = data[4]; 4304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert boolean rt = Boolean.parseBoolean(data[5]); 4305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 4306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert NumberFormat fmtPerLoc = NumberFormat.getInstance(loc, NumberFormat.CURRENCYSTYLE); 4307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert expect(fmtPerLoc, num, fmtPerLocExpected, rt); 4308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 4309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert NumberFormat fmtStandard = NumberFormat.getInstance(loc, NumberFormat.STANDARDCURRENCYSTYLE); 4310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert expect(fmtStandard, num, fmtStandardExpected, rt); 43117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert NumberFormat fmtAccount = NumberFormat.getInstance(loc, NumberFormat.ACCOUNTINGCURRENCYSTYLE); 4313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert expect(fmtAccount, num, fmtAccountExpected, rt); 43147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 43172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 43187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyUsage() { 43197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the 1st one is checking setter/getter, while the 2nd one checks for getInstance 43207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // compare the Currency and Currency Cash Digits 43217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Note that as of CLDR 26: 43227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // * TWD switches from 0 decimals to 2; PKR still has 0, so change test to that 432387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // * CAD rounds to .05 in the cash style only. 43247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 2; i++) { 43257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String original_expected = "PKR124"; 43267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat custom = null; 43277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (i == 0) { 43287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=PKR"), 43297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat.CURRENCYSTYLE); 43307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String original = custom.format(123.567); 43327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context", original_expected, original); 43337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test the getter 43357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(), 43367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency.CurrencyUsage.STANDARD); 43377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom.setCurrencyUsage(Currency.CurrencyUsage.CASH); 43387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(), Currency.CurrencyUsage.CASH); 43397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 43407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=PKR"), 43417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat.CASHCURRENCYSTYLE); 43427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test the getter 43447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(), Currency.CurrencyUsage.CASH); 43457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String cash_currency = custom.format(123.567); 43487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String cash_currency_expected = "PKR124"; 43497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context", cash_currency_expected, cash_currency); 43507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the 1st one is checking setter/getter, while the 2nd one checks for getInstance 43537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // compare the Currency and Currency Cash Rounding 43547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 2; i++) { 43557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String original_rounding_expected = "CA$123.57"; 43567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = null; 43577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (i == 0) { 43587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=CAD"), 43597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat.CURRENCYSTYLE); 43607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String original_rounding = fmt.format(123.566); 43627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context", original_rounding_expected, original_rounding); 43637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setCurrencyUsage(Currency.CurrencyUsage.CASH); 43657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 43667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=CAD"), 43677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat.CASHCURRENCYSTYLE); 43687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String cash_rounding_currency = fmt.format(123.567); 437187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert String cash__rounding_currency_expected = "CA$123.55"; 43727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context", cash__rounding_currency_expected, cash_rounding_currency); 43737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the 1st one is checking setter/getter, while the 2nd one checks for getInstance 43767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test the currency change 43777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 2; i++) { 43787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt2 = null; 43797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (i == 1) { 43807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt2 = (DecimalFormat) NumberFormat.getInstance(new ULocale("en_US@currency=JPY"), 43817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.CURRENCYSTYLE); 43827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt2.setCurrencyUsage(Currency.CurrencyUsage.CASH); 43837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 43847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt2 = (DecimalFormat) NumberFormat.getInstance(new ULocale("en_US@currency=JPY"), 43857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.CASHCURRENCYSTYLE); 43867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt2.setCurrency(Currency.getInstance("PKR")); 43897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String PKR_changed = fmt2.format(123.567); 43907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String PKR_changed_expected = "PKR124"; 43917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context", PKR_changed_expected, PKR_changed); 43927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 43967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseRequiredDecimalPoint() { 43972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 43987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] testPattern = { "00.####", "00.0", "00" }; 43992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 44007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String value2Parse = "99"; 44017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double parseValue = 99; 44027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat parser = new DecimalFormat(); 44037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double result; 44042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert boolean hasDecimalPoint; 44052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert for (int i = 0; i < testPattern.length; i++) { 44067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parser.applyPattern(testPattern[i]); 44077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert hasDecimalPoint = testPattern[i].contains("."); 44082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 44097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parser.setDecimalPatternMatchRequired(false); 44107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 44117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = parser.parse(value2Parse).doubleValue(); 44127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("wrong parsed value", parseValue, result); 44137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 44142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert TestFmwk.errln("Parsing " + value2Parse + " should have succeeded with " + testPattern[i] + 44157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired()); 44167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 44172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 44187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parser.setDecimalPatternMatchRequired(true); 44197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 44207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = parser.parse(value2Parse).doubleValue(); 44217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(hasDecimalPoint){ 44222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert TestFmwk.errln("Parsing " + value2Parse + " should NOT have succeeded with " + testPattern[i] + 44237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired()); 44247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 44257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 44267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // OK, should fail 44277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 44287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 44292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 44307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 44312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 44322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 44332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert //TODO(junit): investigate 44342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 4435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public void TestDataDrivenICU() { 44362d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert DataDrivenNumberFormatTestUtility.runSuite( 44372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert "numberformattestspecification.txt", ICU); 4438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 4439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 44402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert //TODO(junit): investigate 44412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 4442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public void TestDataDrivenJDK() { 4443543a6627f6e215cd7df6aba754ad592298aaac69Fredrik Roubert // Android patch: Android java.text.DecimalFormat is actually ICU. 4444543a6627f6e215cd7df6aba754ad592298aaac69Fredrik Roubert if (TestUtil.getJavaVendor() == TestUtil.JavaVendor.Android) return; 4445543a6627f6e215cd7df6aba754ad592298aaac69Fredrik Roubert // Android patch end. 44462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert DataDrivenNumberFormatTestUtility.runSuite( 44472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert "numberformattestspecification.txt", JDK); 4448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 4449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 44507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 44512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 44527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrFmtNegSameAsPositive() { 44537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decfmtsym = DecimalFormatSymbols.getInstance(Locale.US); 44547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert decfmtsym.setMinusSign('\u200B'); // ZERO WIDTH SPACE, in ICU4J cannot set to empty string 44557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat decfmt = new DecimalFormat("\u00A4#,##0.00;\u00A4#,##0.00", decfmtsym); 44567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String currFmtResult = decfmt.format(-100.0); 44577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!currFmtResult.equals("\u200B$100.00")) { 44587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("decfmt.toPattern results wrong, expected \u200B$100.00, got " + currFmtResult); 44597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 44607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 44617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 44622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 44632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public void TestNumberFormatTestDataToString() { 44642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert new NumberFormatTestData().toString(); 4465bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 4466bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 4467ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius // Testing for Issue 11805. 44682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 4469ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius public void TestFormatToCharacterIteratorIssue11805 () { 4470ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius final double number = -350.76; 4471ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfUS = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.US); 4472ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strUS = dfUS.format(number); 4473ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultUS = dfUS.formatToCharacterIterator(number).getAllAttributeKeys(); 4474ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative US Results: " + strUS, 5, resultUS.size()); 4475ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4476ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius // For each test, add assert that all the fields are present and in the right spot. 4477ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius // TODO: Add tests for identify and position of each field, as in IntlTestDecimalFormatAPIC. 44782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 4479ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfDE = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.GERMANY); 4480ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strDE = dfDE.format(number); 4481ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultDE = dfDE.formatToCharacterIterator(number).getAllAttributeKeys(); 4482ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative DE Results: " + strDE, 5, resultDE.size()); 4483ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4484ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfIN = (DecimalFormat) DecimalFormat.getCurrencyInstance(new Locale("hi", "in")); 4485ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strIN = dfIN.format(number); 4486ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultIN = dfIN.formatToCharacterIterator(number).getAllAttributeKeys(); 4487ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative IN Results: " + strIN, 5, resultIN.size()); 4488ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4489ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfJP = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.JAPAN); 4490ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strJP = dfJP.format(number); 4491ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultJP = dfJP.formatToCharacterIterator(number).getAllAttributeKeys(); 4492ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative JA Results: " + strJP, 3, resultJP.size()); 4493ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4494ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfGB = (DecimalFormat) DecimalFormat.getCurrencyInstance(new Locale("en", "gb")); 4495ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strGB = dfGB.format(number); 4496ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultGB = dfGB.formatToCharacterIterator(number).getAllAttributeKeys(); 4497ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative GB Results: " + strGB , 5, resultGB.size()); 4498ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4499ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfPlural = (DecimalFormat) NumberFormat.getInstance(new Locale("en", "gb"), 4500ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius NumberFormat.PLURALCURRENCYSTYLE); 4501ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius strGB = dfPlural.format(number); 4502ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius resultGB = dfPlural.formatToCharacterIterator(number).getAllAttributeKeys(); 4503ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative GB Results: " + strGB , 5, resultGB.size()); 4504ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4505ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius strGB = dfPlural.format(1); 4506ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius resultGB = dfPlural.formatToCharacterIterator(1).getAllAttributeKeys(); 4507ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative GB Results: " + strGB , 4, resultGB.size()); 4508ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4509ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius // Test output with unit value. 4510ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat auPlural = (DecimalFormat) NumberFormat.getInstance(new Locale("en", "au"), 4511ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius NumberFormat.PLURALCURRENCYSTYLE); 4512ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strAU = auPlural.format(1L); 4513ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultAU = 4514ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius auPlural.formatToCharacterIterator(1L).getAllAttributeKeys(); 4515ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Unit AU Result: " + strAU , 4, resultAU.size()); 4516ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4517ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius // Verify Permille fields. 4518ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormatSymbols sym = new DecimalFormatSymbols(new Locale("en", "gb")); 4519ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfPermille = new DecimalFormat("####0.##\u2030", sym); 4520ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius strGB = dfPermille.format(number); 4521ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius resultGB = dfPermille.formatToCharacterIterator(number).getAllAttributeKeys(); 4522ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative GB Permille Results: " + strGB , 3, resultGB.size()); 4523ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius } 4524ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 45252391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // Testing for Issue 11808. 45262d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 45272391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius public void TestRoundUnnecessarytIssue11808 () { 45282391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(); 45292391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius StringBuffer result = new StringBuffer(""); 45302391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius df.setRoundingMode(BigDecimal.ROUND_UNNECESSARY); 45312391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius df.applyPattern("00.0#E0"); 45322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 45332391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius try { 45342391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius df.format(99999.0, result, new FieldPosition(0)); 45352391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius fail("Missing ArithmeticException for double: " + result); 45362391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } catch (ArithmeticException expected) { 45372391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // The exception should be thrown, since rounding is needed. 45382391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 45392391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius 45402391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius try { 45412391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius result = df.format(99999, result, new FieldPosition(0)); 45422391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius fail("Missing ArithmeticException for int: " + result); 45432391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } catch (ArithmeticException expected) { 45442391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // The exception should be thrown, since rounding is needed. 45452391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 45462391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius 45472391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius try { 45482391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius result = df.format(new BigInteger("999999"), result, new FieldPosition(0)); 45492391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius fail("Missing ArithmeticException for BigInteger: " + result); 45502391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } catch (ArithmeticException expected) { 45512391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // The exception should be thrown, since rounding is needed. 45522391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 45532391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius 45542391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius try { 45552391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius result = df.format(new BigDecimal("99999"), result, new FieldPosition(0)); 45562391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius fail("Missing ArithmeticException for BigDecimal: " + result); 45572391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } catch (ArithmeticException expected) { 45582391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // The exception should be thrown, since rounding is needed. 45592391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 45602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 45612391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius try { 45622391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius result = df.format(new BigDecimal("-99999"), result, new FieldPosition(0)); 45632391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius fail("Missing ArithmeticException for BigDecimal: " + result); 45642391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } catch (ArithmeticException expected) { 45652391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // The exception should be thrown, since rounding is needed. 45662391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 45672391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 456887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 456987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Testing for Issue 11735. 45702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 457187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert public void TestNPEIssue11735() { 457287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert DecimalFormat fmt = new DecimalFormat("0", new DecimalFormatSymbols(new ULocale("en"))); 457387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert ParsePosition ppos = new ParsePosition(0); 457487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert assertEquals("Currency symbol missing in parse. Expect null result.", 457587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert fmt.parseCurrency("53.45", ppos), null); 457687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 457787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 457887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert private void CompareAttributedCharacterFormatOutput(AttributedCharacterIterator iterator, 457987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> expected, String formattedOutput) { 458087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 458187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> result = new ArrayList<FieldContainer>(); 458287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert while (iterator.getIndex() != iterator.getEndIndex()) { 458387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert int start = iterator.getRunStart(); 458487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert int end = iterator.getRunLimit(); 458587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert Iterator it = iterator.getAttributes().keySet().iterator(); 45862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert AttributedCharacterIterator.Attribute attribute = (AttributedCharacterIterator.Attribute) it.next(); 45872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert Object value = iterator.getAttribute(attribute); 45882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert result.add(new FieldContainer(start, end, attribute, value)); 458987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert iterator.setIndex(end); 459087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 459187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert assertEquals("Comparing vector length for " + formattedOutput, 459287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert expected.size(), result.size()); 459387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 45942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert if (!expected.containsAll(result)) { 459587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Print information on the differences. 459687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert for (int i = 0; i < expected.size(); i++) { 45972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert System.out.println(" expected[" + i + "] =" + 459887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert expected.get(i).start + " " + 459987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert expected.get(i).end + " " + 46002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert expected.get(i).attribute + " " + 460187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert expected.get(i).value); 46022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert System.out.println(" result[" + i + "] =" + 460387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert result.get(i).start + " " + 460487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert result.get(i).end + " " + 46052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert result.get(i).attribute + " " + 460687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert result.get(i).value); 460787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 460887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 46092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert // TODO: restore when #11914 is fixed. 46102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert // assertTrue("Comparing vector results for " + formattedOutput, 46112d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert // expected.containsAll(result)); 461287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 461387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 461487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Testing for Issue 11914, missing FieldPositions for some field types. 46152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 461687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert public void TestNPEIssue11914() { 461787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // First test: Double value with grouping separators. 461887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> v1 = new ArrayList<FieldContainer>(7); 461987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(0, 3, NumberFormat.Field.INTEGER)); 462087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(3, 4, NumberFormat.Field.GROUPING_SEPARATOR)); 462187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(4, 7, NumberFormat.Field.INTEGER)); 462287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(7, 8, NumberFormat.Field.GROUPING_SEPARATOR)); 462387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(8, 11, NumberFormat.Field.INTEGER)); 462487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(11, 12, NumberFormat.Field.DECIMAL_SEPARATOR)); 462587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(12, 15, NumberFormat.Field.FRACTION)); 462687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 462787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert Number number = new Double(123456789.9753); 462887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert ULocale usLoc = new ULocale("en-US"); 462987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(usLoc); 463087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 463187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert NumberFormat outFmt = NumberFormat.getNumberInstance(usLoc); 463287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert String numFmtted = outFmt.format(number); 463387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert AttributedCharacterIterator iterator = 463487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert outFmt.formatToCharacterIterator(number); 463587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert CompareAttributedCharacterFormatOutput(iterator, v1, numFmtted); 463687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 463787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Second test: Double with scientific notation formatting. 463887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> v2 = new ArrayList<FieldContainer>(7); 463987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(0, 1, NumberFormat.Field.INTEGER)); 464087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(1, 2, NumberFormat.Field.DECIMAL_SEPARATOR)); 464187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(2, 5, NumberFormat.Field.FRACTION)); 464287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(5, 6, NumberFormat.Field.EXPONENT_SYMBOL)); 464387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(6, 7, NumberFormat.Field.EXPONENT_SIGN)); 464487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(7, 8, NumberFormat.Field.EXPONENT)); 464587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert DecimalFormat fmt2 = new DecimalFormat("0.###E+0", US); 464687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 464787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert numFmtted = fmt2.format(number); 464887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert iterator = fmt2.formatToCharacterIterator(number); 464987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert CompareAttributedCharacterFormatOutput(iterator, v2, numFmtted); 465087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 465187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Third test. BigInteger with grouping separators. 465287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> v3 = new ArrayList<FieldContainer>(7); 465387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(0, 1, NumberFormat.Field.SIGN)); 465487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(1, 2, NumberFormat.Field.INTEGER)); 465587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(2, 3, NumberFormat.Field.GROUPING_SEPARATOR)); 465687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(3, 6, NumberFormat.Field.INTEGER)); 465787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(6, 7, NumberFormat.Field.GROUPING_SEPARATOR)); 465887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(7, 10, NumberFormat.Field.INTEGER)); 465987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(10, 11, NumberFormat.Field.GROUPING_SEPARATOR)); 466087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(11, 14, NumberFormat.Field.INTEGER)); 466187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(14, 15, NumberFormat.Field.GROUPING_SEPARATOR)); 466287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(15, 18, NumberFormat.Field.INTEGER)); 466387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(18, 19, NumberFormat.Field.GROUPING_SEPARATOR)); 466487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(19, 22, NumberFormat.Field.INTEGER)); 466587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(22, 23, NumberFormat.Field.GROUPING_SEPARATOR)); 466687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(23, 26, NumberFormat.Field.INTEGER)); 466787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert BigInteger bigNumberInt = new BigInteger("-1234567890246813579"); 466887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert String fmtNumberBigInt = outFmt.format(bigNumberInt); 466987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 467087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert iterator = outFmt.formatToCharacterIterator(bigNumberInt); 467187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert CompareAttributedCharacterFormatOutput(iterator, v3, fmtNumberBigInt); 467287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 467387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Fourth test: BigDecimal with exponential formatting. 467487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> v4 = new ArrayList<FieldContainer>(7); 467587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(0, 1, NumberFormat.Field.SIGN)); 467687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(1, 2, NumberFormat.Field.INTEGER)); 467787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(2, 3, NumberFormat.Field.DECIMAL_SEPARATOR)); 467887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(3, 6, NumberFormat.Field.FRACTION)); 467987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(6, 7, NumberFormat.Field.EXPONENT_SYMBOL)); 468087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(7, 8, NumberFormat.Field.EXPONENT_SIGN)); 468187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(8, 9, NumberFormat.Field.EXPONENT)); 468287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 468387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert java.math.BigDecimal numberBigD = new java.math.BigDecimal(-123456789); 468487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert String fmtNumberBigDExp = fmt2.format(numberBigD); 468587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 468687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert iterator = fmt2.formatToCharacterIterator(numberBigD); 468787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert CompareAttributedCharacterFormatOutput(iterator, v4, fmtNumberBigDExp); 46882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 468987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 469087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 46912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert // Test that the decimal is shown even when there are no fractional digits 46922d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 46932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public void Test11621() throws Exception { 46942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert String pat = "0.##E0"; 46952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 46962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert DecimalFormatSymbols icuSym = new DecimalFormatSymbols(Locale.US); 46972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert DecimalFormat icuFmt = new DecimalFormat(pat, icuSym); 46982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert icuFmt.setDecimalSeparatorAlwaysShown(true); 46992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert String icu = ((NumberFormat)icuFmt).format(299792458); 47002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 47012d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert java.text.DecimalFormatSymbols jdkSym = new java.text.DecimalFormatSymbols(Locale.US); 47022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert java.text.DecimalFormat jdkFmt = new java.text.DecimalFormat(pat,jdkSym); 47032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert jdkFmt.setDecimalSeparatorAlwaysShown(true); 47042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert String jdk = ((java.text.NumberFormat)jdkFmt).format(299792458); 47052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 47062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert assertEquals("ICU and JDK placement of decimal in exponent", jdk, icu); 470787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 470887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 47096bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius private void checkFormatWithField(String testInfo, Format format, Object object, 47106bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String expected, Format.Field field, int begin, int end) { 47116bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius StringBuffer buffer = new StringBuffer(); 47126bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius FieldPosition pos = new FieldPosition(field); 47136bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius format.format(object, buffer, pos); 47146bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47156bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius assertEquals("Test " + testInfo + ": incorrect formatted text", expected, buffer.toString()); 47166bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47176bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius if (begin != pos.getBeginIndex() || end != pos.getEndIndex()) { 47186bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius assertEquals("Index mismatch", field + " " + begin + ".." + end, 47196bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius pos.getFieldAttribute() + " " + pos.getBeginIndex() + ".." + pos.getEndIndex()); 47206bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47216bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47226bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47232d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 47246bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsCurrency() { 47256bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat formatter = (DecimalFormat) NumberFormat.getCurrencyInstance(ULocale.US); 47266bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new Double(92314587.66); 47276bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String result = "$92,314,587.66"; 47286bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47296bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("currency", formatter, number, result, 47306bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.CURRENCY, 0, 1); 47316bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", formatter, number, result, 47326bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 11); 47336bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("grouping separator", formatter, number, result, 47346bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.GROUPING_SEPARATOR, 3, 4); 47356bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", formatter, number, result, 47366bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 11, 12); 47376bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("fraction", formatter, number, result, 47386bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.FRACTION, 12, 14); 47396bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47406bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 47426bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsNegativeDouble() { 47436bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // test for exponential fields with double 47446bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 47456bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new Double(-12345678.90123); 47466bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat formatter = new DecimalFormat("0.#####E+00", us_symbols); 47476bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String numFmtted = formatter.format(number); 47486bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47496bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", formatter, number, numFmtted, 47506bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 47516bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", formatter, number, numFmtted, 47526bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 2); 47536bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", formatter, number, numFmtted, 47546bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3); 47556bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent symbol", formatter, number, numFmtted, 47566bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SYMBOL, 8, 9); 47576bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent sign", formatter, number, numFmtted, 47586bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SIGN, 9, 10); 47596bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent", formatter, number, numFmtted, 47606bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT, 10, 12); 47616bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47626bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 47646bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsPerCent() { 47656bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // Check PERCENT 47666bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat percentFormat = (DecimalFormat) NumberFormat.getPercentInstance(ULocale.US); 47676bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new Double(-0.986); 47686bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String numberFormatted = percentFormat.format(number); 47696bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", percentFormat, number, numberFormatted, 47706bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 47716bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", percentFormat, number, numberFormatted, 47726bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 3); 47736bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("percent", percentFormat, number, numberFormatted, 47746bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.PERCENT, 3, 4); 47756bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47766bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 47786bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsPerCentPattern() { 47796bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // Check PERCENT with more digits 47806bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 47816bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat fmtPercent = new DecimalFormat("0.#####%", us_symbols); 47826bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new Double(-0.986); 47836bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String numFmtted = fmtPercent.format(number); 47846bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47856bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", fmtPercent, number, numFmtted, 47866bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 47876bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", fmtPercent, number, numFmtted, 47886bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 3); 47896bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", fmtPercent, number, numFmtted, 47906bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 3, 4); 47916bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("fraction", fmtPercent, number, numFmtted, 47926bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.FRACTION, 4, 5); 47936bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("percent", fmtPercent, number, numFmtted, 47946bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.PERCENT, 5, 6); 47956bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47966bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 47986bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsPerMille() { 47996bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // Check PERMILLE 48006bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 48016bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat fmtPerMille = new DecimalFormat("0.######‰", us_symbols); 48026bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number numberPermille = new Double(-0.98654); 48036bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String numFmtted = fmtPerMille.format(numberPermille); 48046bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 48056bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", fmtPerMille, numberPermille, numFmtted, 48066bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 48076bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", fmtPerMille, numberPermille, numFmtted, 48086bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 4); 48096bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", fmtPerMille, numberPermille, numFmtted, 48106bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 4, 5); 48116bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("fraction", fmtPerMille, numberPermille, numFmtted, 48126bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.FRACTION, 5, 7); 48136bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("permille", fmtPerMille, numberPermille, numFmtted, 48146bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.PERMILLE, 7, 8); 48156bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 48166bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 48172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 48186bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsNegativeBigInt() { 48196bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 48206bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat formatter = new DecimalFormat("0.#####E+0", us_symbols); 48216bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new BigDecimal("-123456789987654321"); 48226bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String bigDecFmtted = formatter.format(number); 48236bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 48246bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", formatter, number, bigDecFmtted, 48256bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 48266bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", formatter, number, bigDecFmtted, 48276bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 2); 48286bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", formatter, number, bigDecFmtted, 48296bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3); 48306bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent symbol", formatter, number, bigDecFmtted, 48316bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SYMBOL, 8, 9); 48326bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent sign", formatter, number, bigDecFmtted, 48336bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SIGN, 9, 10); 48346bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent", formatter, number, bigDecFmtted, 48356bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT, 10, 12); 48366bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 48376bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 48382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 48396bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsNegativeLong() { 48406bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new Long("-123456789987654321"); 48416bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 48426bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat formatter = new DecimalFormat("0.#####E+0", us_symbols); 48436bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String longFmtted = formatter.format(number); 48446bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 48456bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", formatter, number, longFmtted, 48466bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 48476bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", formatter, number, longFmtted, 48486bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 2); 48496bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", formatter, number, longFmtted, 48506bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3); 48516bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent symbol", formatter, number, longFmtted, 48526bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SYMBOL, 8, 9); 48536bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent sign", formatter, number, longFmtted, 48546bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SIGN, 9, 10); 48556bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent", formatter, number, longFmtted, 48566bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT, 10, 12); 48576bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 48586bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 48592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 48606bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsPositiveBigDec() { 48616bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // Check complex positive;negative pattern. 48626bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 48636bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat fmtPosNegSign = new DecimalFormat("+0.####E+00;-0.#######E+0", us_symbols); 48646bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number positiveExp = new Double("9876543210"); 48656bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String posExpFormatted = fmtPosNegSign.format(positiveExp); 48666bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 48676bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", fmtPosNegSign, positiveExp, posExpFormatted, 48686bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 48696bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", fmtPosNegSign, positiveExp, posExpFormatted, 48706bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 2); 48716bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", fmtPosNegSign, positiveExp, posExpFormatted, 48726bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3); 48736bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("fraction", fmtPosNegSign, positiveExp, posExpFormatted, 48746bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.FRACTION, 3, 7); 48756bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent symbol", fmtPosNegSign, positiveExp, posExpFormatted, 48766bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SYMBOL, 7, 8); 48776bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent sign", fmtPosNegSign, positiveExp, posExpFormatted, 48786bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SIGN, 8, 9); 48796bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent", fmtPosNegSign, positiveExp, posExpFormatted, 48806bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT, 9, 11); 48816bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 48826bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 48832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 48846bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsNegativeBigDec() { 48856bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // Check complex positive;negative pattern. 48866bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 48876bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat fmtPosNegSign = new DecimalFormat("+0.####E+00;-0.#######E+0", us_symbols); 48886bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number negativeExp = new BigDecimal("-0.000000987654321083"); 48896bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String negExpFormatted = fmtPosNegSign.format(negativeExp); 48906bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 48916bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", fmtPosNegSign, negativeExp, negExpFormatted, 48926bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 48936bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", fmtPosNegSign, negativeExp, negExpFormatted, 48946bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 2); 48956bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", fmtPosNegSign, negativeExp, negExpFormatted, 48966bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3); 48976bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("fraction", fmtPosNegSign, negativeExp, negExpFormatted, 48986bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.FRACTION, 3, 7); 48996bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent symbol", fmtPosNegSign, negativeExp, negExpFormatted, 49006bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SYMBOL, 7, 8); 49016bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent sign", fmtPosNegSign, negativeExp, negExpFormatted, 49026bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SIGN, 8, 9); 49036bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent", fmtPosNegSign, negativeExp, negExpFormatted, 49046bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT, 9, 11); 49056bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 49062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 49072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 49082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public void TestStringSymbols() { 49092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert DecimalFormatSymbols symbols = new DecimalFormatSymbols(ULocale.US); 49102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 49112d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert String[] customDigits = {"(0)", "(1)", "(2)", "(3)", "(4)", "(5)", "(6)", "(7)", "(8)", "(9)"}; 49122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert symbols.setDigitStrings(customDigits); 49132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert symbols.setDecimalSeparatorString("~~"); 49142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert symbols.setGroupingSeparatorString("^^"); 49152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 49162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert DecimalFormat fmt = new DecimalFormat("#,##0.0#", symbols); 49172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 49182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert expect2(fmt, 1234567.89, "(1)^^(2)(3)(4)^^(5)(6)(7)~~(8)(9)"); 49192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 49207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 4921