NumberFormatTest.java revision b040d2280dfc88dfb44693d28c9029e7b8dbae1c
17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert * Copyright (C) 2001-2016, International Business Machines Corporation and 4aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert * others. All Rights Reserved. 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Port From: ICU4C v1.8.1 : format : NumberFormatTest 10bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Source File: $ICU4oot/source/test/intltest/numfmtst.cpp 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/ 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format; 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubertimport java.io.IOException; 16e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontínimport java.lang.reflect.Array; 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.math.BigInteger; 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.AttributedCharacterIterator; 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition; 206bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Corneliusimport java.text.Format; 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException; 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition; 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.ArrayList; 24e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontínimport java.util.Arrays; 2587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport java.util.Iterator; 2687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport java.util.List; 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale; 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Set; 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestUtil; 3187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport com.ibm.icu.dev.test.format.IntlTestDecimalFormatAPIC.FieldContainer; 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUConfig; 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.LocaleUtility; 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.data.ResourceReader; 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.data.TokenIterator; 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.math.BigDecimal; 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.math.MathContext; 38b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontínimport com.ibm.icu.text.CompactDecimalFormat; 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormat; 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols; 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DisplayContext; 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.MeasureFormat; 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat; 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat.NumberFormatFactory; 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat.SimpleNumberFormatFactory; 46e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontínimport com.ibm.icu.text.NumberingSystem; 47b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontínimport com.ibm.icu.text.RuleBasedNumberFormat; 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Currency; 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.CurrencyAmount; 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale; 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class NumberFormatTest extends com.ibm.icu.dev.test.TestFmwk { 53bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 54bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert private static ULocale EN = new ULocale("en"); 55bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 56bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert private static Number toNumber(String s) { 57bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (s.equals("NaN")) { 58bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return Double.NaN; 59bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else if (s.equals("-Inf")) { 60bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return Double.NEGATIVE_INFINITY; 61bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } else if (s.equals("Inf")) { 62bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return Double.POSITIVE_INFINITY; 63bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 64bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return new BigDecimal(s); 65bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 66bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 67bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 68bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert private DataDrivenNumberFormatTestSuite.CodeUnderTest ICU = 69bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert new DataDrivenNumberFormatTestSuite.CodeUnderTest() { 70bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 71bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public Character Id() { return 'J'; } 72bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 73bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 74bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public String format(NumberFormatTestTuple tuple) { 75bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DecimalFormat fmt = newDecimalFormat(tuple); 76bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.format(toNumber(tuple.format)); 77bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.output; 78bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 79bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected " + expected + ", got " + actual; 80bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 81bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 82bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 83bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 84bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 85bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public String toPattern(NumberFormatTestTuple tuple) { 86bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DecimalFormat fmt = newDecimalFormat(tuple); 87bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert StringBuilder result = new StringBuilder(); 88bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.toPattern != null) { 89bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.toPattern; 90bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.toPattern(); 91bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 92bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert result.append("Expected toPattern=" + expected + ", got " + actual); 93bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 94bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 95bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.toLocalizedPattern != null) { 96bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.toLocalizedPattern; 97bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.toLocalizedPattern(); 98bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 99bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert result.append("Expected toLocalizedPattern=" + expected + ", got " + actual); 100bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 101bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 102bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return result.length() == 0 ? null : result.toString(); 103bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 104bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 105bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 106bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public String parse(NumberFormatTestTuple tuple) { 107bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DecimalFormat fmt = newDecimalFormat(tuple); 108bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert ParsePosition ppos = new ParsePosition(0); 109bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number actual = fmt.parse(tuple.parse, ppos); 110bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (ppos.getIndex() == 0) { 111bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!tuple.output.equals("fail")) { 112bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse error expected."; 113bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 114bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 115bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 116bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.output.equals("fail")) { 117bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse succeeded: "+actual+", but was expected to fail."; 118bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 119bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number expected = toNumber(tuple.output); 120bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // number types cannot be compared, this is the best we can do. 121bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (expected.doubleValue() != (actual.doubleValue())) { 122bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected: " + expected + ", got: " + actual; 123bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 124bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 125bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 126bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 127bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 128bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public String parseCurrency(NumberFormatTestTuple tuple) { 129bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DecimalFormat fmt = newDecimalFormat(tuple); 130bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert ParsePosition ppos = new ParsePosition(0); 131bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert CurrencyAmount currAmt = fmt.parseCurrency(tuple.parse, ppos); 132bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (ppos.getIndex() == 0) { 133bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!tuple.output.equals("fail")) { 134bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse error expected."; 135bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 136bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 137bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 138bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.output.equals("fail")) { 139bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse succeeded: "+currAmt+", but was expected to fail."; 140bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 141bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number expected = toNumber(tuple.output); 142bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number actual = currAmt.getNumber(); 143bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // number types cannot be compared, this is the best we can do. 144bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (expected.doubleValue() != (actual.doubleValue())) { 145bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected: " + expected + ", got: " + actual; 146bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 14787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 148bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!tuple.outputCurrency.equals(currAmt.getCurrency().toString())) { 149bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected currency: " + tuple.outputCurrency + ", got: " + currAmt.getCurrency(); 150bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 151bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 152bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 153bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 154bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert /** 155bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param tuple 156bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @return 157bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */ 158bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert private DecimalFormat newDecimalFormat(NumberFormatTestTuple tuple) { 15987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 160bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DecimalFormat fmt = new DecimalFormat( 161bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.pattern == null ? "0" : tuple.pattern, 162bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert new DecimalFormatSymbols(tuple.locale == null ? EN : tuple.locale)); 163bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert adjustDecimalFormat(tuple, fmt); 164bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return fmt; 165bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 166bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert /** 167bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param tuple 168bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param fmt 169bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */ 170bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert private void adjustDecimalFormat(NumberFormatTestTuple tuple, DecimalFormat fmt) { 171bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minIntegerDigits != null) { 172bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumIntegerDigits(tuple.minIntegerDigits); 173bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 174bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxIntegerDigits != null) { 175bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMaximumIntegerDigits(tuple.maxIntegerDigits); 176bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 177bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minFractionDigits != null) { 178bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumFractionDigits(tuple.minFractionDigits); 179bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 180bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxFractionDigits != null) { 181bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMaximumFractionDigits(tuple.maxFractionDigits); 182bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 183bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.currency != null) { 184bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setCurrency(tuple.currency); 185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minGroupingDigits != null) { 187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops we don't support this. 188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useSigDigits != null) { 190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setSignificantDigitsUsed( 191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.useSigDigits != 0); 192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minSigDigits != null) { 194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumSignificantDigits(tuple.minSigDigits); 195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxSigDigits != null) { 197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMaximumSignificantDigits(tuple.maxSigDigits); 198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 199bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useGrouping != null) { 200bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setGroupingUsed(tuple.useGrouping != 0); 201bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 202bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.multiplier != null) { 203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMultiplier(tuple.multiplier); 204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.roundingIncrement != null) { 206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setRoundingIncrement(tuple.roundingIncrement.doubleValue()); 207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.formatWidth != null) { 209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setFormatWidth(tuple.formatWidth); 210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.padCharacter != null && tuple.padCharacter.length() > 0) { 212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPadCharacter(tuple.padCharacter.charAt(0)); 213bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useScientific != null) { 215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setScientificNotation(tuple.useScientific != 0); 216bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 217bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.grouping != null) { 218bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setGroupingSize(tuple.grouping); 219bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 220bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.grouping2 != null) { 221bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setSecondaryGroupingSize(tuple.grouping2); 222bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 223bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.roundingMode != null) { 224bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setRoundingMode(tuple.roundingMode); 225bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 226bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.currencyUsage != null) { 227bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setCurrencyUsage(tuple.currencyUsage); 228bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } if (tuple.minimumExponentDigits != null) { 229bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumExponentDigits( 230bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.minimumExponentDigits.byteValue()); 231bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 232bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.exponentSignAlwaysShown != null) { 233bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setExponentSignAlwaysShown( 234bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.exponentSignAlwaysShown != 0); 235bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 236bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.decimalSeparatorAlwaysShown != null) { 237bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setDecimalSeparatorAlwaysShown( 238bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.decimalSeparatorAlwaysShown != 0); 239bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 240bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.padPosition != null) { 241bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPadPosition(tuple.padPosition); 242bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 243bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.positivePrefix != null) { 244bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPositivePrefix(tuple.positivePrefix); 245bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 246bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.positiveSuffix != null) { 247bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPositiveSuffix(tuple.positiveSuffix); 248bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 249bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.negativePrefix != null) { 250bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setNegativePrefix(tuple.negativePrefix); 251bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 252bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.negativeSuffix != null) { 253bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setNegativeSuffix(tuple.negativeSuffix); 254bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 255bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.localizedPattern != null) { 256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.applyLocalizedPattern(tuple.localizedPattern); 257bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 258bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert int lenient = tuple.lenient == null ? 1 : tuple.lenient.intValue(); 259bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setParseStrict(lenient == 0); 260bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.parseIntegerOnly != null) { 261bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setParseIntegerOnly(tuple.parseIntegerOnly != 0); 262bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 263bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.decimalPatternMatchRequired != null) { 264bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setDecimalPatternMatchRequired(tuple.decimalPatternMatchRequired != 0); 265bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 266bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.parseNoExponent != null) { 267bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops, not supported for now 268bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 269bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 270bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert }; 271bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 272bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 273bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert private DataDrivenNumberFormatTestSuite.CodeUnderTest JDK = 274bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert new DataDrivenNumberFormatTestSuite.CodeUnderTest() { 275bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 276bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public Character Id() { return 'K'; } 277bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 278bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 279bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public String format(NumberFormatTestTuple tuple) { 280bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert java.text.DecimalFormat fmt = newDecimalFormat(tuple); 281bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.format(toNumber(tuple.format)); 282bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.output; 283bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 284bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected " + expected + ", got " + actual; 285bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 286bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 287bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 288bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 289bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 290bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public String toPattern(NumberFormatTestTuple tuple) { 291bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert java.text.DecimalFormat fmt = newDecimalFormat(tuple); 292bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert StringBuilder result = new StringBuilder(); 293bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.toPattern != null) { 294bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.toPattern; 295bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.toPattern(); 296bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 297bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert result.append("Expected toPattern=" + expected + ", got " + actual); 298bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 299bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 300bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.toLocalizedPattern != null) { 301bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String expected = tuple.toLocalizedPattern; 302bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String actual = fmt.toLocalizedPattern(); 303bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!expected.equals(actual)) { 304bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert result.append("Expected toLocalizedPattern=" + expected + ", got " + actual); 305bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 306bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 307bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return result.length() == 0 ? null : result.toString(); 308bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 309bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 310bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert @Override 311bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public String parse(NumberFormatTestTuple tuple) { 312bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert java.text.DecimalFormat fmt = newDecimalFormat(tuple); 313bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert ParsePosition ppos = new ParsePosition(0); 314bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number actual = fmt.parse(tuple.parse, ppos); 315bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (ppos.getIndex() == 0) { 316bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (!tuple.output.equals("fail")) { 317bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse error expected."; 318bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 319bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 320bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 321bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.output.equals("fail")) { 322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Parse succeeded: "+actual+", but was expected to fail."; 323bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 324bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert Number expected = toNumber(tuple.output); 325bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // number types cannot be compared, this is the best we can do. 326bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (expected.doubleValue() != actual.doubleValue()) { 327bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return "Expected: " + expected + ", got: " + actual; 328bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 329bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return null; 330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert /** 335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param tuple 336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @return 337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */ 338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert private java.text.DecimalFormat newDecimalFormat(NumberFormatTestTuple tuple) { 339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert java.text.DecimalFormat fmt = new java.text.DecimalFormat( 340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.pattern == null ? "0" : tuple.pattern, 341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert new java.text.DecimalFormatSymbols( 342bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert (tuple.locale == null ? EN : tuple.locale).toLocale())); 343bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert adjustDecimalFormat(tuple, fmt); 344bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert return fmt; 345bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 346bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 347bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert /** 348bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param tuple 349bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * @param fmt 350bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */ 351bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert private void adjustDecimalFormat(NumberFormatTestTuple tuple, java.text.DecimalFormat fmt) { 352bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minIntegerDigits != null) { 353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumIntegerDigits(tuple.minIntegerDigits); 354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxIntegerDigits != null) { 356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMaximumIntegerDigits(tuple.maxIntegerDigits); 357bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 358bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minFractionDigits != null) { 359bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMinimumFractionDigits(tuple.minFractionDigits); 360bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 361bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxFractionDigits != null) { 362bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMaximumFractionDigits(tuple.maxFractionDigits); 363bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 364bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.currency != null) { 365bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setCurrency(java.util.Currency.getInstance(tuple.currency.toString())); 366bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 367bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minGroupingDigits != null) { 368bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops we don't support this. 369bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 370bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useSigDigits != null) { 371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops we don't support this 372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 373bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minSigDigits != null) { 374bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops we don't support this 375bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 376bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.maxSigDigits != null) { 377bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops we don't support this 378bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 379bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useGrouping != null) { 380bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setGroupingUsed(tuple.useGrouping != 0); 381bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 382bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.multiplier != null) { 383bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setMultiplier(tuple.multiplier); 384bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 385bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.roundingIncrement != null) { 386bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 387bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 388bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.formatWidth != null) { 389bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 390bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 391bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.padCharacter != null && tuple.padCharacter.length() > 0) { 392bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 393bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 394bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.useScientific != null) { 395bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 396bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 397bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.grouping != null) { 398bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setGroupingSize(tuple.grouping); 399bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 400bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.grouping2 != null) { 401bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 402bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 403bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.roundingMode != null) { 404bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 405bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 406bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.currencyUsage != null) { 407bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 408bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 409bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.minimumExponentDigits != null) { 410bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 411bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 412bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.exponentSignAlwaysShown != null) { 413bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 414bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 415bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.decimalSeparatorAlwaysShown != null) { 416bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setDecimalSeparatorAlwaysShown( 417bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert tuple.decimalSeparatorAlwaysShown != 0); 418bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 419bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.padPosition != null) { 420bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Not supported 421bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 422bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.positivePrefix != null) { 423bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPositivePrefix(tuple.positivePrefix); 424bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 425bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.positiveSuffix != null) { 426bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setPositiveSuffix(tuple.positiveSuffix); 427bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 428bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.negativePrefix != null) { 429bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setNegativePrefix(tuple.negativePrefix); 430bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 431bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.negativeSuffix != null) { 432bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setNegativeSuffix(tuple.negativeSuffix); 433bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 434bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.localizedPattern != null) { 435bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.applyLocalizedPattern(tuple.localizedPattern); 436bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 437bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 438bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // lenient parsing not supported by JDK 439bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.parseIntegerOnly != null) { 440bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert fmt.setParseIntegerOnly(tuple.parseIntegerOnly != 0); 441bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 442bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.decimalPatternMatchRequired != null) { 443bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops, not supported 444bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 445bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert if (tuple.parseNoExponent != null) { 446bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert // Oops, not supported for now 447bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 448bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 449bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert }; 4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static void main(String[] args) throws Exception { 4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new NumberFormatTest().run(args); 4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRoundingScientific10542() { 4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat format = 4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("0.00E0"); 4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik 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"}; 4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik 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 } 5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test10419RoundingWith0FractionDigits() { 5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Object[][] data = new Object[][]{ 5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_CEILING, 1.488, "2"}, 5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_DOWN, 1.588, "1"}, 5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_FLOOR, 1.588, "1"}, 5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_HALF_DOWN, 1.5, "1"}, 5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_HALF_EVEN, 2.5, "2"}, 5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_HALF_UP, 2.5, "3"}, 5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {BigDecimal.ROUND_UP, 1.5, "2"}, 5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nff = NumberFormat.getNumberInstance(ULocale.ENGLISH); 5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nff.setMaximumFractionDigits(0); 5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (Object[] item : data) { 5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nff.setRoundingMode(((Integer) item[0]).intValue()); 5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test10419", item[2], nff.format(item[1])); 5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseNegativeWithFaLocale() { 5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat parser = (DecimalFormat) NumberFormat.getInstance(new ULocale("fa")); 5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double value = parser.parse("-0,5").doubleValue(); 5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Expect -0.5", -0.5, value); 5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.errln("Parsing -0.5 should have succeeded."); 5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseNegativeWithAlternativeMinusSign() { 5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat parser = (DecimalFormat) NumberFormat.getInstance(new ULocale("en")); 5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double value = parser.parse("\u208B0.5").doubleValue(); 5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Expect -0.5", -0.5, value); 5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.errln("Parsing -0.5 should have succeeded."); 6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test various patterns 6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestPatterns() { 6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String pat[] = { "#.#", "#.", ".#", "#" }; 6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int pat_length = pat.length; 6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String newpat[] = { "#0.#", "#0.", "#.0", "#" }; 6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String num[] = { "0", "0.", ".0", "0" }; 6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<pat_length; ++i) 6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat[i], sym); 6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String newp = fmt.toPattern(); 6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!newp.equals(newpat[i])) 6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Pattern " + pat[i] + " should transmute to " + newpat[i] + 6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "; " + newp + " seen instead"); 6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = ((NumberFormat)fmt).format(0); 6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(num[i])) 6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Pattern " + pat[i] + " should format zero as " + num[i] + 6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "; " + s + " seen instead"); 6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Min integer digits = " + fmt.getMinimumIntegerDigits()); 6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // BigInteger 0 - ticket#4731 6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat)fmt).format(BigInteger.ZERO); 6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(num[i])) 6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Pattern " + pat[i] + " should format BigInteger zero as " + num[i] + 6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "; " + s + " seen instead"); 6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Min integer digits = " + fmt.getMinimumIntegerDigits()); 6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test exponential pattern 6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestExponential() { 6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0.###E0]" }; 6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int pat_length = pat.length; 6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 }; 6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int val_length = val.length; 6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String valFormat[] = { 6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 0.####E0 6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271", 6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 00.000E00 6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272", 6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // ##0.######E000 6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273", 6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 0.###E0;[0.###E0] 6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]" }; 6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*double valParse[] = 6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.01234, 123460000, 1.23E300, -3.1416E-271, 6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.01234, 123460000, 1.23E300, -3.1416E-271, 6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.01234, 123456800, 1.23E300, -3.141593E-271, 6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.01234, 123500000, 1.23E300, -3.142E-271, 6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert };*/ //The variable is never used 6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int lval[] = { 0, -1, 1, 123456789 }; 6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int lval_length = lval.length; 6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String lvalFormat[] = { 6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 0.####E0 6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0E0", "-1E0", "1E0", "1.2346E8", 6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 00.000E00 6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07", 6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // ##0.######E000 6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0E000", "-1E000", "1E000", "123.4568E006", 6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 0.###E0;[0.###E0] 6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0E0", "[1E0]", "1E0", "1.235E8" }; 6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int lvalParse[] = 6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, -1, 1, 123460000, 6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, -1, 1, 123460000, 6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, -1, 1, 123456800, 6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, -1, 1, 123500000, 6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int ival = 0, ilval = 0; 6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int p = 0; p < pat_length; ++p) { 6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat[p], sym); 6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pattern \"" + pat[p] + "\" -toPattern-> \"" + fmt.toPattern() + "\""); 6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int v; 6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (v = 0; v < val_length; ++v) { 6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s; 6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat) fmt).format(val[v]); 6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" " + val[v] + " -format-> " + s); 6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(valFormat[v + ival])) 6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected " + valFormat[v + ival]); 6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double a = fmt.parse(s, pos).doubleValue(); 6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pos.getIndex() == s.length()) { 6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" -parse-> " + Double.toString(a)); 6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Use epsilon comparison as necessary 6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else 6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + a); 7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (v = 0; v < lval_length; ++v) { 7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s; 7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat) fmt).format(lval[v]); 7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" " + lval[v] + "L -format-> " + s); 7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(lvalFormat[v + ilval])) 7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("ERROR: Expected " + lvalFormat[v + ilval] + " Got: " + s); 7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long a = 0; 7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number A = fmt.parse(s, pos); 7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (A != null) { 7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert a = A.longValue(); 7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pos.getIndex() == s.length()) { 7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" -parse-> " + a); 7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (a != lvalParse[v + ilval]) 7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected " + lvalParse[v + ilval]); 7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else 7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Partial parse (" + pos.getIndex() + " chars) -> " + Long.toString(a)); 7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail to parse the string: " + s); 7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ival += val_length; 7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ilval += lval_length; 7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test the handling of quotes 7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestQuotes() { 7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer pat; 7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = new StringBuffer("a'fo''o'b#"); 7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat.toString(), sym); 7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = ((NumberFormat)fmt).format(123); 7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pattern \"" + pat + "\""); 7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format 123 . " + s); 7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals("afo'ob123")) 7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected afo'ob123"); 7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s =""; 7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = new StringBuffer("a''b#"); 7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = new DecimalFormat(pat.toString(), sym); 7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat)fmt).format(123); 7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pattern \"" + pat + "\""); 7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format 123 . " + s); 7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals("a'b123")) 7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected a'b123"); 7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseCurrencyTrailingSymbol() { 7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // see sun bug 4709840 7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getCurrencyInstance(Locale.GERMANY); 7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert float val = 12345.67f; 7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str = fmt.format(val); 7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("val: " + val + " str: " + str); 7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = fmt.parse(str); 7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("num: " + num); 7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse of '" + str + "' threw exception: " + e); 7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test the handling of the currency symbol in patterns. 7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/ 7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencySign() { 7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer pat = new StringBuffer(""); 7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char currency = 0x00A4; 7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // "\xA4#,##0.00;-\xA4#,##0.00" 7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat.append(currency).append("#,##0.00;-").append(currency).append("#,##0.00"); 7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat.toString(), sym); 7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = ((NumberFormat) fmt).format(1234.56); 7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = new StringBuffer(); 7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pattern \"" + fmt.toPattern() + "\""); 7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format " + 1234.56 + " . " + s); 7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("symbol, pos", "$1,234.56", s); 7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat) fmt).format(-1234.56); 7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format " + Double.toString(-1234.56) + " . " + s); 7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("symbol, neg", "-$1,234.56", s); 7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat.setLength(0); 7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // "\xA4\xA4 #,##0.00;\xA4\xA4 -#,##0.00" 7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat.append(currency).append(currency).append(" #,##0.00;").append(currency).append(currency).append(" -#,##0.00"); 7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = new DecimalFormat(pat.toString(), sym); 7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat) fmt).format(1234.56); 7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Pattern \"" + fmt.toPattern() + "\""); 7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format " + Double.toString(1234.56) + " . " + s); 7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("name, pos", "USD 1,234.56", s); 7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = ((NumberFormat) fmt).format(-1234.56); 7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(" Format " + Double.toString(-1234.56) + " . " + s); 7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("name, neg", "USD -1,234.56", s); 7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSpaceParsing() { 8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the data are: 8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the string to be parsed, parsed position, parsed error index 8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] DATA = { 8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$124", "4", "-1"}, 8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$124 $124", "4", "-1"}, 8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$124 ", "4", "-1"}, 8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$ 124 ", "5", "-1"}, 8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$\u00A0124 ", "5", "-1"}, 8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {" $ 124 ", "0", "0"}, // TODO: need to handle space correctly 8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"124$", "0", "3"}, // TODO: need to handle space correctly 8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // {"124 $", "5", "-1"}, TODO: OK or NOT? 8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"124 $", "0", "3"}, 8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat foo = NumberFormat.getCurrencyInstance(); 8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < DATA.length; ++i) { 8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition parsePosition = new ParsePosition(0); 8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String stringToBeParsed = DATA[i][0]; 8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int parsedPosition = Integer.parseInt(DATA[i][1]); 8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int errorIndex = Integer.parseInt(DATA[i][2]); 8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number result = foo.parse(stringToBeParsed, parsePosition); 8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (parsePosition.getIndex() != parsedPosition || 8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parsePosition.getErrorIndex() != errorIndex) { 8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED parse " + stringToBeParsed + "; parse position: " + parsePosition.getIndex() + "; error position: " + parsePosition.getErrorIndex()); 8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (parsePosition.getErrorIndex() == -1 && 8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result.doubleValue() != 124) { 8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED parse " + stringToBeParsed + "; value " + result.doubleValue()); 8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED " + e.toString()); 8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestMultiCurrencySign() { 8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] DATA = { 8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the fields in the following test are: 8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // locale, 8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency pattern (with negative pattern), 8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency number to be formatted, 8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency format using currency symbol name, such as "$" for USD, 8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency format using currency ISO name, such as "USD", 8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency format using plural name, such as "US dollars". 8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // for US locale 8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "1234.56", "$1,234.56", "USD1,234.56", "US dollars1,234.56"}, 8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "-1234.56", "-$1,234.56", "-USD1,234.56", "-US dollars1,234.56"}, 8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en_US", "\u00A4#,##0.00;-\u00A4#,##0.00", "1", "$1.00", "USD1.00", "US dollars1.00"}, 8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // for CHINA locale 8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "1234.56", "\uFFE51,234.56", "CNY1,234.56", "\u4EBA\u6C11\u5E011,234.56"}, 8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "-1234.56", "(\uFFE51,234.56)", "(CNY1,234.56)", "(\u4EBA\u6C11\u5E011,234.56)"}, 8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"zh_CN", "\u00A4#,##0.00;(\u00A4#,##0.00)", "1", "\uFFE51.00", "CNY1.00", "\u4EBA\u6C11\u5E011.00"} 8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String doubleCurrencyStr = "\u00A4\u00A4"; 8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String tripleCurrencyStr = "\u00A4\u00A4\u00A4"; 8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; ++i) { 8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String locale = DATA[i][0]; 8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = DATA[i][1]; 8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double numberToBeFormat = new Double(DATA[i][2]); 8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(new ULocale(locale)); 8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int j=1; j<=3; ++j) { 8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // j represents the number of currency sign in the pattern. 8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (j == 2) { 8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = pat.replaceAll("\u00A4", doubleCurrencyStr); 8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (j == 3) { 8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = pat.replaceAll("\u00A4\u00A4", tripleCurrencyStr); 8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat, sym); 8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = ((NumberFormat) fmt).format(numberToBeFormat); 8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][3] is the currency format result using a 8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // single currency sign. 8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][4] is the currency format result using 8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // double currency sign. 8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][5] is the currency format result using 8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // triple currency sign. 8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][j+2] is the currency format result using 8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 'j' number of currency sign. 8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String currencyFormatResult = DATA[i][2+j]; 8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s.equals(currencyFormatResult)) { 8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL format: Expected " + currencyFormatResult); 8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // mix style parsing 8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int k=3; k<=5; ++k) { 8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][3] is the currency format result using a 8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // single currency sign. 8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][4] is the currency format result using 8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // double currency sign. 8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][5] is the currency format result using 8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // triple currency sign. 8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String oneCurrencyFormat = DATA[i][k]; 8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fmt.parse(oneCurrencyFormat).doubleValue() != 8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberToBeFormat.doubleValue()) { 8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED parse " + oneCurrencyFormat); 8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED, DecimalFormat parse currency: " + e.toString()); 9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyFormatForMixParsing() { 9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert MeasureFormat curFmt = MeasureFormat.getCurrencyFormat(new ULocale("en_US")); 9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] formats = { 9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "$1,234.56", // string to be parsed 9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "USD1,234.56", 9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "US dollars1,234.56", 9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234.56 US dollars" 9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < formats.length; ++i) { 9167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String stringToBeParsed = formats[i]; 9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount parsedVal = (CurrencyAmount)curFmt.parseObject(stringToBeParsed); 9187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number val = parsedVal.getNumber(); 9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!val.equals(new BigDecimal("1234.56"))) { 9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number. val=" + val); 9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!parsedVal.getCurrency().equals(Currency.getInstance("USD"))) { 9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the currency"); 9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse FAILED: " + e.toString()); 9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestDecimalFormatCurrencyParse() { 9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Locale.US 9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer pat = new StringBuffer(""); 9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char currency = 0x00A4; 9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // "\xA4#,##0.00;-\xA4#,##0.00" 9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat.append(currency).append(currency).append(currency).append("#,##0.00;-").append(currency).append(currency).append(currency).append("#,##0.00"); 9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pat.toString(), sym); 9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] DATA = { 9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the data are: 9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // string to be parsed, the parsed result (number) 9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$1.00", "1"}, 9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"USD1.00", "1"}, 9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 US dollar", "1"}, 9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"$1,234.56", "1234.56"}, 9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"USD1,234.56", "1234.56"}, 9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1,234.56 US dollar", "1234.56"}, 9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < DATA.length; ++i) { 9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String stringToBeParsed = DATA[i][0]; 9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double parsedResult = Double.parseDouble(DATA[i][1]); 9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = fmt.parse(stringToBeParsed); 9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (num.doubleValue() != parsedResult) { 9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL parse: Expected " + parsedResult); 9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAILED, DecimalFormat parse currency: " + e.toString()); 9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test localized currency patterns. 9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrency() { 9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] DATA = { 9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "fr", "CA", "", "1,50\u00a0$", 9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "de", "DE", "", "1,50\u00a0\u20AC", 9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "de", "DE", "PREEURO", "1,50\u00a0DM", 9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "fr", "FR", "", "1,50\u00a0\u20AC", 9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "fr", "FR", "PREEURO", "1,50\u00a0F", 9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; i+=4) { 9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale locale = new Locale(DATA[i], DATA[i+1], DATA[i+2]); 9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); 9787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = fmt.format(1.50); 9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (s.equals(DATA[i+3])) { 9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: 1.50 x " + locale + " => " + s); 9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("FAIL: 1.50 x " + locale + " => " + s + 9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expected " + DATA[i+3]); 9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // format currency with CurrencyAmount 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 9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency curr = Currency.getInstance(locale); 9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("\nName of the currency is: " + curr.getName(locale, Currency.LONG_NAME, new boolean[] {false})); 9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount cAmt = new CurrencyAmount(1.5, curr); 9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("CurrencyAmount object's hashCode is: " + cAmt.hashCode()); //cover hashCode 9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); 9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String sCurr = fmt.format(cAmt); 9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (sCurr.equals(DATA[i+3])) { 9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: 1.50 x " + locale + " => " + sCurr); 10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: 1.50 x " + locale + " => " + sCurr + 10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expected " + DATA[i+3]); 10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //Cover MeasureFormat.getCurrencyFormat() 10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale save = ULocale.getDefault(); 10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.setDefault(ULocale.US); 10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert MeasureFormat curFmt = MeasureFormat.getCurrencyFormat(); 10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String strBuf = curFmt.format(new CurrencyAmount(new Float(1234.56), Currency.getInstance("USD"))); 10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount parsedVal = (CurrencyAmount)curFmt.parseObject(strBuf); 10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number val = parsedVal.getNumber(); 10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!val.equals(new BigDecimal("1234.56"))) { 10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the number. val=" + val); 10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!parsedVal.getCurrency().equals(Currency.getInstance("USD"))) { 10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getCurrencyFormat of default locale (en_US) failed roundtripping the currency"); 10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (ParseException e) { 10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + e.getMessage()); 10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.setDefault(save); 10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyIsoPluralFormat() { 10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] DATA = { 10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the data are: 10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // locale, 10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency amount to be formatted, 10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // currency ISO code to be formatted, 10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // format result using CURRENCYSTYLE, 10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // format result using ISOCURRENCYSTYLE, 10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // format result using PLURALCURRENCYSTYLE, 10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollars"}, 10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dollars"}, 10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en_US", "-1234.56", "USD", "-$1,234.56", "-USD1,234.56", "-1,234.56 US dollars"}, 1040bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"zh_CN", "1", "USD", "US$1.00", "USD1.00", "1.00美元"}, 1041bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"zh_CN", "1234.56", "USD", "US$1,234.56", "USD1,234.56", "1,234.56美元"}, 1042bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"zh_CN", "1", "CNY", "¥1.00", "CNY1.00", "1.00人民币"}, 1043bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"zh_CN", "1234.56", "CNY", "¥1,234.56", "CNY1,234.56", "1,234.56人民币"}, 1044bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"ru_RU", "1", "RUB", "1,00 \u20BD", "1,00 RUB", "1,00 российского рубля"}, 1045bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"ru_RU", "2", "RUB", "2,00 \u20BD", "2,00 RUB", "2,00 российского рубля"}, 1046bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"ru_RU", "5", "RUB", "5,00 \u20BD", "5,00 RUB", "5,00 российского рубля"}, 10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test locale without currency information 10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"root", "-1.23", "USD", "-US$ 1.23", "-USD 1.23", "-1.23 USD"}, 10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik 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 10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"root@numbers=arab", "-1.23", "USD", "\u200F-US$ ١٫٢٣", "\u200F-USD ١٫٢٣", "\u200F-١٫٢٣ USD"}, // ensure that the root locale is still used with modifiers 1051bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"es_AR", "1", "INR", "INR\u00A01,00", "INR\u00A01,00", "1,00 rupia india"}, 10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"ar_EG", "1", "USD", "US$ ١٫٠٠", "USD ١٫٠٠", "١٫٠٠ دولار أمريكي"}, 10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 10557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; ++i) { 10567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int k = NumberFormat.CURRENCYSTYLE; 10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert k <= NumberFormat.PLURALCURRENCYSTYLE; 10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ++k) { 10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // k represents currency format style. 10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( k != NumberFormat.CURRENCYSTYLE && 10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert k != NumberFormat.ISOCURRENCYSTYLE && 10627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert k != NumberFormat.PLURALCURRENCYSTYLE ) { 10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String localeString = DATA[i][0]; 10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double numberToBeFormat = new Double(DATA[i][1]); 10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String currencyISOCode = DATA[i][2]; 10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = new ULocale(localeString); 10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat numFmt = NumberFormat.getInstance(locale, k); 10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numFmt.setCurrency(Currency.getInstance(currencyISOCode)); 10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String strBuf = numFmt.format(numberToBeFormat); 10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int resultDataIndex = k-1; 10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( k == NumberFormat.CURRENCYSTYLE ) { 10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert resultDataIndex = k+2; 10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][resultDataIndex] is the currency format result 10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // using 'k' currency style. 10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String formatResult = DATA[i][resultDataIndex]; 10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!strBuf.equals(formatResult)) { 10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected " + formatResult + " actual: " + strBuf); 10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test parsing, and test parsing for all currency formats. 10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int j = 3; j < 6; ++j) { 10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][3] is the currency format result using 10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // CURRENCYSTYLE formatter. 10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][4] is the currency format result using 10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // ISOCURRENCYSTYLE formatter. 10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DATA[i][5] is the currency format result using 10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // PLURALCURRENCYSTYLE formatter. 10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String oneCurrencyFormatResult = DATA[i][j]; 10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number val = numFmt.parse(oneCurrencyFormatResult); 10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (val.doubleValue() != numberToBeFormat.doubleValue()) { 10947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getCurrencyFormat of locale " + localeString + " failed roundtripping the number. val=" + val + "; expected: " + numberToBeFormat); 10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (ParseException e) { 10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + e.getMessage()); 11007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestMiscCurrencyParsing() { 11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] DATA = { 11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // each has: string to be parsed, parsed position, error position 11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 ", "0", "4"}, 11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 UAE dirha", "0", "4"}, 11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 us dollar", "14", "-1"}, 11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 US DOLLAR", "14", "-1"}, 11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"1.00 usd", "0", "4"}, 11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = new ULocale("en_US"); 11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; ++i) { 11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String stringToBeParsed = DATA[i][0]; 11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int parsedPosition = Integer.parseInt(DATA[i][1]); 11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int errorIndex = Integer.parseInt(DATA[i][2]); 11207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat numFmt = NumberFormat.getInstance(locale, NumberFormat.CURRENCYSTYLE); 11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition parsePosition = new ParsePosition(0); 11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number val = numFmt.parse(stringToBeParsed, parsePosition); 11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (parsePosition.getIndex() != parsedPosition || 11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parsePosition.getErrorIndex() != errorIndex) { 11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse failed. expected error position: " + errorIndex + "; actual: " + parsePosition.getErrorIndex()); 11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse failed. expected position: " + parsedPosition +"; actual: " + parsePosition.getIndex()); 11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (parsePosition.getErrorIndex() == -1 && 11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert val.doubleValue() != 1.00) { 11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse failed. expected 1.00, actual:" + val); 11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseCurrency() { 11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class ParseCurrencyItem { 11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String localeString; 11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String descrip; 11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String currStr; 11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int numExpectPos; 11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int numExpectVal; 11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int curExpectPos; 11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int curExpectVal; 11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String curExpectCurr; 11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParseCurrencyItem(String locStr, String desc, String curr, int numExPos, int numExVal, int curExPos, int curExVal, String curExCurr) { 11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert localeString = locStr; 11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert descrip = desc; 11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert currStr = curr; 11507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numExpectPos = numExPos; 11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numExpectVal = numExVal; 11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert curExpectPos = curExPos; 11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert curExpectVal = curExVal; 11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert curExpectCurr = curExCurr; 11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getLocaleString() { return localeString; } 11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getDescrip() { return descrip; } 11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getCurrStr() { return currStr; } 11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getNumExpectPos() { return numExpectPos; } 11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getNumExpectVal() { return numExpectVal; } 11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getCurExpectPos() { return curExpectPos; } 11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getCurExpectVal() { return curExpectVal; } 11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getCurExpectCurr() { return curExpectCurr; } 11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final ParseCurrencyItem[] parseCurrencyItems = { 11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "dollars2", "$2.00", 5, 2, 5, 2, "USD" ), 11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "dollars4", "$4", 2, 4, 2, 4, "USD" ), 11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "dollars9", "9\u00A0$", 0, 0, 0, 0, "" ), 11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "pounds3", "\u00A33.00", 0, 0, 5, 3, "GBP" ), 11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "pounds5", "\u00A35", 0, 0, 2, 5, "GBP" ), 11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "pounds7", "7\u00A0\u00A3", 0, 0, 0, 0, "" ), 11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_US", "euros8", "\u20AC8", 0, 0, 2, 8, "EUR" ), 11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "pounds3", "\u00A33.00", 5, 3, 5, 3, "GBP" ), 11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "pounds5", "\u00A35", 2, 5, 2, 5, "GBP" ), 11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "pounds7", "7\u00A0\u00A3", 0, 0, 0, 0, "" ), 11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "euros4", "4,00\u00A0\u20AC", 0, 0, 0, 0, "" ), 11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "euros6", "6\u00A0\u20AC", 0, 0, 0, 0, "" ), 11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "euros8", "\u20AC8", 0, 0, 2, 8, "EUR" ), 11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "en_GB", "dollars4", "$4", 0, 0, 2, 4, "USD" ), 11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "fr_FR", "euros4", "4,00\u00A0\u20AC", 6, 4, 6, 4, "EUR" ), 11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "fr_FR", "euros6", "6\u00A0\u20AC", 3, 6, 3, 6, "EUR" ), 11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "fr_FR", "euros8", "\u20AC8", 0, 0, 0, 0, "" ), 11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "fr_FR", "dollars2", "$2.00", 0, 0, 0, 0, "" ), 11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new ParseCurrencyItem( "fr_FR", "dollars4", "$4", 0, 0, 0, 0, "" ), 11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (ParseCurrencyItem item: parseCurrencyItems) { 11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String localeString = item.getLocaleString(); 11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale uloc = new ULocale(localeString); 11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = null; 11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = NumberFormat.getCurrencyInstance(uloc); 11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getCurrencyInstance fails for locale " + localeString); 11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String currStr = item.getCurrStr(); 11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition parsePos = new ParsePosition(0); 12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number numVal = fmt.parse(currStr, parsePos); 12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( parsePos.getIndex() != item.getNumExpectPos() || (numVal != null && numVal.intValue() != item.getNumExpectVal()) ) { 12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (numVal != null) { 12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() + 12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() + 12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", get " + parsePos.getIndex() + "/" + numVal.intValue() ); 12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() + 12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() + 12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", get " + parsePos.getIndex() + "/(NULL)" ); 12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parsePos.setIndex(0); 12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount currAmt = fmt.parseCurrency(currStr, parsePos); 12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( parsePos.getIndex() != item.getCurExpectPos() || (currAmt != null && (currAmt.getNumber().intValue() != item.getCurExpectVal() || 12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert currAmt.getCurrency().getCurrencyCode().compareTo(item.getCurExpectCurr()) != 0)) ) { 12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (currAmt != null) { 12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getCurrencyInstance parseCurrency " + localeString + "/" + item.getDescrip() + 12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expect pos/val/curr " + item.getCurExpectPos() + "/" + item.getCurExpectVal() + "/" + item.getCurExpectCurr() + 12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", get " + parsePos.getIndex() + "/" + currAmt.getNumber().intValue() + "/" + currAmt.getCurrency().getCurrencyCode() ); 12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getCurrencyInstance parseCurrency " + localeString + "/" + item.getDescrip() + 12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expect pos/val/curr " + item.getCurExpectPos() + "/" + item.getCurExpectVal() + "/" + item.getCurExpectCurr() + 12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", get " + parsePos.getIndex() + "/(NULL)" ); 12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test the Currency object handling, new as of ICU 2.2. 12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyObject() { 12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = 12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getCurrencyInstance(Locale.US); 12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, null, 1234.56, "$1,234.56"); 12397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.FRANCE), 12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "\u20AC1,234.56"); // Euro 12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.JAPAN), 12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "\u00A51,235"); // Yen 12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(new Locale("fr", "CH", "")), 12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "CHF1,234.56"); // no more 0.05 rounding here, see cldrbug 5548 12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.US), 12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "$1,234.56"); 12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = NumberFormat.getCurrencyInstance(Locale.FRANCE); 12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, null, 1234.56, "1 234,56 \u20AC"); 12557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.JAPAN), 12577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "1 235 JPY"); // Yen 12587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(new Locale("fr", "CH", "")), 12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "1 234,56 CHF"); // no more rounding here, see cldrbug 5548 12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.US), 12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "1 234,56 $US"); 12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectCurrency(fmt, Currency.getInstance(Locale.FRANCE), 12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1234.56, "1 234,56 \u20AC"); // Euro 12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCompatibleCurrencies() { 12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = 12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getCurrencyInstance(Locale.US); 12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectParseCurrency(fmt, Currency.getInstance(Locale.JAPAN), "\u00A51,235"); // Yen half-width 12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectParseCurrency(fmt, Currency.getInstance(Locale.JAPAN), "\uFFE51,235"); // Yen full-wdith 12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyPatterns() { 12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int i; 12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale[] locs = NumberFormat.getAvailableLocales(); 12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (i=0; i<locs.length; ++i) { 12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = NumberFormat.getCurrencyInstance(locs[i]); 12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Make sure currency formats do not have a variable number 12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // of fraction digits 12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int min = nf.getMinimumFractionDigits(); 12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int max = nf.getMaximumFractionDigits(); 12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (min != max) { 12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String a = nf.format(1.0); 12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String b = nf.format(1.125); 12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + locs[i] + 12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " min fraction digits != max fraction digits; "+ 12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "x 1.0 => " + a + 12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "; x 1.125 => " + b); 12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Make sure EURO currency formats have exactly 2 fraction digits 12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (nf instanceof DecimalFormat) { 12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency curr = ((DecimalFormat) nf).getCurrency(); 12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (curr != null && "EUR".equals(curr.getCurrencyCode())) { 12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (min != 2 || max != 2) { 12997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String a = nf.format(1.0); 13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + locs[i] + 13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " is a EURO format but it does not have 2 fraction digits; "+ 13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "x 1.0 => " + 13037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert a); 13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Do rudimentary testing of parsing. 13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParse() { 13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String arg = "0.0"; 13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat format = new DecimalFormat("00"); 13167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double aNumber = 0l; 13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert aNumber = format.parse(arg).doubleValue(); 13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert System.out.println(e); 13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("parse(" + arg + ") = " + aNumber); 13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test proper rounding by the format method. 13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRounding487() { 13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = NumberFormat.getInstance(); 13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingTest(nf, 0.00159999, 4, "0.0016"); 13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingTest(nf, 0.00995, 4, "0.01"); 13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingTest(nf, 12.3995, 3, "12.4"); 13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingTest(nf, 12.4999, 0, "12"); 13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingTest(nf, - 19.5, 0, "-20"); 13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test the functioning of the secondary grouping value. 13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSecondaryGrouping() { 13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat f = new DecimalFormat("#,##,###", US); 13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(f, 123456789L, "12,34,56,789"); 13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(f, "#,##,###"); 13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.applyPattern("#,###"); 13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setSecondaryGroupingSize(4); 13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(f, 123456789L, "12,3456,789"); 13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(f, "#,####,###"); 13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat g = NumberFormat.getInstance(new Locale("hi", "IN")); 13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String out = ""; 13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long l = 1876543210L; 13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert out = g.format(l); 13617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect "1,87,65,43,210", but with Hindi digits 13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 01234567890123 13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean ok = true; 13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (out.length() != 14) { 13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ok = false; 13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < out.length(); ++i) { 13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean expectGroup = false; 13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert switch (i) { 13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 1 : 13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 4 : 13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 7 : 13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 10 : 13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectGroup = true; 13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Later -- fix this to get the actual grouping 13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // character from the resource bundle. 13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean isGroup = (out.charAt(i) == 0x002C); 13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (isGroup != expectGroup) { 13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ok = false; 13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!ok) { 13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL Expected "+ l + " x hi_IN . \"1,87,65,43,210\" (with Hindi digits), got \"" 13897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + out + "\""); 13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok " + l + " x hi_IN . \"" + out + "\""); 13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void roundingTest(NumberFormat nf, double x, int maxFractionDigits, final String expected) { 13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setMaximumFractionDigits(maxFractionDigits); 13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String out = nf.format(x); 13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(x + " formats with " + maxFractionDigits + " fractional digits to " + out); 13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!out.equals(expected)) 14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Expected " + expected); 14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Upgrade to alphaWorks 14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestExponent() { 14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt1 = new DecimalFormat("0.###E0", US); 14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt2 = new DecimalFormat("0.###E+0", US); 14107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int n = 1234; 14117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt1, n, "1.234E3"); 14127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt2, n, "1.234E+3"); 14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt1, "1.234E+3", n); // Either format should parse "E+3" 14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Upgrade to alphaWorks 14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestScientific() { 14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test pattern round-trip 14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String PAT[] = { "#E0", "0.####E0", "00.000E00", "##0.####E000", "0.###E0;[0.###E0]" }; 14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int PAT_length = PAT.length; 14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int DIGITS[] = { 14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // min int, max int, min frac, max frac 14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, 1, 0, 0, // "#E0" 14307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1, 1, 0, 4, // "0.####E0" 14317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2, 2, 3, 3, // "00.000E00" 14327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1, 3, 0, 4, // "##0.####E000" 14337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1, 1, 0, 3, // "0.###E0;[0.###E0]" 14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < PAT_length; ++i) { 14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = PAT[i]; 14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = new DecimalFormat(pat, US); 14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat2 = df.toPattern(); 14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pat.equals(pat2)) { 14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok Pattern rt \"" + pat + "\" . \"" + pat2 + "\""); 14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL Pattern rt \"" + pat + "\" . \"" + pat2 + "\""); 14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Make sure digit counts match what we expect 14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (df.getMinimumIntegerDigits() != DIGITS[4 * i] 14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert || df.getMaximumIntegerDigits() != DIGITS[4 * i + 1] 14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert || df.getMinimumFractionDigits() != DIGITS[4 * i + 2] 14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert || df.getMaximumFractionDigits() != DIGITS[4 * i + 3]) { 14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL \""+ pat+ "\" min/max int; min/max frac = " 14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + df.getMinimumIntegerDigits() + "/" 14517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + df.getMaximumIntegerDigits() + ";" 14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + df.getMinimumFractionDigits() + "/" 14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + df.getMaximumFractionDigits() + ", expect " 14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + DIGITS[4 * i] + "/" 14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + DIGITS[4 * i + 1] + ";" 14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + DIGITS[4 * i + 2] + "/" 14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + DIGITS[4 * i + 3]); 14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("#E0", US), 12345.0, "1.2345E4"); 14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("0E0", US), 12345.0, "1E4"); 14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // pattern of NumberFormat.getScientificInstance(Locale.US) = "0.######E0" not "#E0" 14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // so result = 1.234568E4 not 1.2345678901E4 14667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //when the pattern problem is finalized, delete comment mark'//' 14677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //of the following code 14687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(NumberFormat.getScientificInstance(Locale.US), 12345.678901, "1.2345678901E4"); 14697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Testing NumberFormat.getScientificInstance(ULocale) ..."); 14707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(NumberFormat.getScientificInstance(ULocale.US), 12345.678901, "1.2345678901E4"); 14717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("##0.###E0", US), 12345.0, "12.34E3"); 14737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("##0.###E0", US), 12345.00001, "12.35E3"); 14747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("##0.####E0", US), 12345, "12.345E3"); 14757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // pattern of NumberFormat.getScientificInstance(Locale.US) = "0.######E0" not "#E0" 14777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // so result = 1.234568E4 not 1.2345678901E4 14787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(NumberFormat.getScientificInstance(Locale.FRANCE), 12345.678901, "1,2345678901E4"); 14797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Testing NumberFormat.getScientificInstance(ULocale) ..."); 14807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(NumberFormat.getScientificInstance(ULocale.FRANCE), 12345.678901, "1,2345678901E4"); 14817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 14827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("##0.####E0", US), 789.12345e-9, "789.12E-9"); 14837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("##0.####E0", US), 780.e-9, "780E-9"); 14847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat(".###E0", US), 45678.0, ".457E5"); 14857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(".###E0", US), 0, ".0E0"); 14867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 14877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat[] { new DecimalFormat("#E0", US), 14887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("##E0", US), 14897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("####E0", US), 14907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("0E0", US), 14917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("00E0", US), 14927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("000E0", US), 14937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 14947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Long(45678000), 14957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new String[] { "4.5678E7", 14967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "45.678E6", 14977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "4567.8E4", 14987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "5E7", 14997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "46E6", 15007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "457E5", 15017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 15027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ); 15037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! Unroll this test into individual tests below... 15057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 15077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("#E0", US), 45678000, "4.5678E7"); 15087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("##E0", US), 45678000, "45.678E6"); 15097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("####E0", US), 45678000, "4567.8E4"); 15107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("0E0", US), 45678000, "5E7"); 15117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("00E0", US), 45678000, "46E6"); 15127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("000E0", US), 45678000, "457E5"); 15137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 15147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("###E0", US, status), 15157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Object[] { new Double(0.0000123), "12.3E-6", 15167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(0.000123), "123E-6", 15177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(0.00123), "1.23E-3", 15187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(0.0123), "12.3E-3", 15197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(0.123), "123E-3", 15207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(1.23), "1.23E0", 15217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(12.3), "12.3E0", 15227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(123), "123E0", 15237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Double(1230), "1.23E3", 15247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }); 15257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! Unroll this test into individual tests below... 15277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 15297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 0.0000123, "12.3E-6"); 15307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 0.000123, "123E-6"); 15317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 0.00123, "1.23E-3"); 15327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 0.0123, "12.3E-3"); 15337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 0.123, "123E-3"); 15347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 1.23, "1.23E0"); 15357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 12.3, "12.3E0"); 15367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 123.0, "123E0"); 15377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("###E0", US), 1230.0, "1.23E3"); 15387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 15397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(new DecimalFormat("0.#E+00", US, status), 15407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Object[] { new Double(0.00012), "1.2E-04", 15417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Long(12000), "1.2E+04", 15427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }); 15437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! Unroll this test into individual tests below... 15457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ! 15467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 15477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("0.#E+00", US), 0.00012, "1.2E-04"); 15487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("0.#E+00", US), 12000, "1.2E+04"); 15497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 15507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 15527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Upgrade to alphaWorks 15537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 15547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestPad() { 15557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 15577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("*^##.##", US), 0, "^^^^0"); 15587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("*^##.##", US), -1.3, "^-1.3"); 15597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2( 15607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US), 15617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, 15627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.0E0______ g-m/s^2"); 15637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect( 15647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US), 15657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1.0 / 3, 15667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "333.333E-3_ g-m/s^2"); 15677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US), 0, "0.0______ g-m/s^2"); 15687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect( 15697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat("##0.0####*_ 'g-m/s^2'", US), 15707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1.0 / 3, 15717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.33333__ g-m/s^2"); 15727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test padding before a sign 15747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String formatStr = "*x#,###,###,##0.0#;*x(###,###,##0.0#)"; 15757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -10, "xxxxxxxxxx(10.0)"); 15767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -1000, "xxxxxxx(1,000.0)"); 15777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -1000000, "xxx(1,000,000.0)"); 15787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -100.37, "xxxxxxxx(100.37)"); 15797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -10456.37, "xxxxx(10,456.37)"); 15807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -1120456.37, "xx(1,120,456.37)"); 15817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -112045600.37, "(112,045,600.37)"); 15827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), -1252045600.37, "(1,252,045,600.37)"); 15837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 10, "xxxxxxxxxxxx10.0"); 15857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 1000, "xxxxxxxxx1,000.0"); 15867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 1000000, "xxxxx1,000,000.0"); 15877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 100.37, "xxxxxxxxxx100.37"); 15887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 10456.37, "xxxxxxx10,456.37"); 15897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 1120456.37, "xxxx1,120,456.37"); 15907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 112045600.37, "xx112,045,600.37"); 15917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr, US), 10252045600.37, "10,252,045,600.37"); 15927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 15937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test padding between a sign and a number 15947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String formatStr2 = "#,###,###,##0.0#*x;(###,###,##0.0#*x)"; 15957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -10, "(10.0xxxxxxxxxx)"); 15967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -1000, "(1,000.0xxxxxxx)"); 15977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -1000000, "(1,000,000.0xxx)"); 15987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -100.37, "(100.37xxxxxxxx)"); 15997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -10456.37, "(10,456.37xxxxx)"); 16007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -1120456.37, "(1,120,456.37xx)"); 16017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -112045600.37, "(112,045,600.37)"); 16027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), -1252045600.37, "(1,252,045,600.37)"); 16037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 10, "10.0xxxxxxxxxxxx"); 16057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 1000, "1,000.0xxxxxxxxx"); 16067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 1000000, "1,000,000.0xxxxx"); 16077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 100.37, "100.37xxxxxxxxxx"); 16087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 10456.37, "10,456.37xxxxxxx"); 16097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 1120456.37, "1,120,456.37xxxx"); 16107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 112045600.37, "112,045,600.37xx"); 16117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(new DecimalFormat(formatStr2, US), 10252045600.37, "10,252,045,600.37"); 16127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //testing the setPadCharacter(UnicodeString) and getPadCharacterString() 16147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("#", US); 16157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char padString = 'P'; 16167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadCharacter(padString); 16177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "*P##.##", DecimalFormat.PAD_BEFORE_PREFIX, 5, padString); 16187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadCharacter('^'); 16197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "*^#", DecimalFormat.PAD_BEFORE_PREFIX, 1, '^'); 16207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //commented untill implementation is complete 16217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* fmt.setPadCharacter((UnicodeString)"^^^"); 16227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "*^^^#", DecimalFormat.kPadBeforePrefix, 3, (UnicodeString)"^^^"); 16237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert padString.remove(); 16247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert padString.append((UChar)0x0061); 16257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert padString.append((UChar)0x0302); 16267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadCharacter(padString); 16277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UChar patternChars[]={0x002a, 0x0061, 0x0302, 0x0061, 0x0302, 0x0023, 0x0000}; 16287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UnicodeString pattern(patternChars); 16297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, pattern , DecimalFormat.kPadBeforePrefix, 4, padString); 16307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 16317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 16327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 16347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Upgrade to alphaWorks 16357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 16367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestPatterns2() { 16377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 16387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("#", US); 16397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char hat = 0x005E; /*^*/ 16417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "*^#", DecimalFormat.PAD_BEFORE_PREFIX, 1, hat); 16437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "$*^#", DecimalFormat.PAD_AFTER_PREFIX, 2, hat); 16447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "#*^", DecimalFormat.PAD_BEFORE_SUFFIX, 1, hat); 16457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "#$*^", DecimalFormat.PAD_AFTER_SUFFIX, 2, hat); 16467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "$*^$#", -1); 16477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "#$*^$", -1); 16487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "'pre'#,##0*x'post'", DecimalFormat.PAD_BEFORE_SUFFIX, 12, (char) 0x0078 /*x*/); 16497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "''#0*x", DecimalFormat.PAD_BEFORE_SUFFIX, 3, (char) 0x0078 /*x*/); 16507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, "'I''ll'*a###.##", DecimalFormat.PAD_AFTER_PREFIX, 10, (char) 0x0061 /*a*/); 16517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.applyPattern("AA#,##0.00ZZ"); 16537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadCharacter(hat); 16547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(10); 16567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadPosition(DecimalFormat.PAD_BEFORE_PREFIX); 16587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "*^AA#,##0.00ZZ"); 16597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadPosition(DecimalFormat.PAD_BEFORE_SUFFIX); 16617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA#,##0.00*^ZZ"); 16627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadPosition(DecimalFormat.PAD_AFTER_SUFFIX); 16647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA#,##0.00ZZ*^"); 16657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 12 3456789012 16677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String exp = "AA*^#,##0.00ZZ"; 16687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(12); 16697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setPadPosition(DecimalFormat.PAD_AFTER_PREFIX); 16707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, exp); 16717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(13); 16737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 12 34567890123 16747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA*^##,##0.00ZZ"); 16757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(14); 16777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 12 345678901234 16787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA*^###,##0.00ZZ"); 16797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(15); 16817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 12 3456789012345 16827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA*^####,##0.00ZZ"); // This is the interesting case 16837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setFormatWidth(16); 16857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 12 34567890123456 16867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPat(fmt, "AA*^#,###,##0.00ZZ"); 16877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 16887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRegistration() { 16907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final ULocale SRC_LOC = ULocale.FRANCE; 16917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final ULocale SWAP_LOC = ULocale.US; 16927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestFactory extends SimpleNumberFormatFactory { 16947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat currencyStyle; 16957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 16967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestFactory() { 16977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert super(SRC_LOC, true); 16987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert currencyStyle = NumberFormat.getIntegerInstance(SWAP_LOC); 16997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 17027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public NumberFormat createFormat(ULocale loc, int formatType) { 17037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (formatType == FORMAT_CURRENCY) { 17047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return currencyStyle; 17057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 17077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f0 = NumberFormat.getIntegerInstance(SWAP_LOC); 17117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f1 = NumberFormat.getIntegerInstance(SRC_LOC); 17127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f2 = NumberFormat.getCurrencyInstance(SRC_LOC); 17137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Object key = NumberFormat.registerFactory(new TestFactory()); 17147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f3 = NumberFormat.getCurrencyInstance(SRC_LOC); 17157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f4 = NumberFormat.getIntegerInstance(SRC_LOC); 17167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.unregister(key); // restore for other tests 17177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat f5 = NumberFormat.getCurrencyInstance(SRC_LOC); 17187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert float n = 1234.567f; 17207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f0 swap int: " + f0.format(n)); 17217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f1 src int: " + f1.format(n)); 17227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f2 src cur: " + f2.format(n)); 17237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f3 reg cur: " + f3.format(n)); 17247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f4 reg int: " + f4.format(n)); 17257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("f5 unreg cur: " + f5.format(n)); 17267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!f3.format(n).equals(f0.format(n))) { 17287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("registered service did not match"); 17297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!f4.format(n).equals(f1.format(n))) { 17317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("registered service did not inherit"); 17327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!f5.format(n).equals(f2.format(n))) { 17347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("unregistered service did not match original"); 17357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestScientific2() { 17397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // jb 2552 17407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = (DecimalFormat)NumberFormat.getCurrencyInstance(); 17417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = new Double(12.34); 17427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, num, "$12.34"); 17437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setScientificNotation(true); 17447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, num, "$1.23E1"); 17457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setScientificNotation(false); 17467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, num, "$12.34"); 17477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestScientificGrouping() { 17507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // jb 2552 17517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("###.##E0"); 17527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, .01234, "12.3E-3"); 17537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, .1234, "123E-3"); 17547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, 1.234, "1.23E0"); 17557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, 12.34, "12.3E0"); 17567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, 123.4, "123E0"); 17577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, 1234, "1.23E3"); 17587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // additional coverage tests 17617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // sigh, can't have static inner classes, why not? 17637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static final class PI extends Number { 17657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 17667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * For serialization 17677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 17687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final long serialVersionUID = -305601227915602172L; 17697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private PI() {} 17717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 17727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int intValue() { return (int)Math.PI; } 17737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 17747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public long longValue() { return (long)Math.PI; } 17757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 17767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public float floatValue() { return (float)Math.PI; } 17777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 17787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public double doubleValue() { return Math.PI; } 17797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 17807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public byte byteValue() { return (byte)Math.PI; } 17817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 17827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public short shortValue() { return (short)Math.PI; } 17837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final Number INSTANCE = new PI(); 17857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCoverage() { 17887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getNumberInstance(); // default locale 17897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(fmt.format(new BigInteger("1234567890987654321234567890987654321", 10))); 17907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = NumberFormat.getScientificInstance(); // default locale 17927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(fmt.format(PI.INSTANCE)); 17947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 17957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 17967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(fmt.format("12345")); 17977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("numberformat of string did not throw exception"); 17987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 17997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (Exception e) { 18007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("PASS: numberformat of string failed as expected"); 18017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int hash = fmt.hashCode(); 18047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("hash code " + hash); 18057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("compare to string returns: " + fmt.equals("")); 18077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // For ICU 2.6 - alan 18097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 18107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = new DecimalFormat("'*&'' '\u00A4' ''&*' #,##0.00", US); 18117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setCurrency(Currency.getInstance("INR")); 18127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, 1.0, "*&' \u20B9 '&* 1.00"); 18137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, -2.0, "-*&' \u20B9 '&* 2.00"); 18147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.applyPattern("#,##0.00 '*&'' '\u00A4' ''&*'"); 18157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, 2.0, "2.00 *&' \u20B9 '&*"); 18167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, -1.0, "-1.00 *&' \u20B9 '&*"); 18177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert java.math.BigDecimal r; 18197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert r = df.getRoundingIncrement(); 18217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (r != null) { 18227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: rounding = " + r + ", expect null"); 18237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (df.isScientificNotation()) { 18267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: isScientificNotation = true, expect false"); 18277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.applyPattern("0.00000"); 18307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setScientificNotation(true); 18317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!df.isScientificNotation()) { 18327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: isScientificNotation = false, expect true"); 18337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setMinimumExponentDigits((byte)2); 18357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (df.getMinimumExponentDigits() != 2) { 18367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getMinimumExponentDigits = " + 18377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.getMinimumExponentDigits() + ", expect 2"); 18387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setExponentSignAlwaysShown(true); 18407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!df.isExponentSignAlwaysShown()) { 18417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: isExponentSignAlwaysShown = false, expect true"); 18427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setSecondaryGroupingSize(0); 18447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (df.getSecondaryGroupingSize() != 0) { 18457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: getSecondaryGroupingSize = " + 18467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.getSecondaryGroupingSize() + ", expect 0"); 18477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, 3.14159, "3.14159E+00"); 18497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DecimalFormatSymbols#getInstance 18517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decsym1 = DecimalFormatSymbols.getInstance(); 18527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decsym2 = new DecimalFormatSymbols(); 18537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!decsym1.equals(decsym2)) { 18547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: DecimalFormatSymbols returned by getInstance()" + 18557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "does not match new DecimalFormatSymbols()."); 18567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert decsym1 = DecimalFormatSymbols.getInstance(Locale.JAPAN); 18587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert decsym2 = DecimalFormatSymbols.getInstance(ULocale.JAPAN); 18597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!decsym1.equals(decsym2)) { 18607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: DecimalFormatSymbols returned by getInstance(Locale.JAPAN)" + 18617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "does not match the one returned by getInstance(ULocale.JAPAN)."); 18627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DecimalFormatSymbols#getAvailableLocales/#getAvailableULocales 18657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale[] allLocales = DecimalFormatSymbols.getAvailableLocales(); 18667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (allLocales.length == 0) { 18677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Got a empty list for DecimalFormatSymbols.getAvailableLocales"); 18687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 18697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("PASS: " + allLocales.length + 18707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " available locales returned by DecimalFormatSymbols.getAvailableLocales"); 18717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale[] allULocales = DecimalFormatSymbols.getAvailableULocales(); 18737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (allULocales.length == 0) { 18747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Got a empty list for DecimalFormatSymbols.getAvailableLocales"); 18757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 18767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("PASS: " + allULocales.length + 18777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " available locales returned by DecimalFormatSymbols.getAvailableULocales"); 18787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestWhiteSpaceParsing() { 18827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(Locale.US); 18837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("a b#0c ", US); 18847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int n = 1234; 18857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "a b1234c ", n); 18867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "a b1234c ", n); 18877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 18887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 18907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test currencies whose display name is a ChoiceFormat. 18917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 18927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestComplexCurrency() { 18937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // CLDR No Longer uses complex currency symbols. 18947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Skipping this test. 18957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Locale loc = new Locale("kn", "IN", ""); 18967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // NumberFormat fmt = NumberFormat.getCurrencyInstance(loc); 18977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 18987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect2(fmt, 1.0, "Re.\u00a01.00"); 18997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect(fmt, 1.001, "Re.\u00a01.00"); // tricky 19007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect2(fmt, 12345678.0, "Rs.\u00a01,23,45,678.00"); 19017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect2(fmt, 0.5, "Rs.\u00a00.50"); 19027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect2(fmt, -1.0, "-Re.\u00a01.00"); 19037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // expect2(fmt, -10.0, "-Rs.\u00a010.00"); 19047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyKeyword() { 19077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = new ULocale("th_TH@currency=QQQ"); 19087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat format = NumberFormat.getCurrencyInstance(locale); 19097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String result = format.format(12.34f); 19107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!"QQQ12.34".equals(result)) { 19117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("got unexpected currency: " + result); 19127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 19167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test alternate numbering systems 19177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 19187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestNumberingSystems() { 19197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestNumberingSystemItem { 19207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String localeName; 19217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final double value; 19227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final boolean isRBNF; 19237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String expectedResult; 19247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestNumberingSystemItem(String loc, double val, boolean rbnf, String exp) { 19267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert localeName = loc; 19277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = val; 19287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert isRBNF = rbnf; 19297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectedResult = exp; 19307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final TestNumberingSystemItem[] DATA = { 19347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "en_US@numbers=thai", 1234.567, false, "\u0e51,\u0e52\u0e53\u0e54.\u0e55\u0e56\u0e57" ), 19357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "en_US@numbers=thai", 1234.567, false, "\u0E51,\u0E52\u0E53\u0E54.\u0E55\u0E56\u0E57" ), 19367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "en_US@numbers=hebr", 5678.0, true, "\u05D4\u05F3\u05EA\u05E8\u05E2\u05F4\u05D7" ), 19377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "en_US@numbers=arabext", 1234.567, false, "\u06F1\u066c\u06F2\u06F3\u06F4\u066b\u06F5\u06F6\u06F7" ), 19387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "de_DE@numbers=foobar", 1234.567, false, "1.234,567" ), 19397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "ar_EG", 1234.567, false, "\u0661\u066c\u0662\u0663\u0664\u066b\u0665\u0666\u0667" ), 19407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "th_TH@numbers=traditional", 1234.567, false, "\u0E51,\u0E52\u0E53\u0E54.\u0E55\u0E56\u0E57" ), // fall back to native per TR35 19417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "ar_MA", 1234.567, false, "1.234,567" ), 19427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "en_US@numbers=hanidec", 1234.567, false, "\u4e00,\u4e8c\u4e09\u56db.\u4e94\u516d\u4e03" ), 19437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "ta_IN@numbers=native", 1234.567, false, "\u0BE7,\u0BE8\u0BE9\u0BEA.\u0BEB\u0BEC\u0BED" ), 19447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "ta_IN@numbers=traditional", 1235.0, true, "\u0BF2\u0BE8\u0BF1\u0BE9\u0BF0\u0BEB" ), 19457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "ta_IN@numbers=finance", 1234.567, false, "1,234.567" ), // fall back to default per TR35 19467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "zh_TW@numbers=native", 1234.567, false, "\u4e00,\u4e8c\u4e09\u56db.\u4e94\u516d\u4e03" ), 19477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "zh_TW@numbers=traditional", 1234.567, true, "\u4E00\u5343\u4E8C\u767E\u4E09\u5341\u56DB\u9EDE\u4E94\u516D\u4E03" ), 19487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestNumberingSystemItem( "zh_TW@numbers=finance", 1234.567, true, "\u58F9\u4EDF\u8CB3\u4F70\u53C3\u62FE\u8086\u9EDE\u4F0D\u9678\u67D2" ) 19497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 19507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 19527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (TestNumberingSystemItem item : DATA) { 19537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale loc = new ULocale(item.localeName); 19547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getInstance(loc); 19557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (item.isRBNF) { 19567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect3(fmt,item.value,item.expectedResult); 19577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 19587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt,item.value,item.expectedResult); 19597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 19617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1962e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín 1963e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín // Coverage tests for methods not being called otherwise. 1964e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín public void TestNumberingSystemCoverage() { 1965e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín // Test getAvaliableNames 1966e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín String[] availableNames = NumberingSystem.getAvailableNames(); 1967e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín if (availableNames == null || availableNames.length <= 0) { 1968e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín errln("ERROR: NumberingSystem.getAvailableNames() returned a null or empty array."); 1969e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín } else { 1970e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín boolean latnFound = false; 1971e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín for (String name : availableNames){ 1972e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín if ("latn".equals(name)) { 1973e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín latnFound = true; 1974e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín break; 1975e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín } 1976e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín } 1977e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín 1978e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín if (!latnFound) { 1979e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín errln("ERROR: 'latn' numbering system not found on NumberingSystem.getAvailableNames()."); 1980e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín } 1981e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín } 1982e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín 1983e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín // Test NumberingSystem.getInstance() 1984e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín NumberingSystem ns1 = NumberingSystem.getInstance(); 1985e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín if (ns1 == null || ns1.isAlgorithmic()) { 1986e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín errln("ERROR: NumberingSystem.getInstance() returned a null or invalid NumberingSystem"); 1987e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín } 1988e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín 1989e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín // Test NumberingSystem.getInstance(int,boolean,String) 1990e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín /* Parameters used: the ones used in the default constructor 1991e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín * radix = 10; 1992e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín * algorithmic = false; 1993e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín * desc = "0123456789"; 1994e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín */ 1995e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín NumberingSystem ns2 = NumberingSystem.getInstance(10, false, "0123456789"); 1996e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín if (ns2 == null || ns2.isAlgorithmic()) { 1997e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín errln("ERROR: NumberingSystem.getInstance(int,boolean,String) returned a null or invalid NumberingSystem"); 1998e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín } 1999e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín 2000e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín // Test NumberingSystem.getInstance(Locale) 2001e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín NumberingSystem ns3 = NumberingSystem.getInstance(Locale.ENGLISH); 2002e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín if (ns3 == null || ns3.isAlgorithmic()) { 2003e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín errln("ERROR: NumberingSystem.getInstance(Locale) returned a null or invalid NumberingSystem"); 2004e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín } 2005e32684d8bb58005d8188da8c732a4d407713f003Felipe Balbontín } 20067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void Test6816() { 20087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency cur1 = Currency.getInstance(new Locale("und", "PH")); 20097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nfmt = NumberFormat.getCurrencyInstance(new Locale("und", "PH")); 20117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decsym = ((DecimalFormat)nfmt).getDecimalFormatSymbols(); 20127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency cur2 = decsym.getCurrency(); 20137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( !cur1.getCurrencyCode().equals("PHP") || !cur2.getCurrencyCode().equals("PHP")) { 20157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Currencies should match PHP: cur1 = "+cur1.getCurrencyCode()+"; cur2 = "+cur2.getCurrencyCode()); 20167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestThreadedFormat() { 20217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class FormatTask implements Runnable { 20237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt; 20247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buf; 20257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean inc; 20267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert float num; 20277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FormatTask(DecimalFormat fmt, int index) { 20297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.fmt = fmt; 20307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.buf = new StringBuffer(); 20317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.inc = (index & 0x1) == 0; 20327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.num = inc ? 0 : 10000; 20337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void run() { 20367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (inc) { 20377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (num < 10000) { 20387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf.append(fmt.format(num) + "\n"); 20397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num += 3.14159; 20407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 20427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (num > 0) { 20437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert buf.append(fmt.format(num) + "\n"); 20447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num -= 3.14159; 20457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String result() { 20507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return buf.toString(); 20517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("0.####"); 20557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FormatTask[] tasks = new FormatTask[8]; 20567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < tasks.length; ++i) { 20577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tasks[i] = new FormatTask(fmt, i); 20587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestUtil.runUntilDone(tasks); 20617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 2; i < tasks.length; i++) { 20637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str1 = tasks[i].result(); 20647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str2 = tasks[i-2].result(); 20657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!str1.equals(str2)) { 20667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert System.out.println("mismatch at " + i); 20677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert System.out.println(str1); 20687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert System.out.println(str2); 20697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("decimal format thread mismatch"); 20707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 20727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str1 = str2; 20747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestPerMill() { 20787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("###.###\u2030"); 20797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("0.4857 x ###.###\u2030", 20807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "485.7\u2030", fmt.format(0.4857)); 20817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.ENGLISH); 20837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setPerMill('m'); 20847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt2 = new DecimalFormat("", sym); 20857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt2.applyLocalizedPattern("###.###m"); 20867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("0.4857 x ###.###m", 20877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "485.7m", fmt2.format(0.4857)); 20887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 20897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 20907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestIllegalPatterns() { 20917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test cases: 20927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Prefix with "-:" for illegal patterns 20937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Prefix with "+:" for legal patterns 20947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String DATA[] = { 20957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Unquoted special characters in the suffix are illegal 20967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-:000.000|###", 20977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "+:000.000'|###'", 20987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 20997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; ++i) { 21007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat=DATA[i]; 21017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean valid = pat.charAt(0) == '+'; 21027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = pat.substring(2); 21037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Exception e = null; 21047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 21057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // locale doesn't matter here 21067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormat(pat); 21077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException e1) { 21087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e = e1; 21097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IndexOutOfBoundsException e1) { 21107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e = e1; 21117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String msg = (e==null) ? "success" : e.getMessage(); 21137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((e==null) == valid) { 21147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: pattern \"" + pat + "\": " + msg); 21157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 21167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: pattern \"" + pat + "\" should have " + 21177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (valid?"succeeded":"failed") + "; got " + msg); 21187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 21237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Parse a CurrencyAmount using the given NumberFormat, with 21247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the 'delim' character separating the number and the currency. 21257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 21267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static CurrencyAmount parseCurrencyAmount(String str, NumberFormat fmt, 21277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char delim) 21287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throws ParseException { 21297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int i = str.indexOf(delim); 21307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CurrencyAmount(fmt.parse(str.substring(0,i)), 21317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency.getInstance(str.substring(i+1))); 21327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 21357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Return an integer representing the next token from this 21367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * iterator. The integer will be an index into the given list, or 21377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * -1 if there are no more tokens, or -2 if the token is not on 21387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the list. 21397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 21407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static int keywordIndex(String tok) { 21417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<KEYWORDS.length; ++i) { 21427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (tok.equals(KEYWORDS[i])) { 21437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return i; 21447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return -1; 21477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String KEYWORDS[] = { 21507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*0*/ "ref=", // <reference pattern to parse numbers> 21517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*1*/ "loc=", // <locale for formats> 21527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*2*/ "f:", // <pattern or '-'> <number> <exp. string> 21537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*3*/ "fp:", // <pattern or '-'> <number> <exp. string> <exp. number> 21547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*4*/ "rt:", // <pattern or '-'> <(exp.) number> <(exp.) string> 21557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*5*/ "p:", // <pattern or '-'> <string> <exp. number> 21567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*6*/ "perr:", // <pattern or '-'> <invalid string> 21577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*7*/ "pat:", // <pattern or '-'> <exp. toPattern or '-' or 'err'> 21587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*8*/ "fpc:", // <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt> 21597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /*9*/ "strict=", // true or false 21607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 21617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2162aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert @SuppressWarnings("resource") // InputStream is will be closed by the ResourceReader. 21637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCases() { 21647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String caseFileName = "NumberFormatTestCases.txt"; 21657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert java.io.InputStream is = NumberFormatTest.class.getResourceAsStream(caseFileName); 21667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ResourceReader reader = new ResourceReader(is, caseFileName, "utf-8"); 21687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TokenIterator tokens = new TokenIterator(reader); 21697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale loc = new Locale("en", "US", ""); 21717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat ref = null, fmt = null; 21727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert MeasureFormat mfmt = null; 21737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = null, str = null, mloc = null; 21747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean strict = false; 21757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 21767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 21777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (;;) { 21787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String tok = tokens.next(); 21797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (tok == null) { 21807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 21817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 21827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String where = "(" + tokens.getLineNumber() + ") "; 21837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int cmd = keywordIndex(tok); 21847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert switch (cmd) { 21857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 0: 21867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // ref= <reference pattern> 21877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ref = new DecimalFormat(tokens.next(), 21887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new DecimalFormatSymbols(Locale.US)); 21897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ref.setParseStrict(strict); 21907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Setting reference pattern to:\t" + ref); 21917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 21927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 1: 21937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // loc= <locale> 21947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert loc = LocaleUtility.getLocaleFromName(tokens.next()); 21957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = ((DecimalFormat) NumberFormat.getInstance(loc)).toPattern(); 21967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Setting locale to:\t" + loc + ", \tand pattern to:\t" + pat); 21977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 21987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 2: // f: 21997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 3: // fp: 22007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 4: // rt: 22017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 5: // p: 22027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tok = tokens.next(); 22037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!tok.equals("-")) { 22047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat = tok; 22057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 22077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = new DecimalFormat(pat, new DecimalFormatSymbols(loc)); 22087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseStrict(strict); 22097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException iae) { 22107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + "Pattern \"" + pat + '"'); 22117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert iae.printStackTrace(); 22127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tokens.next(); // consume remaining tokens 22137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //tokens.next(); 22147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cmd == 3) tokens.next(); 22157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 22167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = null; 22187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 22197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cmd == 2 || cmd == 3 || cmd == 4) { 22207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // f: <pattern or '-'> <number> <exp. string> 22217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // fp: <pattern or '-'> <number> <exp. string> <exp. number> 22227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // rt: <pattern or '-'> <number> <string> 22237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String num = tokens.next(); 22247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = tokens.next(); 22257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = ref.parse(num); 22267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + '"' + pat + "\".format(" + num + ")", 22277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str, fmt.format(n)); 22287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cmd == 3) { // fp: 22297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n = ref.parse(tokens.next()); 22307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cmd != 2) { // != f: 22327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + '"' + pat + "\".parse(\"" + str + "\")", 22337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n, fmt.parse(str)); 22347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // p: <pattern or '-'> <string to parse> <exp. number> 22377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert else { 22387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = tokens.next(); 22397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String expstr = tokens.next(); 22407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number parsed = fmt.parse(str); 22417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number exp = ref.parse(expstr); 22427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + '"' + pat + "\".parse(\"" + str + "\")", 22437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert exp, parsed); 22447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 22467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + '"' + pat + "\".parse(\"" + str + 22477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\") threw an exception"); 22487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e.printStackTrace(); 22497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 22517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 6: 22527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // perr: <pattern or '-'> <invalid string> 22537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Under construction"); 22547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 22557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 7: 22567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // pat: <pattern> <exp. toPattern, or '-' or 'err'> 22577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String testpat = tokens.next(); 22587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String exppat = tokens.next(); 22597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean err = exppat.equals("err"); 22607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testpat.equals("-")) { 22617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (err) { 22627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Invalid command \"pat: - err\" at " + tokens.describePosition()); 22637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 22647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert testpat = pat; 22667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (exppat.equals("-")) exppat = testpat; 22687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 22697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat f = null; 22707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testpat == pat) { // [sic] 22717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f = fmt; 22727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 22737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f = new DecimalFormat(testpat); 22747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setParseStrict(strict); 22757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (err) { 22777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + "Invalid pattern \"" + testpat + 22787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\" was accepted"); 22797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 22807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + '"' + testpat + "\".toPattern()", 22817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert exppat, f.toPattern()); 22827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException iae2) { 22847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (err) { 22857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: " + where + "Invalid pattern \"" + testpat + 22867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\" threw an exception"); 22877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 22887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + "Valid pattern \"" + testpat + 22897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\" threw an exception"); 22907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert iae2.printStackTrace(); 22917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 22937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 22947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 8: // fpc: 22957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tok = tokens.next(); 22967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!tok.equals("-")) { 22977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert mloc = tok; 22987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale l = new ULocale(mloc); 22997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 23007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert mfmt = MeasureFormat.getCurrencyFormat(l); 23017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException iae) { 23027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + "Loc \"" + tok + '"'); 23037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert iae.printStackTrace(); 23047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tokens.next(); // consume remaining tokens 23057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tokens.next(); 23067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tokens.next(); 23077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 23087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = null; 23117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 23127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // fpc: <loc or '-'> <curr.amt> <exp. string> <exp. curr.amt> 23137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String currAmt = tokens.next(); 23147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str = tokens.next(); 23157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount target = parseCurrencyAmount(currAmt, ref, '/'); 23167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String formatResult = mfmt.format(target); 23177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + "getCurrencyFormat(" + mloc + ").format(" + currAmt + ")", 23187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str, formatResult); 23197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert target = parseCurrencyAmount(tokens.next(), ref, '/'); 23207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount parseResult = (CurrencyAmount) mfmt.parseObject(str); 23217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(where + "getCurrencyFormat(" + mloc + ").parse(\"" + str + "\")", 23227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert target, parseResult); 23237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 23247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(where + '"' + pat + "\".parse(\"" + str + 23257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\") threw an exception"); 23267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert e.printStackTrace(); 23277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 23297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case 9: // strict= true or false 23307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert strict = "true".equalsIgnoreCase(tokens.next()); 23317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Setting strict to:\t" + strict); 23327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 23337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case -1: 23347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Unknown command \"" + tok + "\" at " + tokens.describePosition()); 23357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 23367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (java.io.IOException e) { 23397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert throw new RuntimeException(e); 2340aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert } finally { 2341aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert try { 2342aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert reader.close(); 2343aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert } catch (IOException ignored) { 2344aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert } 23457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 23487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFieldPositionDecimal() { 23497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 23507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositivePrefix("FOO"); 23517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositiveSuffix("BA"); 23527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buffer = new StringBuffer(); 23537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR); 23547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(35.47, buffer, fp); 23557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("35.47", "FOO35.47BA", buffer.toString()); 23567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp begin", 5, fp.getBeginIndex()); 23577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp end", 6, fp.getEndIndex()); 23587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 23607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFieldPositionInteger() { 23617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 23627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositivePrefix("FOO"); 23637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositiveSuffix("BA"); 23647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buffer = new StringBuffer(); 23657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(NumberFormat.Field.INTEGER); 23667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(35.47, buffer, fp); 23677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("35.47", "FOO35.47BA", buffer.toString()); 23687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp begin", 3, fp.getBeginIndex()); 23697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp end", 5, fp.getEndIndex()); 23707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 23727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFieldPositionFractionButInteger() { 23737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 23747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositivePrefix("FOO"); 23757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositiveSuffix("BA"); 23767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buffer = new StringBuffer(); 23777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(NumberFormat.Field.FRACTION); 23787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(35, buffer, fp); 23797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("35", "FOO35BA", buffer.toString()); 23807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp begin", 5, fp.getBeginIndex()); 23817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp end", 5, fp.getEndIndex()); 23827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 23847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFieldPositionFraction() { 23857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 23867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositivePrefix("FOO"); 23877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setPositiveSuffix("BA"); 23887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer buffer = new StringBuffer(); 23897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(NumberFormat.Field.FRACTION); 23907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(35.47, buffer, fp); 23917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("35.47", "FOO35.47BA", buffer.toString()); 23927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp begin", 6, fp.getBeginIndex()); 23937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("fp end", 8, fp.getEndIndex()); 23947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 23957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2396ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius public void TestFieldPositionCurrency() { 2397ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.US); 2398ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius double amount = 35.47; 2399ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius double negAmount = -34.567; 2400ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius FieldPosition cp = new FieldPosition(NumberFormat.Field.CURRENCY); 2401ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2402ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer0 = new StringBuffer(); 2403ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(amount, buffer0, cp); 2404ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("$35.47", "$35.47", buffer0.toString()); 2405ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 0, cp.getBeginIndex()); 2406ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 1, cp.getEndIndex()); 2407ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2408ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer01 = new StringBuffer(); 2409ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(negAmount, buffer01, cp); 2410ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-$34.57", "-$34.57", buffer01.toString()); 2411ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 1, cp.getBeginIndex()); 2412ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 2, cp.getEndIndex()); 2413ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2414ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.setCurrency(Currency.getInstance(Locale.FRANCE)); 2415ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer1 = new StringBuffer(); 2416ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(amount, buffer1, cp); 2417ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("€35.47", "€35.47", buffer1.toString()); 2418ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 0, cp.getBeginIndex()); 2419ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 1, cp.getEndIndex()); 2420ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2421ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.setCurrency(Currency.getInstance(new Locale("fr", "ch", ""))); 2422ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer2 = new StringBuffer(); 2423ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(amount, buffer2, cp); 2424ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("CHF35.47", "CHF35.47", buffer2.toString()); 2425ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 0, cp.getBeginIndex()); 2426ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 3, cp.getEndIndex()); 2427ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2428ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer20 = new StringBuffer(); 2429ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(negAmount, buffer20, cp); 2430ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-CHF34.57", "-CHF34.57", buffer20.toString()); 2431ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 1, cp.getBeginIndex()); 2432ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 4, cp.getEndIndex()); 2433ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2434ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.FRANCE); 2435ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer3 = new StringBuffer(); 2436ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(amount, buffer3, cp); 2437ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("35,47 €", "35,47 €", buffer3.toString()); 2438ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 6, cp.getBeginIndex()); 2439ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 7, cp.getEndIndex()); 2440ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2441ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer4 = new StringBuffer(); 2442ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(negAmount, buffer4, cp); 2443ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-34,57 €", "-34,57 €", buffer4.toString()); 2444ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 7, cp.getBeginIndex()); 2445ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 8, cp.getEndIndex()); 2446ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2447ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.setCurrency(Currency.getInstance(new Locale("fr", "ch"))); 2448ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer5 = new StringBuffer(); 2449ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(negAmount, buffer5, cp); 2450ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-34,57 CHF", "-34,57 CHF", buffer5.toString()); 2451ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 7, cp.getBeginIndex()); 2452ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 10, cp.getEndIndex()); 2453ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2454ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius NumberFormat plCurrencyFmt = NumberFormat.getInstance(new Locale("fr", "ch"), NumberFormat.PLURALCURRENCYSTYLE); 2455ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer6 = new StringBuffer(); 2456ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt.format(negAmount, buffer6, cp); 2457ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-34.57 francs suisses", "-34.57 francs suisses", buffer6.toString()); 2458ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 7, cp.getBeginIndex()); 2459ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 21, cp.getEndIndex()); 2460ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2461ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius // Positive value with PLURALCURRENCYSTYLE. 2462ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "ch"), NumberFormat.PLURALCURRENCYSTYLE); 2463ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer7 = new StringBuffer(); 2464ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt.format(amount, buffer7, cp); 2465ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("35.47スイス フラン", "35.47スイス フラン", buffer7.toString()); 2466ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 5, cp.getBeginIndex()); 2467ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 12, cp.getEndIndex()); 2468ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2469ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius // PLURALCURRENCYSTYLE for non-ASCII. 2470ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "de"), NumberFormat.PLURALCURRENCYSTYLE); 2471ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer8 = new StringBuffer(); 2472ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt.format(negAmount, buffer8, cp); 2473ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-34.57ユーロ", "-34.57ユーロ", buffer8.toString()); 2474ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 6, cp.getBeginIndex()); 2475ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 9, cp.getEndIndex()); 2476ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2477ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(Locale.JAPAN); 2478ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.setCurrency(Currency.getInstance(new Locale("ja", "jp"))); 2479ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer9 = new StringBuffer(); 2480ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf.format(negAmount, buffer9, cp); 2481ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-¥35", "-¥35", buffer9.toString()); 2482ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 1, cp.getBeginIndex()); 2483ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 2, cp.getEndIndex()); 2484ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2485ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius // Negative value with PLURALCURRENCYSTYLE. 2486ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt = NumberFormat.getInstance(new Locale("ja", "ch"), NumberFormat.PLURALCURRENCYSTYLE); 2487ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer10 = new StringBuffer(); 2488ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt.format(negAmount, buffer10, cp); 2489ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-34.57スイス フラン", "-34.57スイス フラン", buffer10.toString()); 2490ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 6, cp.getBeginIndex()); 2491ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 13, cp.getEndIndex()); 2492ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 2493ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius // Nagative value with PLURALCURRENCYSTYLE, Arabic digits. 2494ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("ar", "eg")); 2495ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt = NumberFormat.getInstance(new Locale("ar", "eg"), NumberFormat.PLURALCURRENCYSTYLE); 2496ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius StringBuffer buffer11 = new StringBuffer(); 2497ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius plCurrencyFmt.format(negAmount, buffer11, cp); 2498ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("-٣٤٫٥٧ جنيه مصري", "-٣٤٫٥٧ جنيه مصري", buffer11.toString()); 2499ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp begin", 8, cp.getBeginIndex()); 2500ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius assertEquals("cp end", 17, cp.getEndIndex()); 2501ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius } 2502ccec2fb70b3e46946b53a0ad5122318a85a19bd2Craig Cornelius 25037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRounding() { 25047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 25057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (false) { // for debugging specific value 25067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setRoundingMode(BigDecimal.ROUND_HALF_UP); 25077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkRounding(nf, new BigDecimal("300.0300000000"), 0, new BigDecimal("0.020000000")); 25087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // full tests 25107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] roundingIncrements = {1, 2, 5, 20, 50, 100}; 25117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] testValues = {0, 300}; 25127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int j = 0; j < testValues.length; ++j) { 25137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int mode = BigDecimal.ROUND_UP; mode < BigDecimal.ROUND_HALF_EVEN; ++mode) { 25147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setRoundingMode(mode); 25157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int increment = 0; increment < roundingIncrements.length; ++increment) { 25167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal base = new BigDecimal(testValues[j]); 25177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal rInc = new BigDecimal(roundingIncrements[increment]); 25187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkRounding(nf, base, 20, rInc); 25197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rInc = new BigDecimal("1.000000000").divide(rInc); 25207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkRounding(nf, base, 20, rInc); 25217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRoundingPattern() { 25277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestRoundingPatternItem { 25287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern; 25297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double roundingIncrement; 25307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double testCase; 25317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String expected; 25327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestRoundingPatternItem(String pattern, double roundingIncrement, double testCase, String expected) { 25347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.pattern = pattern; 25357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.roundingIncrement = roundingIncrement; 25367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.testCase = testCase; 25377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.expected = expected; 25387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 25407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestRoundingPatternItem []tests = { 25427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestRoundingPatternItem("##0.65", 0.65, 1.234, "1.30"), 25437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestRoundingPatternItem("#50", 50.0, 1230, "1250") 25447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 25457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = (DecimalFormat) com.ibm.icu.text.NumberFormat.getInstance(ULocale.ENGLISH); 25477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String result; 25487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal bd; 25497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < tests.length; i++) { 25507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.applyPattern(tests[i].pattern); 25517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = df.format(tests[i].testCase); 25537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!tests[i].expected.equals(result)) { 25557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("String Pattern Rounding Test Failed: Pattern: \"" + tests[i].pattern + "\" Number: " + tests[i].testCase + " - Got: " + result + " Expected: " + tests[i].expected); 25567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bd = new BigDecimal(tests[i].roundingIncrement); 25597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setRoundingIncrement(bd); 25617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = df.format(tests[i].testCase); 25637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!tests[i].expected.equals(result)) { 25657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("BigDecimal Rounding Test Failed: Pattern: \"" + tests[i].pattern + "\" Number: " + tests[i].testCase + " - Got: " + result + " Expected: " + tests[i].expected); 25667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestBigDecimalRounding() { 25717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String figure = "50.000000004"; 25727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double dbl = new Double(figure); 25737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal dec = new BigDecimal(figure); 25747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat f = (DecimalFormat) NumberFormat.getInstance(); 25767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.applyPattern("00.00######"); 25777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("double format", "50.00", f.format(dbl)); 25797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("bigdec format", "50.00", f.format(dec)); 25807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int maxFracDigits = f.getMaximumFractionDigits(); 25827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal roundingIncrement = new BigDecimal("1").movePointLeft(maxFracDigits); 25837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setRoundingIncrement(roundingIncrement); 25857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setRoundingMode(BigDecimal.ROUND_DOWN); 25867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Rounding down", f.format(dbl), f.format(dec)); 25877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setRoundingIncrement(roundingIncrement); 25897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert f.setRoundingMode(BigDecimal.ROUND_HALF_UP); 25907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Rounding half up", f.format(dbl), f.format(dec)); 25917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 25927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 25937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void checkRounding(DecimalFormat nf, BigDecimal base, int iterations, BigDecimal increment) { 25947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setRoundingIncrement(increment.toBigDecimal()); 25957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal lastParsed = new BigDecimal(Integer.MIN_VALUE); // used to make sure that rounding is monotonic 25967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = -iterations; i <= iterations; ++i) { 25977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal iValue = base.add(increment.multiply(new BigDecimal(i)).movePointLeft(1)); 25987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal smallIncrement = new BigDecimal("0.00000001"); 25997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (iValue.signum() != 0) { 26007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert smallIncrement.multiply(iValue); // scale unless zero 26017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // we not only test the value, but some values in a small range around it. 26037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lastParsed = checkRound(nf, iValue.subtract(smallIncrement), lastParsed); 26047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lastParsed = checkRound(nf, iValue, lastParsed); 26057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lastParsed = checkRound(nf, iValue.add(smallIncrement), lastParsed); 26067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private BigDecimal checkRound(DecimalFormat nf, BigDecimal iValue, BigDecimal lastParsed) { 26107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String formatedBigDecimal = nf.format(iValue); 26117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String formattedDouble = nf.format(iValue.doubleValue()); 26127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!equalButForTrailingZeros(formatedBigDecimal, formattedDouble)) { 26137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Failure at: " + iValue + " (" + iValue.doubleValue() + ")" 26157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tRounding-mode: " + roundingModeNames[nf.getRoundingMode()] 26167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tRounding-increment: " + nf.getRoundingIncrement() 26177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tdouble: " + formattedDouble 26187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tBigDecimal: " + formatedBigDecimal); 26197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 26217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Value: " + iValue 26227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tRounding-mode: " + roundingModeNames[nf.getRoundingMode()] 26237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tRounding-increment: " + nf.getRoundingIncrement() 26247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tdouble: " + formattedDouble 26257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ",\tBigDecimal: " + formatedBigDecimal); 26267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 26287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Number should have compareTo(...) 26297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert BigDecimal parsed = toBigDecimal(nf.parse(formatedBigDecimal)); 26307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (lastParsed.compareTo(parsed) > 0) { 26317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Rounding wrong direction!: " + lastParsed + " > " + parsed); 26327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lastParsed = parsed; 26347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 26357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Parse Failure with: " + formatedBigDecimal); 26367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return lastParsed; 26387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static BigDecimal toBigDecimal(Number number) { 26417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return number instanceof BigDecimal ? (BigDecimal) number 26427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert : number instanceof BigInteger ? new BigDecimal((BigInteger)number) 26437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert : number instanceof java.math.BigDecimal ? new BigDecimal((java.math.BigDecimal)number) 26447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert : number instanceof Double ? new BigDecimal(number.doubleValue()) 26457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert : number instanceof Float ? new BigDecimal(number.floatValue()) 26467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert : new BigDecimal(number.longValue()); 26477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static String[] roundingModeNames = { 26507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "ROUND_UP", "ROUND_DOWN", "ROUND_CEILING", "ROUND_FLOOR", 26517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "ROUND_HALF_UP", "ROUND_HALF_DOWN", "ROUND_HALF_EVEN", 26527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "ROUND_UNNECESSARY" 26537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 26547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static boolean equalButForTrailingZeros(String formatted1, String formatted2) { 26567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (formatted1.length() == formatted2.length()) return formatted1.equals(formatted2); 26577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return stripFinalZeros(formatted1).equals(stripFinalZeros(formatted2)); 26587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static String stripFinalZeros(String formatted) { 26617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int len1 = formatted.length(); 26627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char ch; 26637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert while (len1 > 0 && ((ch = formatted.charAt(len1-1)) == '0' || ch == '.')) --len1; 26647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (len1==1 && ((ch = formatted.charAt(len1-1)) == '-')) --len1; 26657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return formatted.substring(0,len1); 26667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //------------------------------------------------------------------ 26697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Support methods 26707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //------------------------------------------------------------------ 26717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test 26737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect2(NumberFormat fmt, Number n, String exp) { 26747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Don't round-trip format test, since we explicitly do it 26757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, n, exp, false); 26767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, exp, n); 26777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test 26797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect3(NumberFormat fmt, Number n, String exp) { 26807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Don't round-trip format test, since we explicitly do it 26817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect_rbnf(fmt, n, exp, false); 26827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect_rbnf(fmt, exp, n); 26837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test (convenience) 26867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect2(NumberFormat fmt, double n, String exp) { 26877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt, new Double(n), exp); 26887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test (convenience) 26907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect3(NumberFormat fmt, double n, String exp) { 26917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect3(fmt, new Double(n), exp); 26927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 26947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test (convenience) 26957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect2(NumberFormat fmt, long n, String exp) { 26967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt, new Long(n), exp); 26977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 26987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format-Parse test (convenience) 26997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect3(NumberFormat fmt, long n, String exp) { 27007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect3(fmt, new Long(n), exp); 27017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format test 27047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, Number n, String exp, boolean rt) { 27057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer saw = new StringBuffer(); 27067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 27077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.format(n, saw, pos); 27087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = ((DecimalFormat)fmt).toPattern(); 27097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (saw.toString().equals(exp)) { 27107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok " + n + " x " + 27117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat + " = \"" + 27127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert saw + "\""); 27137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // We should be able to round-trip the formatted string => 27147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // number => string (but not the other way around: number 27157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // => string => number2, might have number2 != number): 27167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rt) { 27177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 27187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n2 = fmt.parse(exp); 27197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer saw2 = new StringBuffer(); 27207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.format(n2, saw2, pos); 27217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!saw2.toString().equals(exp)) { 27227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 27237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL \"" + exp + "\" => " + n2 + " => \"" + saw2 + '"'); 27247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 27267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 27277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", " + e.getMessage()); 27287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 27297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 27327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect() format test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 27337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL " + n + " x " + pat + " = \"" + saw + "\", expected \"" + exp + "\""); 27347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format test 27377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect_rbnf(NumberFormat fmt, Number n, String exp, boolean rt) { 27387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer saw = new StringBuffer(); 27397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 27407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.format(n, saw, pos); 27417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (saw.toString().equals(exp)) { 27427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok " + n + " = \"" + 27437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert saw + "\""); 27447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // We should be able to round-trip the formatted string => 27457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // number => string (but not the other way around: number 27467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // => string => number2, might have number2 != number): 27477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rt) { 27487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 27497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n2 = fmt.parse(exp); 27507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer saw2 = new StringBuffer(); 27517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.format(n2, saw2, pos); 27527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!saw2.toString().equals(exp)) { 27537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect_rbnf() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 27547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL \"" + exp + "\" => " + n2 + " => \"" + saw2 + '"'); 27557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 27577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect_rbnf() format test rt, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 27587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", " + e.getMessage()); 27597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 27607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 27637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect_rbnf() format test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 27647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL " + n + " = \"" + saw + "\", expected \"" + exp + "\""); 27657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format test (convenience) 27697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, Number n, String exp) { 27707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, n, exp, true); 27717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format test (convenience) 27747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, double n, String exp) { 27757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, new Double(n), exp); 27767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Format test (convenience) 27797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, long n, String exp) { 27807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, new Long(n), exp); 27817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 27837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Parse test 27847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, String str, Number n) { 27857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = null; 27867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 27877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num = fmt.parse(str); 27887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 27897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(e.getMessage()); 27907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 27917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 27927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = ((DecimalFormat)fmt).toPattern(); 27937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // A little tricky here -- make sure Double(12345.0) and 27947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Long(12345) match. 27957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (num.equals(n) || num.doubleValue() == n.doubleValue()) { 27967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok \"" + str + "\" x " + 27977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pat + " = " + 27987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num); 27997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 28007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect() parse test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 28017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL \"" + str + "\" x " + pat + " = " + num + ", expected " + n); 28027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Parse test 28067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect_rbnf(NumberFormat fmt, String str, Number n) { 28077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = null; 28087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 28097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num = fmt.parse(str); 28107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 28117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(e.getMessage()); 28127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 28137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // A little tricky here -- make sure Double(12345.0) and 28157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Long(12345) match. 28167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (num.equals(n) || num.doubleValue() == n.doubleValue()) { 28177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok \"" + str + " = " + 28187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert num); 28197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 28207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("expect_rbnf() parse test, locale " + fmt.getLocale(ULocale.VALID_LOCALE) + 28217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", FAIL \"" + str + " = " + num + ", expected " + n); 28227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Parse test (convenience) 28267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, String str, double n) { 28277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, str, new Double(n)); 28287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Parse test (convenience) 28317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expect(NumberFormat fmt, String str, long n) { 28327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, str, new Long(n)); 28337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void expectCurrency(NumberFormat nf, Currency curr, 28367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double value, String string) { 28377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = (DecimalFormat) nf; 28387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (curr != null) { 28397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setCurrency(curr); 28407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = fmt.format(value).replace('\u00A0', ' '); 28427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (s.equals(string)) { 28447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: " + value + " x " + curr + " => " + s); 28457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 28467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + value + " x " + curr + " => " + s + 28477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expected " + string); 28487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expectPad(DecimalFormat fmt, String pat, int pos) { 28527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expectPad(fmt, pat, pos, 0, (char)0); 28537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expectPad(DecimalFormat fmt, final String pat, int pos, int width, final char pad) { 28567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int apos = 0, awidth = 0; 28577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char apadStr; 28587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 28597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.applyPattern(pat); 28607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert apos = fmt.getPadPosition(); 28617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert awidth = fmt.getFormatWidth(); 28627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert apadStr = fmt.getPadCharacter(); 28637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 28647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert apos = -1; 28657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert awidth = width; 28667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert apadStr = pad; 28677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (apos == pos && awidth == width && apadStr == pad) { 28707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok \"" + pat + "\" pos=" 28717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + apos + ((pos == -1) ? "" : " width=" + awidth + " pad=" + apadStr)); 28727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 28737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL \"" + pat + "\" pos=" + apos + " width=" 28747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + awidth + " pad=" + apadStr + ", expected " 28757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + pos + " " + width + " " + pad); 28767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void expectPat(DecimalFormat fmt, final String exp) { 28807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pat = fmt.toPattern(); 28817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pat.equals(exp)) { 28827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok \"" + pat + "\""); 28837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 28847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL \"" + pat + "\", expected \"" + exp + "\""); 28857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void expectParseCurrency(NumberFormat fmt, Currency expected, String text) { 28907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 28917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount currencyAmount = fmt.parseCurrency(text, pos); 28927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertTrue("Parse of " + text + " should have succeeded.", pos.getIndex() > 0); 28937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Currency should be correct.", expected, currencyAmount.getCurrency()); 28947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 28957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 28967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestJB3832(){ 28977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = new ULocale("pt_PT@currency=PTE"); 28987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat format = NumberFormat.getCurrencyInstance(locale); 28997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency curr = Currency.getInstance(locale); 29007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("\nName of the currency is: " + curr.getName(locale, Currency.LONG_NAME, new boolean[] {false})); 29017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount cAmt = new CurrencyAmount(1150.50, curr); 29027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("CurrencyAmount object's hashCode is: " + cAmt.hashCode()); //cover hashCode 29037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str = format.format(cAmt); 29047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String expected = "1,150$50\u00a0\u200b"; 29057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(!expected.equals(str)){ 29067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Did not get the expected output Expected: "+expected+" Got: "+ str); 29077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestStrictParse() { 29117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] pass = { 29127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0", // single zero before end of text is not leading 29137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0 ", // single zero at end of number is not leading 29147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.", // single zero before period (or decimal, it's ambiguous) is not leading 29157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0,", // single zero before comma (not group separator) is not leading 29167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.0", // single zero before decimal followed by digit is not leading 29177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0. ", // same as above before period (or decimal) is not leading 29187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.100,5", // comma stops parse of decimal (no grouping) 29197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ".00", // leading decimal is ok, even with zeros 29207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1234567", // group separators are not required 29217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12345, ", // comma not followed by digit is not a group separator, but end of number 29227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234, ", // if group separator is present, group sizes must be appropriate 29237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234,567", // ...secondary too 29247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0E", // an exponent not followed by zero or digits is not an exponent 29257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "00", // leading zero before zero - used to be error - see ticket #7913 29267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "012", // leading zero before digit - used to be error - see ticket #7913 29277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0,456", // leading zero before group separator - used to be error - see ticket #7913 29287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 29297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] fail = { 29307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,2", // wrong number of digits after group separator 29317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ",0", // leading group separator before zero 29327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ",1", // leading group separator before digit 29337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ",.02", // leading group separator before decimal 29347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,.02", // group separator before decimal 29357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,,200", // multiple group separators 29367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,45", // wrong number of digits in primary group 29377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,45 that", // wrong number of digits in primary group 29387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,45.34", // wrong number of digits in primary group 29397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1234,567", // wrong number of digits in secondary group 29407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,567", // wrong number of digits in secondary group 29417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,23,456,7890", // wrong number of digits in primary and secondary groups 29427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 29437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH); 29457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseBatch(nf, pass, fail); 29467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] scientificPass = { 29487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0E2", // single zero before exponent is ok 29497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1234E2", // any number of digits before exponent is ok 29507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234E", // an exponent string not followed by zero or digits is not an exponent 29517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "00E2", // leading zeroes now allowed in strict mode - see ticket # 29527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 29537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] scientificFail = { 29547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1,234E2", // group separators with exponent fail 29557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 29567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH); 29587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseBatch(nf, scientificPass, scientificFail); 29597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] mixedPass = { 29617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,567", 29627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,567,", 29637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,567, that", 29647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,567 that", 29657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 29667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] mixedFail = { 29677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,56", 29687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,56,", 29697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,56, that ", 29707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12,34,56 that", 29717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 29727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = new DecimalFormat("#,##,##0.#"); 29747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseBatch(nf, mixedPass, mixedFail); 29757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void runStrictParseBatch(DecimalFormat nf, String[] pass, String[] fail) { 29787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setParseStrict(false); 29797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseTests("should pass", nf, pass, true); 29807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseTests("should also pass", nf, fail, true); 29817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setParseStrict(true); 29827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseTests("should still pass", nf, pass, true); 29837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert runStrictParseTests("should fail", nf, fail, false); 29847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 29857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 29867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void runStrictParseTests(String msg, DecimalFormat nf, String[] tests, boolean pass) { 29877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(""); 29887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("pattern: '" + nf.toPattern() + "'"); 29897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(msg); 29907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < tests.length; ++i) { 29917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str = tests[i]; 29927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pp = new ParsePosition(0); 29937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nf.parse(str, pp); 29947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String formatted = n != null ? nf.format(n) : "null"; 29957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String err = pp.getErrorIndex() == -1 ? "" : "(error at " + pp.getErrorIndex() + ")"; 29967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((err.length() == 0) != pass) { 29977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("'" + str + "' parsed '" + 29987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str.substring(0, pp.getIndex()) + 29997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "' returned " + n + " formats to '" + 30007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert formatted + "' " + err); 30017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 30027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (err.length() > 0) { 30037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert err = "got expected " + err; 30047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("'" + str + "' parsed '" + 30067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert str.substring(0, pp.getIndex()) + 30077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "' returned " + n + " formats to '" + 30087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert formatted + "' " + err); 30097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestJB5251(){ 30137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //save default locale 30147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale defaultLocale = ULocale.getDefault(); 30157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.setDefault(new ULocale("qr_QR")); 30167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 30177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getInstance(); 30187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (Exception e) { 30207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Numberformat threw exception for non-existent locale. It should use the default."); 30217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //reset default locale 30237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.setDefault(defaultLocale); 30247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseReturnType() { 30277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] defaultNonBigDecimals = { 30287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123", // Long 30297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.0", // Long 30307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.0", // Long 30317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12345678901234567890" // BigInteger 30327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 30337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] doubles = { 30357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-0.0", 30367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "NaN", 30377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "\u221E" // Infinity 30387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 30397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 30417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat nf = new DecimalFormat("#.#", sym); 30427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (nf.isParseBigDecimal()) { 30447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: isParseDecimal() must return false by default"); 30457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // isParseBigDecimal() is false 30487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < defaultNonBigDecimals.length; i++) { 30497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 30507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nf.parse(defaultNonBigDecimals[i]); 30517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (n instanceof BigDecimal) { 30527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse returns BigDecimal instance"); 30537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 30557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse of '" + defaultNonBigDecimals[i] + "' threw exception: " + e); 30567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // parse results for doubls must be always Double 30597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < doubles.length; i++) { 30607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 30617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nf.parse(doubles[i]); 30627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!(n instanceof Double)) { 30637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse does not return Double instance"); 30647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 30667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse of '" + doubles[i] + "' threw exception: " + e); 30677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // force this DecimalFormat to return BigDecimal 30717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setParseBigDecimal(true); 30727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!nf.isParseBigDecimal()) { 30737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: isParseBigDecimal() must return true"); 30747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 30767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // isParseBigDecimal() is true 30777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < defaultNonBigDecimals.length; i++) { 30787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 30797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nf.parse(defaultNonBigDecimals[i]); 30807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!(n instanceof BigDecimal)) { 30817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse does not return BigDecimal instance"); 30827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 30847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse of '" + defaultNonBigDecimals[i] + "' threw exception: " + e); 30857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // parse results for doubls must be always Double 30887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < doubles.length; i++) { 30897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 30907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = nf.parse(doubles[i]); 30917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!(n instanceof Double)) { 30927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: parse does not return Double instance"); 30937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 30957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("parse of '" + doubles[i] + "' threw exception: " + e); 30967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 30997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestNonpositiveMultiplier() { 31017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = new DecimalFormat("0"); 31027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test zero multiplier 31047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 31067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setMultiplier(0); 31077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // bad 31097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("DecimalFormat.setMultiplier(0) did not throw an IllegalArgumentException"); 31107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException ex) { 31117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // good 31127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test negative multiplier 31157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 31177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setMultiplier(-1); 31187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (df.getMultiplier() != -1) { 31207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("DecimalFormat.setMultiplier(-1) did not change the multiplier to -1"); 31217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 31227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // good 31257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException ex) { 31267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // bad 31277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("DecimalFormat.setMultiplier(-1) threw an IllegalArgumentException"); 31287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 31297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(df, "1122.123", -1122.123); 31327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(df, "-1122.123", 1122.123); 31337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(df, "1.2", -1.2); 31347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(df, "-1.2", 1.2); 31357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, Long.MAX_VALUE, BigInteger.valueOf(Long.MAX_VALUE).negate().toString()); 31377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, Long.MIN_VALUE, BigInteger.valueOf(Long.MIN_VALUE).negate().toString()); 31387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, Long.MAX_VALUE / 2, BigInteger.valueOf(Long.MAX_VALUE / 2).negate().toString()); 31397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, Long.MIN_VALUE / 2, BigInteger.valueOf(Long.MIN_VALUE / 2).negate().toString()); 31407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, BigDecimal.valueOf(Long.MAX_VALUE), BigDecimal.valueOf(Long.MAX_VALUE).negate().toString()); 31427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, BigDecimal.valueOf(Long.MIN_VALUE), BigDecimal.valueOf(Long.MIN_VALUE).negate().toString()); 31437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, java.math.BigDecimal.valueOf(Long.MAX_VALUE), java.math.BigDecimal.valueOf(Long.MAX_VALUE).negate().toString()); 31457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(df, java.math.BigDecimal.valueOf(Long.MIN_VALUE), java.math.BigDecimal.valueOf(Long.MIN_VALUE).negate().toString()); 31467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestJB5358() { 31497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int numThreads = 10; 31507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String numstr = "12345"; 31517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double expected = 12345; 31527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(Locale.US); 31537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("#.#", sym); 31547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ArrayList errors = new ArrayList(); 31557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParseThreadJB5358[] threads = new ParseThreadJB5358[numThreads]; 31577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < numThreads; i++) { 31587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert threads[i] = new ParseThreadJB5358((DecimalFormat)fmt.clone(), numstr, expected, errors); 31597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert threads[i].start(); 31607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < numThreads; i++) { 31627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 31637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert threads[i].join(); 31647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (InterruptedException ie) { 31657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ie.printStackTrace(); 31667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (errors.size() != 0) { 31697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer errBuf = new StringBuffer(); 31707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < errors.size(); i++) { 31717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errBuf.append((String)errors.get(i)); 31727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errBuf.append("\n"); 31737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + errBuf); 31757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static private class ParseThreadJB5358 extends Thread { 31797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final DecimalFormat decfmt; 31807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final String numstr; 31817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final double expect; 31827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final ArrayList errors; 31837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public ParseThreadJB5358(DecimalFormat decfmt, String numstr, double expect, ArrayList errors) { 31857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.decfmt = decfmt; 31867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.numstr = numstr; 31877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.expect = expect; 31887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.errors = errors; 31897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 31907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 31917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 31927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void run() { 31937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 10000; i++) { 31947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 31957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n = decfmt.parse(numstr); 31967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (n.doubleValue() != expect) { 31977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert synchronized(errors) { 31987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errors.add(new String("Bad parse result - expected:" + expect + " actual:" + n.doubleValue())); 31997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Throwable t) { 32027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert synchronized(errors) { 32037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errors.add(new String(t.getClass().getName() + " - " + t.getMessage())); 32047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSetCurrency() { 32117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decf1 = DecimalFormatSymbols.getInstance(ULocale.US); 32127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decf2 = DecimalFormatSymbols.getInstance(ULocale.US); 32137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert decf2.setCurrencySymbol("UKD"); 32147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat format1 = new DecimalFormat("000.000", decf1); 32157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat format2 = new DecimalFormat("000.000", decf2); 32167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency euro = Currency.getInstance("EUR"); 32177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format1.setCurrency(euro); 32187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format2.setCurrency(euro); 32197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Reset with currency symbol", format1, format2); 32207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 32237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Testing the method public StringBuffer format(Object number, ...) 32247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 32257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFormat() { 32267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = NumberFormat.getInstance(); 32277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer sb = new StringBuffer("dummy"); 32287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition fp = new FieldPosition(0); 32297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "if (number instanceof Long)" is true 32317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 32327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(new Long("0"), sb, fp); 32337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 32347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 32357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for a Long object. Error: " + e); 32367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else if (number instanceof BigInteger)" is true 32397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 32407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format((Object)new BigInteger("0"), sb, fp); 32417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 32427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 32437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for a BigInteger object. Error: " + e); 32447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else if (number instanceof java.math.BigDecimal)" is true 32477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 32487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format((Object)new java.math.BigDecimal("0"), sb, fp); 32497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 32507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 32517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for a java.math.BigDecimal object. Error: " + e); 32527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else if (number instanceof com.ibm.icu.math.BigDecimal)" is true 32557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 32567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format((Object)new com.ibm.icu.math.BigDecimal("0"), sb, fp); 32577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 32587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 32597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for a com.ibm.icu.math.BigDecimal object. Error: " + e); 32607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else if (number instanceof CurrencyAmount)" is true 32637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 32647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount ca = new CurrencyAmount(0.0, Currency.getInstance(new ULocale("en_US"))); 32657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format((Object)ca, sb, fp); 32667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 32677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 32687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for a CurrencyAmount object. Error: " + e); 32697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else if (number instanceof Number)" is true 32727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 32737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(0.0, sb, fp); 32747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 32757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was not suppose to " 32767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "to return an exception for a Number object. Error: " + e); 32777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "else" is true 32807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 32817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(new Object(), sb, fp); 32827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was suppose to " 32837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for an invalid object."); 32847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 32857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 32887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.format(new String("dummy"), sb, fp); 32897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format(Object number, ...) was suppose to " 32907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for an invalid object."); 32917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 32927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 32947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 32957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 3296b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín * Coverage tests for the implementation of abstract format methods not being called otherwise 3297b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín */ 3298b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín public void TestFormatAbstractImplCoverage() { 3299b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín NumberFormat df = DecimalFormat.getInstance(Locale.ENGLISH); 3300b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín NumberFormat cdf = CompactDecimalFormat.getInstance(Locale.ENGLISH, CompactDecimalFormat.CompactStyle.SHORT); 3301b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín NumberFormat rbf = new RuleBasedNumberFormat(ULocale.ENGLISH, RuleBasedNumberFormat.SPELLOUT); 3302b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín 3303b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín /* 3304b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín * Test NumberFormat.format(BigDecimal,StringBuffer,FieldPosition) 3305b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín */ 3306b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín StringBuffer sb = new StringBuffer(); 3307b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín String result = df.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString(); 3308b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín if (!"2,000.43".equals(result)) { 3309b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín errln("DecimalFormat failed. Expected: 2,000.43 - Actual: " + result); 3310b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín } 3311b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín 3312b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín sb.delete(0, sb.length()); 3313b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín result = cdf.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString(); 3314b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín if (!"2K".equals(result)) { 3315b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín errln("DecimalFormat failed. Expected: 2K - Actual: " + result); 3316b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín } 3317b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín 3318b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín sb.delete(0, sb.length()); 3319b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín result = rbf.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString(); 3320b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín if (!"two thousand point four three".equals(result)) { 3321b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín errln("DecimalFormat failed. Expected: 'two thousand point four three' - Actual: '" + result + "'"); 3322b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín } 3323b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín } 3324b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín 3325b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín /* 33267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public final static NumberFormat getInstance(int style) public static NumberFormat 33277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * getInstance(Locale inLocale, int style) public static NumberFormat getInstance(ULocale desiredLocale, int choice) 33287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 33297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestGetInstance() { 33307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests "public final static NumberFormat getInstance(int style)" 3331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert int maxStyle = NumberFormat.STANDARDCURRENCYSTYLE; 33327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] invalid_cases = { NumberFormat.NUMBERSTYLE - 1, NumberFormat.NUMBERSTYLE - 2, 33347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert maxStyle + 1, maxStyle + 2 }; 33357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = NumberFormat.NUMBERSTYLE; i < maxStyle; i++) { 33377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getInstance(i); 33397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getInstance(int style) was not suppose to " 33417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for passing value of " + i); 33427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < invalid_cases.length; i++) { 33467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getInstance(invalid_cases[i]); 33487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getInstance(int style) was suppose to " 33497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for passing value of " + invalid_cases[i]); 33507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests "public static NumberFormat getInstance(Locale inLocale, int style)" 33557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] localeCases = { "en_US", "fr_FR", "de_DE", "jp_JP" }; 33567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = NumberFormat.NUMBERSTYLE; i < maxStyle; i++) { 33587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int j = 0; j < localeCases.length; j++) { 33597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getInstance(new Locale(localeCases[j]), i); 33617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getInstance(Locale inLocale, int style) was not suppose to " 33637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for passing value of " + localeCases[j] + ", " + i); 33647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests "public static NumberFormat getInstance(ULocale desiredLocale, int choice)" 33697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "if (choice < NUMBERSTYLE || choice > PLURALCURRENCYSTYLE)" is true 33707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < invalid_cases.length; i++) { 33717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 33727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.getInstance((ULocale) null, invalid_cases[i]); 33737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getInstance(ULocale inLocale, int choice) was not suppose to " 33747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception for passing value of " + invalid_cases[i]); 33757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 33767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 33817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the class public static abstract class NumberFormatFactory 33827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 33837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestNumberFormatFactory() { 33847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 33857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The following class allows the method public NumberFormat createFormat(Locale loc, int formatType) to be 33867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * tested. 33877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 33887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestFactory extends NumberFormatFactory { 33897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 33907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Set<String> getSupportedLocaleNames() { 33917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 33927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 33947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 33957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public NumberFormat createFormat(ULocale loc, int formatType) { 33967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 33977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 33997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The following class allows the method public NumberFormat createFormat(ULocale loc, int formatType) to be 34027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * tested. 34037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestFactory1 extends NumberFormatFactory { 34057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Set<String> getSupportedLocaleNames() { 34077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public NumberFormat createFormat(Locale loc, int formatType) { 34127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestFactory tf = new TestFactory(); 34177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestFactory1 tf1 = new TestFactory1(); 34187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public boolean visible() 34217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (tf.visible() != true) { 3423b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín errln("NumberFormatFactory.visible() was suppose to return true."); 34247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public NumberFormat createFormat(Locale loc, int formatType) 34287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (tf.createFormat(new Locale(""), 0) != null) { 3430b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín errln("NumberFormatFactory.createFormat(Locale loc, int formatType) " + "was suppose to return null"); 34317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public NumberFormat createFormat(ULocale loc, int formatType) 34357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (tf1.createFormat(new ULocale(""), 0) != null) { 3437b040d2280dfc88dfb44693d28c9029e7b8dbae1cFelipe Balbontín errln("NumberFormatFactory.createFormat(ULocale loc, int formatType) " + "was suppose to return null"); 34387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the class public static abstract class SimpleNumberFormatFactory extends NumberFormatFactory 34437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSimpleNumberFormatFactory() { 34457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestSimpleNumberFormatFactory extends SimpleNumberFormatFactory { 34467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public SimpleNumberFormatFactory(Locale locale) 34487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestSimpleNumberFormatFactory() { 34507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert super(new Locale("")); 34517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("unused") 34547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestSimpleNumberFormatFactory tsnff = new TestSimpleNumberFormatFactory(); 34557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 34587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public static ULocale[] getAvailableLocales() 34597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 34607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("static-access") 34617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestGetAvailableLocales() { 34627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "if (shim == null)" is true 34637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("serial") 34647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestGetAvailableLocales extends NumberFormat { 34657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { 34677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) { 34727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(BigInteger number, StringBuffer toAppendTo, FieldPosition pos) { 34777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) { 34827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) { 34877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 34917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Number parse(String text, ParsePosition parsePosition) { 34927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 34937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 34957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 34967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 34977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestGetAvailableLocales test = new TestGetAvailableLocales(); 34987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.getAvailableLocales(); 34997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 35007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getAvailableLocales() was not suppose to " 35017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "return an exception when getting getting available locales."); 35027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 35067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public void setMinimumIntegerDigits(int newValue) 35077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 35087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSetMinimumIntegerDigits() { 35097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = NumberFormat.getInstance(); 35107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // For valid array, it is displayed as {min value, max value} 35117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests when "if (minimumIntegerDigits > maximumIntegerDigits)" is true 35127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[][] cases = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 2, 0 }, { 2, 1 }, { 10, 0 } }; 35137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] expectedMax = { 0, 1, 1, 2, 2, 10 }; 35147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (cases.length != expectedMax.length) { 35157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Can't continue test case method TestSetMinimumIntegerDigits " 35167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "since the test case arrays are unequal."); 35177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 35187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < cases.length; i++) { 35197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setMaximumIntegerDigits(cases[i][1]); 35207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf.setMinimumIntegerDigits(cases[i][0]); 35217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (nf.getMaximumIntegerDigits() != expectedMax[i]) { 35227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.setMinimumIntegerDigits(int newValue " 35237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + "did not return an expected result for parameter " + cases[i][1] + " and " + cases[i][0] 35247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + " and expected " + expectedMax[i] + " but got " + nf.getMaximumIntegerDigits()); 35257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 35317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Tests the method public int getRoundingMode() public void setRoundingMode(int roundingMode) 35327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 35337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRoundingMode() { 35347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @SuppressWarnings("serial") 35357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class TestRoundingMode extends NumberFormat { 35367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { 35387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) { 35437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(BigInteger number, StringBuffer toAppendTo, FieldPosition pos) { 35487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) { 35537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) { 35587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 35627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Number parse(String text, ParsePosition parsePosition) { 35637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 35647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TestRoundingMode tgrm = new TestRoundingMode(); 35677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests the function 'public void setRoundingMode(int roundingMode)' 35697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 35707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tgrm.setRoundingMode(0); 35717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.setRoundingMode(int) was suppose to return an exception"); 35727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 35737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Tests the function 'public int getRoundingMode()' 35767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 35777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tgrm.getRoundingMode(); 35787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.getRoundingMode() was suppose to return an exception"); 35797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 35807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 35827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 35847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Testing lenient decimal/grouping separator parsing 35857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 35867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestLenientSymbolParsing() { 35877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(); 35887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols sym = new DecimalFormatSymbols(); 35897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "12\u300234", 12.34); 35917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Ticket#7345 - case 1 35937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Even strict parsing, the decimal separator set in the symbols 35947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // should be successfully parsed. 35957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setDecimalSeparator('\u3002'); 35977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 35987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // non-strict 35997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setDecimalFormatSymbols(sym); 36007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // strict - failed before the fix for #7345 36027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseStrict(true); 36037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "23\u300245", 23.45); 36047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseStrict(false); 36057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Ticket#7345 - case 2 36087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Decimal separator variants other than DecimalFormatSymbols.decimalSeparator 36097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // should not hide the grouping separator DecimalFormatSymbols.groupingSeparator. 36107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setDecimalSeparator('.'); 36117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setGroupingSeparator(','); 36127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setDecimalFormatSymbols(sym); 36137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "1,234.56", 1234.56); 36157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setGroupingSeparator('\uFF61'); 36177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setDecimalFormatSymbols(sym); 36187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "2\uFF61345.67", 2345.67); 36207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Ticket#7128 36227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 36237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sym.setGroupingSeparator(','); 36247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setDecimalFormatSymbols(sym); 36257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String skipExtSepParse = ICUConfig.get("com.ibm.icu.text.DecimalFormat.SkipExtendedSeparatorParsing", "false"); 36277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (skipExtSepParse.equals("true")) { 36287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // When the property SkipExtendedSeparatorParsing is true, 36297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // DecimalFormat does not use the extended equivalent separator 36307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // data and only uses the one in DecimalFormatSymbols. 36317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "23 456", 23); 36327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 36337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Lenient separator parsing is enabled by default. 36347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // A space character below is interpreted as a 36357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // group separator, even ',' is used as grouping 36367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // separator in the symbols. 36377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect(fmt, "12 345", 12345); 36387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 36427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Testing currency driven max/min fraction digits problem 36437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * reported by ticket#7282 36447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 36457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyFractionDigits() { 36467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double value = 99.12345; 36477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Create currency instance 36497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat cfmt = NumberFormat.getCurrencyInstance(new ULocale("ja_JP")); 36507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text1 = cfmt.format(value); 36517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Reset the same currency and format the test value again 36537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cfmt.setCurrency(cfmt.getCurrency()); 36547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text2 = cfmt.format(value); 36557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // output1 and output2 must be identical 36577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!text1.equals(text2)) { 36587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format() should return the same result - text1=" 36597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + text1 + " text2=" + text2); 36607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 36647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Testing rounding to negative zero problem 36657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * reported by ticket#7609 36667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 36677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestNegZeroRounding() { 36687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(); 36707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setRoundingMode(MathContext.ROUND_HALF_UP); 36717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setMinimumFractionDigits(1); 36727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setMaximumFractionDigits(1); 36737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text1 = df.format(-0.01); 36747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert df.setRoundingIncrement(0.1); 36767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String text2 = df.format(-0.01); 36777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // output1 and output2 must be identical 36797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!text1.equals(text2)) { 36807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NumberFormat.format() should return the same result - text1=" 36817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + text1 + " text2=" + text2); 36827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyAmountCoverage() { 36877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyAmount ca, cb; 36887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 36897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 36907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ca = new CurrencyAmount(null, null); 36917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NullPointerException should have been thrown."); 36927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (NullPointerException ex) { 36937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 36957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ca = new CurrencyAmount(new Integer(0), null); 36967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("NullPointerException should have been thrown."); 36977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (NullPointerException ex) { 36987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 36997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ca = new CurrencyAmount(new Integer(0), Currency.getInstance(new ULocale("ja_JP"))); 37017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cb = new CurrencyAmount(new Integer(1), Currency.getInstance(new ULocale("ja_JP"))); 37027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (ca.equals(null)) { 37037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Comparison should return false."); 37047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!ca.equals(ca)) { 37067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Comparision should return true."); 37077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (ca.equals(cb)) { 37097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Comparison should return false."); 37107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestExponentParse() { 37147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition parsePos = new ParsePosition(0); 37157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US); 37167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("#####", symbols); 37177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number result = fmt.parse("5.06e-27", parsePos); 37187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ( result.doubleValue() != 5.06E-27 || parsePos.getIndex() != 8) { 37197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("ERROR: ERROR: parse failed - expected 5.06E-27, 8; got " + result.doubleValue() + ", " + parsePos.getIndex()); 37207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestExplicitParents() { 37247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // We use these for testing because decimal and grouping separators will be inherited from es_419 37257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // starting with CLDR 2.0 37267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] DATA = { 37277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "CO", "", "1.250,75", 37287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "ES", "", "1.250,75", 37297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "GQ", "", "1.250,75", 37307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "MX", "", "1,250.75", 37317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "US", "", "1,250.75", 37327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "es", "VE", "", "1.250,75", 37337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 37357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i=0; i<DATA.length; i+=4) { 37377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale locale = new Locale(DATA[i], DATA[i+1], DATA[i+2]); 37387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat fmt = NumberFormat.getInstance(locale); 37397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = fmt.format(1250.75); 37407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (s.equals(DATA[i+3])) { 37417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Ok: 1250.75 x " + locale + " => " + s); 37427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 37437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: 1250.75 x " + locale + " => " + s + 37447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", expected " + DATA[i+3]); 37457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 37507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test case for #9240 37517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ICU4J 49.1 DecimalFormat did not clone the internal object holding 37527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * formatted text attribute information properly. Therefore, DecimalFormat 37537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * created by cloning may return incorrect results or may throw an exception 37547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * when formatToCharacterIterator is invoked from multiple threads. 37557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 37567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFormatToCharacterIteratorThread() { 37577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final int COUNT = 10; 37587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt1 = new DecimalFormat("#0"); 37607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt2 = (DecimalFormat)fmt1.clone(); 37617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] res1 = new int[COUNT]; 37637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] res2 = new int[COUNT]; 37647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Thread t1 = new Thread(new FormatCharItrTestThread(fmt1, 1, res1)); 37667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Thread t2 = new Thread(new FormatCharItrTestThread(fmt2, 100, res2)); 37677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert t1.start(); 37697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert t2.start(); 37707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 37727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert t1.join(); 37737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert t2.join(); 37747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (InterruptedException e) { 37757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //TODO 37767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int val1 = res1[0]; 37797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int val2 = res2[0]; 37807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < COUNT; i++) { 37827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (res1[i] != val1) { 37837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Inconsistent first run limit in test thread 1"); 37847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (res2[i] != val2) { 37867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Inconsistent first run limit in test thread 2"); 37877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 37907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseMaxDigits() { 37927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(); 37937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String number = "100000000000"; 37947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int newParseMax = number.length() - 1; 37957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseMaxDigits(-1); 37977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 37987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Default value is 1000 */ 37997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fmt.getParseMaxDigits() != 1000) { 38007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Fail valid value checking in setParseMaxDigits."); 38017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 38047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fmt.parse(number).doubleValue() == Float.POSITIVE_INFINITY) { 38057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Got Infinity but should NOT when parsing number: " + number); 38067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setParseMaxDigits(newParseMax); 38097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fmt.parse(number).doubleValue() != Float.POSITIVE_INFINITY) { 38117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Did not get Infinity but should when parsing number: " + number); 38127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException ex) { 38147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static class FormatCharItrTestThread implements Runnable { 38197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final NumberFormat fmt; 38207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int num; 38217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final int[] result; 38227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FormatCharItrTestThread(NumberFormat fmt, int num, int[] result) { 38247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.fmt = fmt; 38257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.num = num; 38267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.result = result; 38277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void run() { 38307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < result.length; i++) { 38317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert AttributedCharacterIterator acitr = fmt.formatToCharacterIterator(num); 38327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert acitr.first(); 38337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result[i] = acitr.getRunLimit(); 38347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestRoundingBehavior() { 38397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final Object[][] TEST_CASES = { 38407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 38417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.US, // ULocale - null for default locale 38427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "#.##", // Pattern 38437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer.valueOf(BigDecimal.ROUND_DOWN), // Rounding Mode or null (implicit) 38447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(0.0d), // Rounding increment, Double or BigDecimal, or null (implicit) 38457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(123.4567d), // Input value, Long, Double, BigInteger or BigDecimal 38467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.45" // Expected result, null for exception 38477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 38487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 38497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.US, 38507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "#.##", 38517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert null, 38527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(0.1d), 38537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(123.4567d), 38547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.5" 38557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 38567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 38577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.US, 38587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "#.##", 38597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer.valueOf(BigDecimal.ROUND_DOWN), 38607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(0.1d), 38617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(123.4567d), 38627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.4" 38637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 38647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 38657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.US, 38667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "#.##", 38677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer.valueOf(BigDecimal.ROUND_UNNECESSARY), 38687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert null, 38697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(123.4567d), 38707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert null 38717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 38727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 38737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale.US, 38747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "#.##", 38757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer.valueOf(BigDecimal.ROUND_DOWN), 38767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert null, 38777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Long.valueOf(1234), 38787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1234" 38797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }, 38807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 38817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int testNum = 1; 38837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (Object[] testCase : TEST_CASES) { 38857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 0: locale 38867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 1: pattern 38877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = testCase[0] == null ? ULocale.getDefault() : (ULocale)testCase[0]; 38887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern = (String)testCase[1]; 38897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance(locale)); 38917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 2: rounding mode 38937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer roundingMode = null; 38947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testCase[2] != null) { 38957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundingMode = (Integer)testCase[2]; 38967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setRoundingMode(roundingMode); 38977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 38987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 38997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 3: rounding increment 39007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testCase[3] != null) { 39017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testCase[3] instanceof Double) { 39027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setRoundingIncrement((Double)testCase[3]); 39037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (testCase[3] instanceof BigDecimal) { 39047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setRoundingIncrement((BigDecimal)testCase[3]); 39057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (testCase[3] instanceof java.math.BigDecimal) { 39067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setRoundingIncrement((java.math.BigDecimal)testCase[3]); 39077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 4: input number 39117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = null; 39127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean bException = false; 39137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 39147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = fmt.format(testCase[4]); 39157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ArithmeticException e) { 39167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bException = true; 39177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (bException) { 39207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testCase[5] != null) { 39217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Test case #" + testNum + ": ArithmeticException was thrown."); 39227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 39247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (testCase[5] == null) { 39257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Test case #" + testNum + 39267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ": ArithmeticException must be thrown, but got formatted result: " + 39277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s); 39287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 39297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test case #" + testNum, (String)testCase[5], s); 39307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert testNum++; 39347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestSignificantDigits() { 39387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double input[] = { 39397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0, 0, 39407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 123, -123, 39417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12345, -12345, 39427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 123.45, -123.45, 39437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 123.44501, -123.44501, 39447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.001234, -0.001234, 39457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.00000000123, -0.00000000123, 39467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.0000000000000000000123, -0.0000000000000000000123, 39477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1.2, -1.2, 39487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.0000000012344501, -0.0000000012344501, 39497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 123445.01, -123445.01, 39507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 12344501000000000000000000000000000.0, -12344501000000000000000000000000000.0, 39517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 39527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] expected = { 39537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.00", "0.00", 39547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123", "-123", 39557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12345", "-12345", 39567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.45", "-123.45", 39577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123.45", "-123.45", 39587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.001234", "-0.001234", 39597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.00000000123", "-0.00000000123", 39607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.0000000000000000000123", "-0.0000000000000000000123", 39617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "1.20", "-1.20", 39627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "0.0000000012345", "-0.0000000012345", 39637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "123450", "-123450", 39647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "12345000000000000000000000000000000", "-12345000000000000000000000000000000", 39657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 39667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat numberFormat = 39677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (DecimalFormat) NumberFormat.getInstance(ULocale.US); 39687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setSignificantDigitsUsed(true); 39697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMinimumSignificantDigits(3); 39707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMaximumSignificantDigits(5); 39717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setGroupingUsed(false); 39727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < input.length; i++) { 39737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("TestSignificantDigits", expected[i], numberFormat.format(input[i])); 39747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestBug9936() { 39787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat numberFormat = 39797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (DecimalFormat) NumberFormat.getInstance(ULocale.US); 39807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertFalse("", numberFormat.areSignificantDigitsUsed()); 39817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setSignificantDigitsUsed(true); 39837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertTrue("", numberFormat.areSignificantDigitsUsed()); 39847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setSignificantDigitsUsed(false); 39867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertFalse("", numberFormat.areSignificantDigitsUsed()); 39877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMinimumSignificantDigits(3); 39897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertTrue("", numberFormat.areSignificantDigitsUsed()); 39907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setSignificantDigitsUsed(false); 39927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMaximumSignificantDigits(6); 39937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertTrue("", numberFormat.areSignificantDigitsUsed()); 39947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 39957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 39967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestShowZero() { 39977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat numberFormat = 39987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (DecimalFormat) NumberFormat.getInstance(ULocale.US); 39997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setSignificantDigitsUsed(true); 40007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMaximumSignificantDigits(3); 40017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("TestShowZero", "0", numberFormat.format(0.0)); 40027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyPlurals() { 40057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] tests = { 40067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "USD", "1", "1 US dollar"}, 40077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "USD", "1.0", "1.0 US dollars"}, 40087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "USD", "1.00", "1.00 US dollars"}, 40097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "USD", "1.99", "1.99 US dollars"}, 40107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "AUD", "1", "1 Australian dollar"}, 40117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"en", "AUD", "1.00", "1.00 Australian dollars"}, 40127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"sl", "USD", "1", "1 ameri\u0161ki dolar"}, 40137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"sl", "USD", "2", "2 ameri\u0161ka dolarja"}, 40147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"sl", "USD", "3", "3 ameri\u0161ki dolarji"}, 40157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"sl", "USD", "5", "5 ameriških dolarjev"}, 40167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"fr", "USD", "1.99", "1,99 dollar des États-Unis"}, 40177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"ru", "RUB", "1", "1 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0439 \u0440\u0443\u0431\u043B\u044C"}, 40187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"ru", "RUB", "2", "2 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0445 \u0440\u0443\u0431\u043B\u044F"}, 40197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert {"ru", "RUB", "5", "5 \u0440\u043E\u0441\u0441\u0438\u0439\u0441\u043A\u0438\u0445 \u0440\u0443\u0431\u043B\u0435\u0439"}, 40207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 40217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (String test[] : tests) { 40227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat numberFormat = (DecimalFormat) DecimalFormat.getInstance(new ULocale(test[0]), NumberFormat.PLURALCURRENCYSTYLE); 40237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setCurrency(Currency.getInstance(test[1])); 40247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double number = Double.parseDouble(test[2]); 40257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int dotPos = test[2].indexOf('.'); 40267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int decimals = dotPos < 0 ? 0 : test[2].length() - dotPos - 1; 40277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int digits = dotPos < 0 ? test[2].length() : test[2].length() - 1; 40287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMaximumFractionDigits(decimals); 40297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMinimumFractionDigits(decimals); 40307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String actual = numberFormat.format(number); 40317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(test[0] + "\t" + test[1] + "\t" + test[2], test[3], actual); 40327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMaximumSignificantDigits(digits); 40337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numberFormat.setMinimumSignificantDigits(digits); 40347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert actual = numberFormat.format(number); 40357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals(test[0] + "\t" + test[1] + "\t" + test[2], test[3], actual); 40367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCustomCurrencySignAndSeparator() { 40407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols custom = new DecimalFormatSymbols(ULocale.US); 40417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom.setCurrencySymbol("*"); 40437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom.setMonetaryGroupingSeparator('^'); 40447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom.setMonetaryDecimalSeparator(':'); 40457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = new DecimalFormat("\u00A4 #,##0.00", custom); 40477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final String numstr = "* 1^234:56"; 40497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expect2(fmt, 1234.56, numstr); 40507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseSignsAndMarks() { 40537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class SignsAndMarksItem { 40547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String locale; 40557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean lenient; 40567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String numString; 40577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public double value; 40587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Simple constructor 40597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public SignsAndMarksItem(String loc, boolean lnt, String numStr, double val) { 40607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert locale = loc; 40617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lenient = lnt; 40627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numString = numStr; 40637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert value = val; 40647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 40657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 40667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final SignsAndMarksItem[] items = { 40677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // *** Note, ICU4J lenient number parsing does not handle arbitrary whitespace, but can 40687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // treat some whitespace as a grouping separator. The cases marked *** below depend 40697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // on isGroupingUsed() being set for the locale, which in turn depends on grouping 40707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // separators being present in the decimalFormat pattern for the locale (& num sys). 40717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // 40727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // locale lenient numString value 40737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", false, "12", 12 ), 40747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", true, "12", 12 ), 40757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", false, "-23", -23 ), 40767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", true, "-23", -23 ), 40777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", true, "- 23", -23 ), // *** 40787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", false, "\u200E-23", -23 ), 40797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", true, "\u200E-23", -23 ), 40807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en", true, "\u200E- 23", -23 ), // *** 40817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", false, "\u0663\u0664", 34 ), 40837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", true, "\u0663\u0664", 34 ), 40847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", false, "-\u0664\u0665", -45 ), 40857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", true, "-\u0664\u0665", -45 ), 40867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", true, "- \u0664\u0665", -45 ), // *** 40877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", false, "\u200F-\u0664\u0665", -45 ), 40887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", true, "\u200F-\u0664\u0665", -45 ), 40897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arab", true, "\u200F- \u0664\u0665", -45 ), // *** 40907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", false, "\u06F5\u06F6", 56 ), 40927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", true, "\u06F5\u06F6", 56 ), 40937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", false, "-\u06F6\u06F7", -67 ), 40947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", true, "-\u06F6\u06F7", -67 ), 40957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", true, "- \u06F6\u06F7", -67 ), // *** 40967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", false, "\u200E-\u200E\u06F6\u06F7", -67 ), 40977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", true, "\u200E-\u200E\u06F6\u06F7", -67 ), 40987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("en@numbers=arabext", true, "\u200E-\u200E \u06F6\u06F7", -67 ), // *** 40997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", false, "12", 12 ), 41017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", true, "12", 12 ), 41027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", false, "-23", -23 ), 41037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", true, "-23", -23 ), 41047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", true, "- 23", -23 ), // *** 41057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", false, "\u200E-23", -23 ), 41067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", true, "\u200E-23", -23 ), 41077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("he", true, "\u200E- 23", -23 ), // *** 41087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", false, "\u0663\u0664", 34 ), 41107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", true, "\u0663\u0664", 34 ), 41117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", false, "-\u0664\u0665", -45 ), 41127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", true, "-\u0664\u0665", -45 ), 41137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", true, "- \u0664\u0665", -45 ), // *** 41147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", false, "\u200F-\u0664\u0665", -45 ), 41157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", true, "\u200F-\u0664\u0665", -45 ), 41167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar", true, "\u200F- \u0664\u0665", -45 ), // *** 41177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", false, "12", 12 ), 41197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", true, "12", 12 ), 41207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", false, "-23", -23 ), 41217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", true, "-23", -23 ), 41227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", true, "- 23", -23 ), // *** 41237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", false, "\u200E-23", -23 ), 41247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", true, "\u200E-23", -23 ), 41257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ar_MA", true, "\u200E- 23", -23 ), // *** 41267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", false, "\u06F5\u06F6", 56 ), 41287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", true, "\u06F5\u06F6", 56 ), 41297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", false, "\u2212\u06F6\u06F7", -67 ), 41307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", true, "\u2212\u06F6\u06F7", -67 ), 41317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", true, "\u2212 \u06F6\u06F7", -67 ), // *** 41327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", false, "\u200E\u2212\u200E\u06F6\u06F7", -67 ), 41337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", true, "\u200E\u2212\u200E\u06F6\u06F7", -67 ), 41347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("fa", true, "\u200E\u2212\u200E \u06F6\u06F7", -67 ), // *** 41357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", false, "\u06F5\u06F6", 56 ), 41377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "\u06F5\u06F6", 56 ), 41387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", false, "-\u06F6\u06F7", -67 ), 41397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "-\u06F6\u06F7", -67 ), 41407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "- \u06F6\u06F7", -67 ), // *** 41417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", false, "\u200E-\u200E\u06F6\u06F7", -67 ), 41427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "\u200E-\u200E\u06F6\u06F7", -67 ), 41437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "\u200E-\u200E \u06F6\u06F7", -67 ), // *** 41447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", false, "-\u200E\u06F6\u06F7", -67 ), 41457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "-\u200E\u06F6\u06F7", -67 ), 41467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new SignsAndMarksItem("ps", true, "-\u200E \u06F6\u06F7", -67 ), // *** 41477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 41487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (SignsAndMarksItem item: items) { 41497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale locale = new ULocale(item.locale); 41507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat numfmt = NumberFormat.getInstance(locale); 41517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (numfmt != null) { 41527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert numfmt.setParseStrict(!item.lenient); 41537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition ppos = new ParsePosition(0); 41547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number num = numfmt.parse(item.numString, ppos); 41557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (num != null && ppos.getIndex() == item.numString.length()) { 41567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double parsedValue = num.doubleValue(); 41577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (parsedValue != item.value) { 41587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: locale " + item.locale + ", lenient " + item.lenient + ", parse of \"" + item.numString + "\" gives value " + parsedValue); 41597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 41617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: locale " + item.locale + ", lenient " + item.lenient + ", parse of \"" + item.numString + "\" gives position " + ppos.getIndex()); 41627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 41647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: NumberFormat.getInstance for locale " + item.locale); 41657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestContext() { 41707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // just a minimal sanity check for now 41717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nfmt = NumberFormat.getInstance(); 41727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DisplayContext context = nfmt.getContext(DisplayContext.Type.CAPITALIZATION); 41737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (context != DisplayContext.CAPITALIZATION_NONE) { 41747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Initial NumberFormat.getContext() is not CAPITALIZATION_NONE"); 41757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nfmt.setContext(DisplayContext.CAPITALIZATION_FOR_STANDALONE); 41777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert context = nfmt.getContext(DisplayContext.Type.CAPITALIZATION); 41787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (context != DisplayContext.CAPITALIZATION_FOR_STANDALONE) { 41797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: NumberFormat.getContext() does not return the value set, CAPITALIZATION_FOR_STANDALONE"); 41807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 41827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 41837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestAccountingCurrency() { 41847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[][] tests = { 4185bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert //locale num curr fmt per loc curr std fmt curr acct fmt rt 4186bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US", "1234.5", "$1,234.50", "$1,234.50", "$1,234.50", "true"}, 4187bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US@cf=account", "1234.5", "$1,234.50", "$1,234.50", "$1,234.50", "true"}, 4188bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US", "-1234.5", "-$1,234.50", "-$1,234.50", "($1,234.50)", "true"}, 4189bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US@cf=standard", "-1234.5", "-$1,234.50", "-$1,234.50", "($1,234.50)", "true"}, 4190bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US@cf=account", "-1234.5", "($1,234.50)", "-$1,234.50", "($1,234.50)", "true"}, 4191bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US", "0", "$0.00", "$0.00", "$0.00", "true"}, 4192bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US", "-0.2", "-$0.20", "-$0.20", "($0.20)", "true"}, 4193bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US@cf=standard", "-0.2", "-$0.20", "-$0.20", "($0.20)", "true"}, 4194bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"en_US@cf=account", "-0.2", "($0.20)", "-$0.20", "($0.20)", "true"}, 4195bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"ja_JP", "10000", "¥10,000", "¥10,000", "¥10,000", "true" }, 4196bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"ja_JP", "-1000.5", "-¥1,000", "-¥1,000", "(¥1,000)", "false"}, 4197bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"ja_JP@cf=account", "-1000.5", "(¥1,000)", "-¥1,000", "(¥1,000)", "false"}, 4198bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert {"de_DE", "-23456.7", "-23.456,70\u00A0€", "-23.456,70\u00A0€", "-23.456,70\u00A0€", "true" }, 41997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 42007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (String[] data : tests) { 42017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale loc = new ULocale(data[0]); 42027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double num = Double.parseDouble(data[1]); 4203bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String fmtPerLocExpected = data[2]; 4204bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String fmtStandardExpected = data[3]; 4205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert String fmtAccountExpected = data[4]; 4206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert boolean rt = Boolean.parseBoolean(data[5]); 4207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 4208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert NumberFormat fmtPerLoc = NumberFormat.getInstance(loc, NumberFormat.CURRENCYSTYLE); 4209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert expect(fmtPerLoc, num, fmtPerLocExpected, rt); 4210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 4211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert NumberFormat fmtStandard = NumberFormat.getInstance(loc, NumberFormat.STANDARDCURRENCYSTYLE); 4212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert expect(fmtStandard, num, fmtStandardExpected, rt); 42137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4214bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert NumberFormat fmtAccount = NumberFormat.getInstance(loc, NumberFormat.ACCOUNTINGCURRENCYSTYLE); 4215bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert expect(fmtAccount, num, fmtAccountExpected, rt); 42167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrencyUsage() { 42207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the 1st one is checking setter/getter, while the 2nd one checks for getInstance 42217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // compare the Currency and Currency Cash Digits 42227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Note that as of CLDR 26: 42237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // * TWD switches from 0 decimals to 2; PKR still has 0, so change test to that 422487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // * CAD rounds to .05 in the cash style only. 42257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 2; i++) { 42267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String original_expected = "PKR124"; 42277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat custom = null; 42287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (i == 0) { 42297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=PKR"), 42307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat.CURRENCYSTYLE); 42317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String original = custom.format(123.567); 42337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context", original_expected, original); 42347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test the getter 42367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(), 42377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Currency.CurrencyUsage.STANDARD); 42387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom.setCurrencyUsage(Currency.CurrencyUsage.CASH); 42397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(), Currency.CurrencyUsage.CASH); 42407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 42417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert custom = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=PKR"), 42427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat.CASHCURRENCYSTYLE); 42437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // test the getter 42457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context Purpose", custom.getCurrencyUsage(), Currency.CurrencyUsage.CASH); 42467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String cash_currency = custom.format(123.567); 42497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String cash_currency_expected = "PKR124"; 42507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context", cash_currency_expected, cash_currency); 42517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the 1st one is checking setter/getter, while the 2nd one checks for getInstance 42547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // compare the Currency and Currency Cash Rounding 42557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 2; i++) { 42567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String original_rounding_expected = "CA$123.57"; 42577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt = null; 42587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (i == 0) { 42597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=CAD"), 42607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat.CURRENCYSTYLE); 42617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String original_rounding = fmt.format(123.566); 42637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context", original_rounding_expected, original_rounding); 42647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt.setCurrencyUsage(Currency.CurrencyUsage.CASH); 42667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 42677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt = (DecimalFormat) DecimalFormat.getInstance(new ULocale("en_US@currency=CAD"), 42687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat.CASHCURRENCYSTYLE); 42697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String cash_rounding_currency = fmt.format(123.567); 427287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert String cash__rounding_currency_expected = "CA$123.55"; 42737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context", cash__rounding_currency_expected, cash_rounding_currency); 42747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // the 1st one is checking setter/getter, while the 2nd one checks for getInstance 42777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test the currency change 42787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < 2; i++) { 42797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat fmt2 = null; 42807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (i == 1) { 42817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt2 = (DecimalFormat) NumberFormat.getInstance(new ULocale("en_US@currency=JPY"), 42827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.CURRENCYSTYLE); 42837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt2.setCurrencyUsage(Currency.CurrencyUsage.CASH); 42847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 42857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt2 = (DecimalFormat) NumberFormat.getInstance(new ULocale("en_US@currency=JPY"), 42867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat.CASHCURRENCYSTYLE); 42877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fmt2.setCurrency(Currency.getInstance("PKR")); 42907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String PKR_changed = fmt2.format(123.567); 42917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String PKR_changed_expected = "PKR124"; 42927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("Test Currency Context", PKR_changed_expected, PKR_changed); 42937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 42957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestParseRequiredDecimalPoint() { 42977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 42987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] testPattern = { "00.####", "00.0", "00" }; 42997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String value2Parse = "99"; 43017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double parseValue = 99; 43027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat parser = new DecimalFormat(); 43037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double result; 43047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean hasDecimalPoint; 43057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < testPattern.length; i++) { 43067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parser.applyPattern(testPattern[i]); 43077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert hasDecimalPoint = testPattern[i].contains("."); 43087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parser.setDecimalPatternMatchRequired(false); 43107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 43117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = parser.parse(value2Parse).doubleValue(); 43127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert assertEquals("wrong parsed value", parseValue, result); 43137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 43147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.errln("Parsing " + value2Parse + " should have succeeded with " + testPattern[i] + 43157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired()); 43167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert parser.setDecimalPatternMatchRequired(true); 43197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 43207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = parser.parse(value2Parse).doubleValue(); 43217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(hasDecimalPoint){ 43227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.errln("Parsing " + value2Parse + " should NOT have succeeded with " + testPattern[i] + 43237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired()); 43247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 43267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // OK, should fail 43277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4331bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 4332bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public void TestDataDrivenICU() { 4333bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DataDrivenNumberFormatTestSuite.runSuite( 4334bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert this.params, "numberformattestspecification.txt", ICU); 4335bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 4336bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 4337bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public void TestDataDrivenJDK() { 4338bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert DataDrivenNumberFormatTestSuite.runSuite( 4339bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert this.params, "numberformattestspecification.txt", JDK); 4340bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 4341bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 43427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 43437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCurrFmtNegSameAsPositive() { 43447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormatSymbols decfmtsym = DecimalFormatSymbols.getInstance(Locale.US); 43457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert decfmtsym.setMinusSign('\u200B'); // ZERO WIDTH SPACE, in ICU4J cannot set to empty string 43467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DecimalFormat decfmt = new DecimalFormat("\u00A4#,##0.00;\u00A4#,##0.00", decfmtsym); 43477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String currFmtResult = decfmt.format(-100.0); 43487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!currFmtResult.equals("\u200B$100.00")) { 43497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("decfmt.toPattern results wrong, expected \u200B$100.00, got " + currFmtResult); 43507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 43527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4353bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert public void TestNumberFormatTestTupleToString() { 4354bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert new NumberFormatTestTuple().toString(); 4355bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert } 4356bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert 4357ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius // Testing for Issue 11805. 4358ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius public void TestFormatToCharacterIteratorIssue11805 () { 4359ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius final double number = -350.76; 4360ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfUS = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.US); 4361ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strUS = dfUS.format(number); 4362ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultUS = dfUS.formatToCharacterIterator(number).getAllAttributeKeys(); 4363ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative US Results: " + strUS, 5, resultUS.size()); 4364ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4365ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius // For each test, add assert that all the fields are present and in the right spot. 4366ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius // TODO: Add tests for identify and position of each field, as in IntlTestDecimalFormatAPIC. 4367ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4368ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfDE = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.GERMANY); 4369ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strDE = dfDE.format(number); 4370ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultDE = dfDE.formatToCharacterIterator(number).getAllAttributeKeys(); 4371ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative DE Results: " + strDE, 5, resultDE.size()); 4372ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4373ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfIN = (DecimalFormat) DecimalFormat.getCurrencyInstance(new Locale("hi", "in")); 4374ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strIN = dfIN.format(number); 4375ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultIN = dfIN.formatToCharacterIterator(number).getAllAttributeKeys(); 4376ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative IN Results: " + strIN, 5, resultIN.size()); 4377ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4378ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfJP = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.JAPAN); 4379ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strJP = dfJP.format(number); 4380ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultJP = dfJP.formatToCharacterIterator(number).getAllAttributeKeys(); 4381ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative JA Results: " + strJP, 3, resultJP.size()); 4382ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4383ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfGB = (DecimalFormat) DecimalFormat.getCurrencyInstance(new Locale("en", "gb")); 4384ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strGB = dfGB.format(number); 4385ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultGB = dfGB.formatToCharacterIterator(number).getAllAttributeKeys(); 4386ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative GB Results: " + strGB , 5, resultGB.size()); 4387ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4388ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfPlural = (DecimalFormat) NumberFormat.getInstance(new Locale("en", "gb"), 4389ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius NumberFormat.PLURALCURRENCYSTYLE); 4390ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius strGB = dfPlural.format(number); 4391ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius resultGB = dfPlural.formatToCharacterIterator(number).getAllAttributeKeys(); 4392ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative GB Results: " + strGB , 5, resultGB.size()); 4393ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4394ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius strGB = dfPlural.format(1); 4395ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius resultGB = dfPlural.formatToCharacterIterator(1).getAllAttributeKeys(); 4396ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative GB Results: " + strGB , 4, resultGB.size()); 4397ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4398ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius // Test output with unit value. 4399ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat auPlural = (DecimalFormat) NumberFormat.getInstance(new Locale("en", "au"), 4400ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius NumberFormat.PLURALCURRENCYSTYLE); 4401ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius String strAU = auPlural.format(1L); 4402ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius Set<AttributedCharacterIterator.Attribute> resultAU = 4403ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius auPlural.formatToCharacterIterator(1L).getAllAttributeKeys(); 4404ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Unit AU Result: " + strAU , 4, resultAU.size()); 4405ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 4406ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius // Verify Permille fields. 4407ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormatSymbols sym = new DecimalFormatSymbols(new Locale("en", "gb")); 4408ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius DecimalFormat dfPermille = new DecimalFormat("####0.##\u2030", sym); 4409ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius strGB = dfPermille.format(number); 4410ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius resultGB = dfPermille.formatToCharacterIterator(number).getAllAttributeKeys(); 4411ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius assertEquals("Negative GB Permille Results: " + strGB , 3, resultGB.size()); 4412ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius } 4413ca81e46089f05bbf370a2efb3b25552bb606fc61Craig Cornelius 44142391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // Testing for Issue 11808. 44152391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius public void TestRoundUnnecessarytIssue11808 () { 44162391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(); 44172391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius StringBuffer result = new StringBuffer(""); 44182391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius df.setRoundingMode(BigDecimal.ROUND_UNNECESSARY); 44192391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius df.applyPattern("00.0#E0"); 44202391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius 44212391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius try { 44222391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius df.format(99999.0, result, new FieldPosition(0)); 44232391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius fail("Missing ArithmeticException for double: " + result); 44242391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } catch (ArithmeticException expected) { 44252391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // The exception should be thrown, since rounding is needed. 44262391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 44272391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius 44282391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius try { 44292391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius result = df.format(99999, result, new FieldPosition(0)); 44302391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius fail("Missing ArithmeticException for int: " + result); 44312391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } catch (ArithmeticException expected) { 44322391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // The exception should be thrown, since rounding is needed. 44332391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 44342391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius 44352391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius try { 44362391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius result = df.format(new BigInteger("999999"), result, new FieldPosition(0)); 44372391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius fail("Missing ArithmeticException for BigInteger: " + result); 44382391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } catch (ArithmeticException expected) { 44392391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // The exception should be thrown, since rounding is needed. 44402391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 44412391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius 44422391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius try { 44432391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius result = df.format(new BigDecimal("99999"), result, new FieldPosition(0)); 44442391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius fail("Missing ArithmeticException for BigDecimal: " + result); 44452391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } catch (ArithmeticException expected) { 44462391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // The exception should be thrown, since rounding is needed. 44472391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 44482391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius 44492391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius try { 44502391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius result = df.format(new BigDecimal("-99999"), result, new FieldPosition(0)); 44512391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius fail("Missing ArithmeticException for BigDecimal: " + result); 44522391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } catch (ArithmeticException expected) { 44532391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius // The exception should be thrown, since rounding is needed. 44542391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 44552391a0f7a931341cbf7360f6870d3b4b2d7f5038Craig Cornelius } 445687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 445787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Testing for Issue 11735. 445887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert public void TestNPEIssue11735() { 445987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert DecimalFormat fmt = new DecimalFormat("0", new DecimalFormatSymbols(new ULocale("en"))); 446087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert ParsePosition ppos = new ParsePosition(0); 446187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert assertEquals("Currency symbol missing in parse. Expect null result.", 446287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert fmt.parseCurrency("53.45", ppos), null); 446387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 446487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 446587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert private void CompareAttributedCharacterFormatOutput(AttributedCharacterIterator iterator, 446687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> expected, String formattedOutput) { 446787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 446887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> result = new ArrayList<FieldContainer>(); 446987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert while (iterator.getIndex() != iterator.getEndIndex()) { 447087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert int start = iterator.getRunStart(); 447187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert int end = iterator.getRunLimit(); 447287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert Iterator it = iterator.getAttributes().keySet().iterator(); 447387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert while (it.hasNext()) { 447487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert AttributedCharacterIterator.Attribute attribute = (AttributedCharacterIterator.Attribute) it.next(); 447587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert Object value = iterator.getAttribute(attribute); 447687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 447787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert result.add(new FieldContainer(start, end, attribute, value)); 447887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 447987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert iterator.setIndex(end); 448087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 448187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert assertEquals("Comparing vector length for " + formattedOutput, 448287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert expected.size(), result.size()); 448387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 448487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert if (!expected.containsAll(result) || !result.containsAll(expected)) { 448587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Print information on the differences. 448687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert System.out.println(" "); 448787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert for (int i = 0; i < expected.size(); i++) { 448887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert System.out.println(" expected[" + i + "] = " + 448987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert expected.get(i).start + " " + 449087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert expected.get(i).end + " " + 449187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert expected.get(i).value); 449287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 449387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert for (int i = 0; i < result.size(); i++) { 449487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert System.out.println(" result[" + i + "] = " + 449587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert result.get(i).start + " " + 449687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert result.get(i).end + " " + 449787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert result.get(i).value); 449887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 449987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 450087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert assertTrue("Comparing vector results for " + formattedOutput, 450187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert expected.containsAll(result)); 450287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 450387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 450487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Testing for Issue 11914, missing FieldPositions for some field types. 450587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert public void TestNPEIssue11914() { 450687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // First test: Double value with grouping separators. 450787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> v1 = new ArrayList<FieldContainer>(7); 450887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(0, 3, NumberFormat.Field.INTEGER)); 450987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(3, 4, NumberFormat.Field.GROUPING_SEPARATOR)); 451087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(3, 4, NumberFormat.Field.INTEGER)); 451187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(4, 7, NumberFormat.Field.INTEGER)); 451287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(7, 8, NumberFormat.Field.GROUPING_SEPARATOR)); 451387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(7, 8, NumberFormat.Field.INTEGER)); 451487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(8, 11, NumberFormat.Field.INTEGER)); 451587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(11, 12, NumberFormat.Field.DECIMAL_SEPARATOR)); 451687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v1.add(new FieldContainer(12, 15, NumberFormat.Field.FRACTION)); 451787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 451887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert Number number = new Double(123456789.9753); 451987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert ULocale usLoc = new ULocale("en-US"); 452087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert DecimalFormatSymbols US = new DecimalFormatSymbols(usLoc); 452187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 452287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert NumberFormat outFmt = NumberFormat.getNumberInstance(usLoc); 452387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert String numFmtted = outFmt.format(number); 452487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert AttributedCharacterIterator iterator = 452587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert outFmt.formatToCharacterIterator(number); 452687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert CompareAttributedCharacterFormatOutput(iterator, v1, numFmtted); 452787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 452887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Second test: Double with scientific notation formatting. 452987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> v2 = new ArrayList<FieldContainer>(7); 453087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(0, 1, NumberFormat.Field.INTEGER)); 453187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(1, 2, NumberFormat.Field.DECIMAL_SEPARATOR)); 453287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(2, 5, NumberFormat.Field.FRACTION)); 453387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(5, 6, NumberFormat.Field.EXPONENT_SYMBOL)); 453487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(6, 7, NumberFormat.Field.EXPONENT_SIGN)); 453587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v2.add(new FieldContainer(7, 8, NumberFormat.Field.EXPONENT)); 453687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert DecimalFormat fmt2 = new DecimalFormat("0.###E+0", US); 453787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 453887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert numFmtted = fmt2.format(number); 453987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert iterator = fmt2.formatToCharacterIterator(number); 454087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert CompareAttributedCharacterFormatOutput(iterator, v2, numFmtted); 454187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 454287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Third test. BigInteger with grouping separators. 454387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> v3 = new ArrayList<FieldContainer>(7); 454487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(0, 1, NumberFormat.Field.SIGN)); 454587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(1, 2, NumberFormat.Field.INTEGER)); 454687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(2, 3, NumberFormat.Field.GROUPING_SEPARATOR)); 454787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(3, 6, NumberFormat.Field.INTEGER)); 454887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(2, 3, NumberFormat.Field.INTEGER)); 454987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(6, 7, NumberFormat.Field.GROUPING_SEPARATOR)); 455087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(6, 7, NumberFormat.Field.INTEGER)); 455187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(7, 10, NumberFormat.Field.INTEGER)); 455287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(10, 11, NumberFormat.Field.INTEGER)); 455387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(10, 11, NumberFormat.Field.GROUPING_SEPARATOR)); 455487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(11, 14, NumberFormat.Field.INTEGER)); 455587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(14, 15, NumberFormat.Field.INTEGER)); 455687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(14, 15, NumberFormat.Field.GROUPING_SEPARATOR)); 455787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(15, 18, NumberFormat.Field.INTEGER)); 455887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 455987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(18, 19, NumberFormat.Field.INTEGER)); 456087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(18, 19, NumberFormat.Field.GROUPING_SEPARATOR)); 456187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(19, 22, NumberFormat.Field.INTEGER)); 456287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(22, 23, NumberFormat.Field.INTEGER)); 456387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(22, 23, NumberFormat.Field.GROUPING_SEPARATOR)); 456487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v3.add(new FieldContainer(23, 26, NumberFormat.Field.INTEGER)); 456587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert BigInteger bigNumberInt = new BigInteger("-1234567890246813579"); 456687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert String fmtNumberBigInt = outFmt.format(bigNumberInt); 456787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 456887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert iterator = outFmt.formatToCharacterIterator(bigNumberInt); 456987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert CompareAttributedCharacterFormatOutput(iterator, v3, fmtNumberBigInt); 457087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 457187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // Fourth test: BigDecimal with exponential formatting. 457287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert List<FieldContainer> v4 = new ArrayList<FieldContainer>(7); 457387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(0, 1, NumberFormat.Field.SIGN)); 457487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(1, 2, NumberFormat.Field.INTEGER)); 457587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(2, 3, NumberFormat.Field.DECIMAL_SEPARATOR)); 457687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(3, 6, NumberFormat.Field.FRACTION)); 457787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(6, 7, NumberFormat.Field.EXPONENT_SYMBOL)); 457887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(7, 8, NumberFormat.Field.EXPONENT_SIGN)); 457987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert v4.add(new FieldContainer(8, 9, NumberFormat.Field.EXPONENT)); 458087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 458187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert java.math.BigDecimal numberBigD = new java.math.BigDecimal(-123456789); 458287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert String fmtNumberBigDExp = fmt2.format(numberBigD); 458387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 458487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert iterator = fmt2.formatToCharacterIterator(numberBigD); 458587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert CompareAttributedCharacterFormatOutput(iterator, v4, fmtNumberBigDExp); 458687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 458787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 458887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert public void test_formatToCharacterIterator() throws Exception { 458987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert AttributedCharacterIterator iterator; 459087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert int[] runStarts; 459187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert int[] runLimits; 459287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert String result; 459387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert char current; 459487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert // BigInteger. 459587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert iterator = new DecimalFormat().formatToCharacterIterator(new BigInteger("123456789")); 459687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert runStarts = new int[] { 0, 0, 0, 3, 4, 4, 4, 7, 8, 8, 8 }; 459787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert runLimits = new int[] { 3, 3, 3, 4, 7, 7, 7, 8, 11, 11, 11 }; 459887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert result = "123,456,789"; 459987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert current = iterator.current(); 460087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert for (int i = 0; i < runStarts.length; i++) { 460187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert assertEquals("wrong start @" + i, runStarts[i], iterator.getRunStart()); 460287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert assertEquals("wrong limit @" + i, runLimits[i], iterator.getRunLimit()); 460387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert assertEquals("wrong char @" + i, result.charAt(i), current); 460487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert current = iterator.next(); 460587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 460687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert assertEquals("Begin index:", 0, iterator.getBeginIndex()); 460787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert assertEquals("End index: ", 11, iterator.getEndIndex()); 460887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert } 460987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert 46106bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius private void checkFormatWithField(String testInfo, Format format, Object object, 46116bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String expected, Format.Field field, int begin, int end) { 46126bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius StringBuffer buffer = new StringBuffer(); 46136bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius FieldPosition pos = new FieldPosition(field); 46146bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius format.format(object, buffer, pos); 46156bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 46166bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius assertEquals("Test " + testInfo + ": incorrect formatted text", expected, buffer.toString()); 46176bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 46186bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius if (begin != pos.getBeginIndex() || end != pos.getEndIndex()) { 46196bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius assertEquals("Index mismatch", field + " " + begin + ".." + end, 46206bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius pos.getFieldAttribute() + " " + pos.getBeginIndex() + ".." + pos.getEndIndex()); 46216bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 46226bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 46236bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 46246bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsCurrency() { 46256bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat formatter = (DecimalFormat) NumberFormat.getCurrencyInstance(ULocale.US); 46266bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new Double(92314587.66); 46276bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String result = "$92,314,587.66"; 46286bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 46296bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("currency", formatter, number, result, 46306bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.CURRENCY, 0, 1); 46316bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", formatter, number, result, 46326bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 11); 46336bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("grouping separator", formatter, number, result, 46346bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.GROUPING_SEPARATOR, 3, 4); 46356bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", formatter, number, result, 46366bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 11, 12); 46376bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("fraction", formatter, number, result, 46386bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.FRACTION, 12, 14); 46396bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 46406bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 46416bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsNegativeDouble() { 46426bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // test for exponential fields with double 46436bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 46446bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new Double(-12345678.90123); 46456bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat formatter = new DecimalFormat("0.#####E+00", us_symbols); 46466bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String numFmtted = formatter.format(number); 46476bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 46486bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", formatter, number, numFmtted, 46496bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 46506bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", formatter, number, numFmtted, 46516bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 2); 46526bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", formatter, number, numFmtted, 46536bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3); 46546bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent symbol", formatter, number, numFmtted, 46556bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SYMBOL, 8, 9); 46566bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent sign", formatter, number, numFmtted, 46576bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SIGN, 9, 10); 46586bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent", formatter, number, numFmtted, 46596bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT, 10, 12); 46606bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 46616bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 46626bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsPerCent() { 46636bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // Check PERCENT 46646bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat percentFormat = (DecimalFormat) NumberFormat.getPercentInstance(ULocale.US); 46656bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new Double(-0.986); 46666bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String numberFormatted = percentFormat.format(number); 46676bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", percentFormat, number, numberFormatted, 46686bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 46696bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", percentFormat, number, numberFormatted, 46706bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 3); 46716bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("percent", percentFormat, number, numberFormatted, 46726bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.PERCENT, 3, 4); 46736bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 46746bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 46756bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsPerCentPattern() { 46766bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // Check PERCENT with more digits 46776bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 46786bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat fmtPercent = new DecimalFormat("0.#####%", us_symbols); 46796bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new Double(-0.986); 46806bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String numFmtted = fmtPercent.format(number); 46816bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 46826bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", fmtPercent, number, numFmtted, 46836bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 46846bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", fmtPercent, number, numFmtted, 46856bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 3); 46866bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", fmtPercent, number, numFmtted, 46876bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 3, 4); 46886bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("fraction", fmtPercent, number, numFmtted, 46896bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.FRACTION, 4, 5); 46906bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("percent", fmtPercent, number, numFmtted, 46916bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.PERCENT, 5, 6); 46926bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 46936bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 46946bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsPerMille() { 46956bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // Check PERMILLE 46966bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 46976bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat fmtPerMille = new DecimalFormat("0.######‰", us_symbols); 46986bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number numberPermille = new Double(-0.98654); 46996bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String numFmtted = fmtPerMille.format(numberPermille); 47006bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47016bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", fmtPerMille, numberPermille, numFmtted, 47026bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 47036bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", fmtPerMille, numberPermille, numFmtted, 47046bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 4); 47056bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", fmtPerMille, numberPermille, numFmtted, 47066bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 4, 5); 47076bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("fraction", fmtPerMille, numberPermille, numFmtted, 47086bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.FRACTION, 5, 7); 47096bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("permille", fmtPerMille, numberPermille, numFmtted, 47106bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.PERMILLE, 7, 8); 47116bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47126bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47136bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsNegativeBigInt() { 47146bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 47156bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat formatter = new DecimalFormat("0.#####E+0", us_symbols); 47166bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new BigDecimal("-123456789987654321"); 47176bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String bigDecFmtted = formatter.format(number); 47186bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47196bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", formatter, number, bigDecFmtted, 47206bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 47216bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", formatter, number, bigDecFmtted, 47226bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 2); 47236bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", formatter, number, bigDecFmtted, 47246bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3); 47256bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent symbol", formatter, number, bigDecFmtted, 47266bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SYMBOL, 8, 9); 47276bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent sign", formatter, number, bigDecFmtted, 47286bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SIGN, 9, 10); 47296bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent", formatter, number, bigDecFmtted, 47306bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT, 10, 12); 47316bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47326bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47336bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsNegativeLong() { 47346bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number number = new Long("-123456789987654321"); 47356bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 47366bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat formatter = new DecimalFormat("0.#####E+0", us_symbols); 47376bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String longFmtted = formatter.format(number); 47386bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47396bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", formatter, number, longFmtted, 47406bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 47416bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", formatter, number, longFmtted, 47426bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 2); 47436bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", formatter, number, longFmtted, 47446bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3); 47456bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent symbol", formatter, number, longFmtted, 47466bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SYMBOL, 8, 9); 47476bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent sign", formatter, number, longFmtted, 47486bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SIGN, 9, 10); 47496bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent", formatter, number, longFmtted, 47506bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT, 10, 12); 47516bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47526bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47536bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsPositiveBigDec() { 47546bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // Check complex positive;negative pattern. 47556bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 47566bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat fmtPosNegSign = new DecimalFormat("+0.####E+00;-0.#######E+0", us_symbols); 47576bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number positiveExp = new Double("9876543210"); 47586bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String posExpFormatted = fmtPosNegSign.format(positiveExp); 47596bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47606bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", fmtPosNegSign, positiveExp, posExpFormatted, 47616bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 47626bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", fmtPosNegSign, positiveExp, posExpFormatted, 47636bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 2); 47646bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", fmtPosNegSign, positiveExp, posExpFormatted, 47656bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3); 47666bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("fraction", fmtPosNegSign, positiveExp, posExpFormatted, 47676bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.FRACTION, 3, 7); 47686bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent symbol", fmtPosNegSign, positiveExp, posExpFormatted, 47696bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SYMBOL, 7, 8); 47706bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent sign", fmtPosNegSign, positiveExp, posExpFormatted, 47716bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SIGN, 8, 9); 47726bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent", fmtPosNegSign, positiveExp, posExpFormatted, 47736bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT, 9, 11); 47746bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47756bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47766bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius public void TestMissingFieldPositionsNegativeBigDec() { 47776bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius // Check complex positive;negative pattern. 47786bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormatSymbols us_symbols = new DecimalFormatSymbols(ULocale.US); 47796bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius DecimalFormat fmtPosNegSign = new DecimalFormat("+0.####E+00;-0.#######E+0", us_symbols); 47806bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius Number negativeExp = new BigDecimal("-0.000000987654321083"); 47816bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius String negExpFormatted = fmtPosNegSign.format(negativeExp); 47826bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius 47836bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("sign", fmtPosNegSign, negativeExp, negExpFormatted, 47846bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.SIGN, 0, 1); 47856bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("integer", fmtPosNegSign, negativeExp, negExpFormatted, 47866bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.INTEGER, 1, 2); 47876bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("decimal separator", fmtPosNegSign, negativeExp, negExpFormatted, 47886bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3); 47896bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("fraction", fmtPosNegSign, negativeExp, negExpFormatted, 47906bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.FRACTION, 3, 7); 47916bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent symbol", fmtPosNegSign, negativeExp, negExpFormatted, 47926bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SYMBOL, 7, 8); 47936bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent sign", fmtPosNegSign, negativeExp, negExpFormatted, 47946bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT_SIGN, 8, 9); 47956bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius checkFormatWithField("exponent", fmtPosNegSign, negativeExp, negExpFormatted, 47966bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius NumberFormat.Field.EXPONENT, 9, 11); 47976bc0a23cd1424dee52cba7d8b3041dc7645e5773Craig Cornelius } 47987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 4799