2 *******************************************************************************
3 * Copyright (C) 2015, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
7 * File NUMBERFORMAT2TEST.CPP
9 *******************************************************************************
11 #include "unicode/utypes.h"
15 #if !UCONFIG_NO_FORMATTING
17 #include "unicode/localpointer.h"
18 #include "unicode/plurrule.h"
20 #include "affixpatternparser.h"
22 #include "datadrivennumberformattestsuite.h"
23 #include "decimalformatpattern.h"
24 #include "digitaffixesandpadding.h"
25 #include "digitformatter.h"
26 #include "digitgrouping.h"
27 #include "digitinterval.h"
30 #include "plurrule_impl.h"
31 #include "precision.h"
32 #include "significantdigitinterval.h"
33 #include "smallintformatter.h"
35 #include "valueformatter.h"
36 #include "visibledigits.h"
38 struct NumberFormat2Test_Attributes
{
44 class NumberFormat2Test_FieldPositionHandler
: public FieldPositionHandler
{
46 NumberFormat2Test_Attributes attributes
[100];
52 NumberFormat2Test_FieldPositionHandler() : count(0), bRecording(TRUE
) { attributes
[0].spos
= -1; }
53 NumberFormat2Test_FieldPositionHandler(UBool recording
) : count(0), bRecording(recording
) { attributes
[0].spos
= -1; }
54 virtual ~NumberFormat2Test_FieldPositionHandler();
55 virtual void addAttribute(int32_t id
, int32_t start
, int32_t limit
);
56 virtual void shiftLast(int32_t delta
);
57 virtual UBool
isRecording(void) const;
60 NumberFormat2Test_FieldPositionHandler::~NumberFormat2Test_FieldPositionHandler() {
63 void NumberFormat2Test_FieldPositionHandler::addAttribute(
64 int32_t id
, int32_t start
, int32_t limit
) {
65 if (count
== UPRV_LENGTHOF(attributes
) - 1) {
68 attributes
[count
].id
= id
;
69 attributes
[count
].spos
= start
;
70 attributes
[count
].epos
= limit
;
72 attributes
[count
].spos
= -1;
75 void NumberFormat2Test_FieldPositionHandler::shiftLast(int32_t /* delta */) {
78 UBool
NumberFormat2Test_FieldPositionHandler::isRecording() const {
83 class NumberFormat2Test
: public IntlTest
{
85 void runIndexedTest(int32_t index
, UBool exec
, const char *&name
, char *par
=0);
88 void TestConvertScientificNotation();
89 void TestLowerUpperExponent();
91 void TestRoundingIncrement();
92 void TestDigitInterval();
93 void TestGroupingUsed();
95 void TestBenchmark2();
96 void TestSmallIntFormatter();
97 void TestPositiveIntDigitFormatter();
98 void TestDigitListInterval();
99 void TestLargeIntValue();
100 void TestIntInitVisibleDigits();
101 void TestIntInitVisibleDigitsToDigitList();
102 void TestDoubleInitVisibleDigits();
103 void TestDoubleInitVisibleDigitsToDigitList();
104 void TestDigitListInitVisibleDigits();
105 void TestSpecialInitVisibleDigits();
106 void TestVisibleDigitsWithExponent();
107 void TestDigitAffixesAndPadding();
108 void TestPluralsAndRounding();
109 void TestPluralsAndRoundingScientific();
110 void TestValueFormatterIsFastFormattable();
111 void TestCurrencyAffixInfo();
112 void TestAffixPattern();
113 void TestAffixPatternAppend();
114 void TestAffixPatternAppendAjoiningLiterals();
115 void TestAffixPatternDoubleQuote();
116 void TestAffixPatternParser();
117 void TestPluralAffix();
118 void TestDigitAffix();
119 void TestDigitFormatterDefaultCtor();
120 void TestDigitFormatterMonetary();
121 void TestDigitFormatter();
122 void TestSciFormatterDefaultCtor();
123 void TestSciFormatter();
124 void TestToPatternScientific11648();
125 void verifyInterval(const DigitInterval
&, int32_t minInclusive
, int32_t maxExclusive
);
127 const UnicodeString
&expected
,
128 const DigitAffix
&affix
,
129 const NumberFormat2Test_Attributes
*expectedAttributes
);
130 void verifyAffixesAndPadding(
131 const UnicodeString
&expected
,
132 const DigitAffixesAndPadding
&aaf
,
134 const ValueFormatter
&vf
,
135 const PluralRules
*optPluralRules
,
136 const NumberFormat2Test_Attributes
*expectedAttributes
);
137 void verifyAffixesAndPaddingInt32(
138 const UnicodeString
&expected
,
139 const DigitAffixesAndPadding
&aaf
,
141 const ValueFormatter
&vf
,
142 const PluralRules
*optPluralRules
,
143 const NumberFormat2Test_Attributes
*expectedAttributes
);
144 void verifyDigitList(
145 const UnicodeString
&expected
,
146 const DigitList
&digits
);
147 void verifyVisibleDigits(
148 const UnicodeString
&expected
,
150 const VisibleDigits
&digits
);
151 void verifyVisibleDigitsWithExponent(
152 const UnicodeString
&expected
,
154 const VisibleDigitsWithExponent
&digits
);
155 void verifyDigitFormatter(
156 const UnicodeString
&expected
,
157 const DigitFormatter
&formatter
,
158 const VisibleDigits
&digits
,
159 const DigitGrouping
&grouping
,
160 const DigitFormatterOptions
&options
,
161 const NumberFormat2Test_Attributes
*expectedAttributes
);
162 void verifySciFormatter(
163 const UnicodeString
&expected
,
164 const DigitFormatter
&formatter
,
165 const VisibleDigitsWithExponent
&digits
,
166 const SciFormatterOptions
&options
,
167 const NumberFormat2Test_Attributes
*expectedAttributes
);
168 void verifySmallIntFormatter(
169 const UnicodeString
&expected
,
170 int32_t positiveValue
,
173 void verifyPositiveIntDigitFormatter(
174 const UnicodeString
&expected
,
175 const DigitFormatter
&formatter
,
179 const NumberFormat2Test_Attributes
*expectedAttributes
);
180 void verifyAttributes(
181 const NumberFormat2Test_Attributes
*expected
,
182 const NumberFormat2Test_Attributes
*actual
);
184 int64_t expected
, const VisibleDigits
&digits
);
186 double expected
, const VisibleDigits
&digits
);
189 void NumberFormat2Test::runIndexedTest(
190 int32_t index
, UBool exec
, const char *&name
, char *) {
192 logln("TestSuite ScientificNumberFormatterTest: ");
195 TESTCASE_AUTO(TestQuantize
);
196 TESTCASE_AUTO(TestConvertScientificNotation
);
197 TESTCASE_AUTO(TestLowerUpperExponent
);
198 TESTCASE_AUTO(TestRounding
);
199 TESTCASE_AUTO(TestRoundingIncrement
);
200 TESTCASE_AUTO(TestDigitInterval
);
201 TESTCASE_AUTO(TestGroupingUsed
);
202 TESTCASE_AUTO(TestDigitListInterval
);
203 TESTCASE_AUTO(TestDigitFormatterDefaultCtor
);
204 TESTCASE_AUTO(TestDigitFormatterMonetary
);
205 TESTCASE_AUTO(TestDigitFormatter
);
206 TESTCASE_AUTO(TestSciFormatterDefaultCtor
);
207 TESTCASE_AUTO(TestSciFormatter
);
208 TESTCASE_AUTO(TestBenchmark
);
209 TESTCASE_AUTO(TestBenchmark2
);
210 TESTCASE_AUTO(TestSmallIntFormatter
);
211 TESTCASE_AUTO(TestPositiveIntDigitFormatter
);
212 TESTCASE_AUTO(TestCurrencyAffixInfo
);
213 TESTCASE_AUTO(TestAffixPattern
);
214 TESTCASE_AUTO(TestAffixPatternAppend
);
215 TESTCASE_AUTO(TestAffixPatternAppendAjoiningLiterals
);
216 TESTCASE_AUTO(TestAffixPatternDoubleQuote
);
217 TESTCASE_AUTO(TestAffixPatternParser
);
218 TESTCASE_AUTO(TestPluralAffix
);
219 TESTCASE_AUTO(TestDigitAffix
);
220 TESTCASE_AUTO(TestValueFormatterIsFastFormattable
);
221 TESTCASE_AUTO(TestLargeIntValue
);
222 TESTCASE_AUTO(TestIntInitVisibleDigits
);
223 TESTCASE_AUTO(TestIntInitVisibleDigitsToDigitList
);
224 TESTCASE_AUTO(TestDoubleInitVisibleDigits
);
225 TESTCASE_AUTO(TestDoubleInitVisibleDigitsToDigitList
);
226 TESTCASE_AUTO(TestDigitListInitVisibleDigits
);
227 TESTCASE_AUTO(TestSpecialInitVisibleDigits
);
228 TESTCASE_AUTO(TestVisibleDigitsWithExponent
);
229 TESTCASE_AUTO(TestDigitAffixesAndPadding
);
230 TESTCASE_AUTO(TestPluralsAndRounding
);
231 TESTCASE_AUTO(TestPluralsAndRoundingScientific
);
232 TESTCASE_AUTO(TestToPatternScientific11648
);
237 void NumberFormat2Test::TestDigitInterval() {
239 DigitInterval threeInts
;
240 DigitInterval fourFrac
;
241 threeInts
.setIntDigitCount(3);
242 fourFrac
.setFracDigitCount(4);
243 verifyInterval(all
, INT32_MIN
, INT32_MAX
);
244 verifyInterval(threeInts
, INT32_MIN
, 3);
245 verifyInterval(fourFrac
, -4, INT32_MAX
);
247 DigitInterval
result(threeInts
);
248 result
.shrinkToFitWithin(fourFrac
);
249 verifyInterval(result
, -4, 3);
250 assertEquals("", 7, result
.length());
253 DigitInterval
result(threeInts
);
254 result
.expandToContain(fourFrac
);
255 verifyInterval(result
, INT32_MIN
, INT32_MAX
);
258 DigitInterval
result(threeInts
);
259 result
.setIntDigitCount(0);
260 verifyInterval(result
, INT32_MIN
, 0);
261 result
.setIntDigitCount(-1);
262 verifyInterval(result
, INT32_MIN
, INT32_MAX
);
265 DigitInterval
result(fourFrac
);
266 result
.setFracDigitCount(0);
267 verifyInterval(result
, 0, INT32_MAX
);
268 result
.setFracDigitCount(-1);
269 verifyInterval(result
, INT32_MIN
, INT32_MAX
);
272 DigitInterval result
;
273 result
.setIntDigitCount(3);
274 result
.setFracDigitCount(1);
275 result
.expandToContainDigit(0);
276 result
.expandToContainDigit(-1);
277 result
.expandToContainDigit(2);
278 verifyInterval(result
, -1, 3);
279 result
.expandToContainDigit(3);
280 verifyInterval(result
, -1, 4);
281 result
.expandToContainDigit(-2);
282 verifyInterval(result
, -2, 4);
283 result
.expandToContainDigit(15);
284 result
.expandToContainDigit(-15);
285 verifyInterval(result
, -15, 16);
288 DigitInterval result
;
289 result
.setIntDigitCount(3);
290 result
.setFracDigitCount(1);
291 assertTrue("", result
.contains(2));
292 assertTrue("", result
.contains(-1));
293 assertFalse("", result
.contains(3));
294 assertFalse("", result
.contains(-2));
298 void NumberFormat2Test::verifyInterval(
299 const DigitInterval
&interval
,
300 int32_t minInclusive
, int32_t maxExclusive
) {
301 assertEquals("", minInclusive
, interval
.getLeastSignificantInclusive());
302 assertEquals("", maxExclusive
, interval
.getMostSignificantExclusive());
303 assertEquals("", maxExclusive
, interval
.getIntDigitCount());
306 void NumberFormat2Test::TestGroupingUsed() {
308 DigitGrouping grouping
;
309 assertFalse("", grouping
.isGroupingUsed());
312 DigitGrouping grouping
;
313 grouping
.fGrouping
= 2;
314 assertTrue("", grouping
.isGroupingUsed());
318 void NumberFormat2Test::TestDigitListInterval() {
319 DigitInterval result
;
322 digitList
.set(12345);
323 verifyInterval(digitList
.getSmallestInterval(result
), 0, 5);
326 digitList
.set(1000.00);
327 verifyInterval(digitList
.getSmallestInterval(result
), 0, 4);
330 digitList
.set(43.125);
331 verifyInterval(digitList
.getSmallestInterval(result
), -3, 2);
334 digitList
.set(.0078125);
335 verifyInterval(digitList
.getSmallestInterval(result
), -7, 0);
338 digitList
.set(1000.00);
339 digitList
.getSmallestInterval(result
);
340 result
.expandToContainDigit(3);
341 verifyInterval(result
, 0, 4);
344 digitList
.set(1000.00);
345 digitList
.getSmallestInterval(result
);
346 result
.expandToContainDigit(4);
347 verifyInterval(result
, 0, 5);
350 digitList
.set(1000.00);
351 digitList
.getSmallestInterval(result
);
352 result
.expandToContainDigit(0);
353 verifyInterval(result
, 0, 4);
356 digitList
.set(1000.00);
357 digitList
.getSmallestInterval(result
);
358 result
.expandToContainDigit(-1);
359 verifyInterval(result
, -1, 4);
362 digitList
.set(43.125);
363 digitList
.getSmallestInterval(result
);
364 result
.expandToContainDigit(1);
365 verifyInterval(result
, -3, 2);
368 digitList
.set(43.125);
369 digitList
.getSmallestInterval(result
);
370 result
.expandToContainDigit(2);
371 verifyInterval(result
, -3, 3);
374 digitList
.set(43.125);
375 digitList
.getSmallestInterval(result
);
376 result
.expandToContainDigit(-3);
377 verifyInterval(result
, -3, 2);
380 digitList
.set(43.125);
381 digitList
.getSmallestInterval(result
);
382 result
.expandToContainDigit(-4);
383 verifyInterval(result
, -4, 2);
387 void NumberFormat2Test::TestQuantize() {
389 quantity
.set(0.00168);
390 quantity
.roundAtExponent(-5);
392 UErrorCode status
= U_ZERO_ERROR
;
395 digits
.quantize(quantity
, status
);
396 verifyDigitList(".9996", digits
);
399 // round half even up
401 digits
.roundAtExponent(-5);
402 digits
.quantize(quantity
, status
);
403 verifyDigitList("1.00128", digits
);
408 digits
.roundAtExponent(-5);
409 digits
.quantize(quantity
, status
);
410 verifyDigitList(".99792", digits
);
412 assertSuccess("", status
);
415 void NumberFormat2Test::TestConvertScientificNotation() {
419 assertEquals("", 5, digits
.toScientific(1, 1));
426 assertEquals("", 0, digits
.toScientific(6, 1));
433 assertEquals("", -2, digits
.toScientific(8, 1));
440 assertEquals("", 6, digits
.toScientific(-1, 3));
447 assertEquals("", 3, digits
.toScientific(0, 3));
454 assertEquals("", 3, digits
.toScientific(2, 3));
461 assertEquals("", 0, digits
.toScientific(3, 3));
468 assertEquals("", 0, digits
.toScientific(5, 3));
475 assertEquals("", -3, digits
.toScientific(6, 3));
482 assertEquals("", -3, digits
.toScientific(8, 3));
489 assertEquals("", -6, digits
.toScientific(9, 3));
496 void NumberFormat2Test::TestLowerUpperExponent() {
500 assertEquals("", -1, digits
.getLowerExponent());
501 assertEquals("", 2, digits
.getUpperExponent());
504 void NumberFormat2Test::TestRounding() {
506 uprv_decContextSetRounding(&digits
.fContext
, DEC_ROUND_CEILING
);
508 // Round at very large exponent
510 digits
.roundAtExponent(100);
512 "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", // 100 0's after 1
516 // Round at very large exponent
518 digits
.roundAtExponent(1);
520 "790", // 100 0's after 1
524 // Round at positive exponent
526 digits
.roundAtExponent(1);
527 verifyDigitList("790", digits
);
530 // Round at zero exponent
532 digits
.roundAtExponent(0);
533 verifyDigitList("789", digits
);
536 // Round at negative exponent
538 digits
.roundAtExponent(-2);
539 verifyDigitList("789.13", digits
);
542 // Round to exponent of digits.
544 digits
.roundAtExponent(-3);
545 verifyDigitList("789.123", digits
);
548 // Round at large negative exponent
550 digits
.roundAtExponent(-100);
551 verifyDigitList("789.123", digits
);
555 digits
.set(-789.123);
556 digits
.roundAtExponent(-2);
557 digits
.setPositive(TRUE
);
558 verifyDigitList("789.12", digits
);
561 // Round to 1 significant digit
563 digits
.roundAtExponent(INT32_MIN
, 1);
564 verifyDigitList("800", digits
);
567 // Round to 5 significant digit
569 digits
.roundAtExponent(INT32_MIN
, 5);
570 verifyDigitList("789.13", digits
);
573 // Round to 6 significant digit
575 digits
.roundAtExponent(INT32_MIN
, 6);
576 verifyDigitList("789.123", digits
);
581 digits
.roundAtExponent(INT32_MIN
, INT32_MAX
);
582 verifyDigitList("789.123", digits
);
585 // Rounding at -1 produces fewer than 5 significant digits
587 digits
.roundAtExponent(-1, 5);
588 verifyDigitList("789.2", digits
);
591 // Rounding at -1 produces exactly 4 significant digits
593 digits
.roundAtExponent(-1, 4);
594 verifyDigitList("789.2", digits
);
597 // Rounding at -1 produces more than 3 significant digits
599 digits
.roundAtExponent(-1, 3);
600 verifyDigitList("789", digits
);
604 digits
.round(INT32_MAX
);
605 verifyDigitList("123.456", digits
);
610 verifyDigitList("200", digits
);
613 void NumberFormat2Test::TestBenchmark() {
615 UErrorCode status = U_ZERO_ERROR;
617 DecimalFormatSymbols *sym = new DecimalFormatSymbols(en, status);
618 DecimalFormat2 fmt(en, "0.0000000", status);
619 FieldPosition fpos(0);
620 clock_t start = clock();
621 for (int32_t i = 0; i < 100000; ++i) {
623 DecimalFormat2 fmt2("0.0000000", new DecimalFormatSymbols(*sym), perror, status);
624 // UnicodeString append;
625 // fmt.format(4.6692016, append, fpos, status);
627 errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
628 assertSuccess("", status);
632 void NumberFormat2Test::TestBenchmark2() {
634 UErrorCode status = U_ZERO_ERROR;
636 DecimalFormatSymbols *sym = new DecimalFormatSymbols(en, status);
637 DecimalFormat fmt("0.0000000", sym, status);
638 FieldPosition fpos(0);
639 clock_t start = clock();
640 for (int32_t i = 0; i < 100000; ++i) {
642 DecimalFormat fmt("0.0000000", new DecimalFormatSymbols(*sym), perror, status);
643 // UnicodeString append;
644 // fmt.format(4.6692016, append, fpos, status);
646 errln("Took %f", (double) (clock() - start) / CLOCKS_PER_SEC);
647 assertSuccess("", status);
651 void NumberFormat2Test::TestSmallIntFormatter() {
652 verifySmallIntFormatter("0", 7, 0, -2);
653 verifySmallIntFormatter("7", 7, 1, -2);
654 verifySmallIntFormatter("07", 7, 2, -2);
655 verifySmallIntFormatter("07", 7, 2, 2);
656 verifySmallIntFormatter("007", 7, 3, 4);
657 verifySmallIntFormatter("7", 7, -1, 3);
658 verifySmallIntFormatter("0", 0, -1, 3);
659 verifySmallIntFormatter("057", 57, 3, 7);
660 verifySmallIntFormatter("0057", 57, 4, 7);
661 // too many digits for small int
662 verifySmallIntFormatter("", 57, 5, 7);
663 // too many digits for small int
664 verifySmallIntFormatter("", 57, 5, 4);
665 verifySmallIntFormatter("03", 3, 2, 3);
666 verifySmallIntFormatter("32", 32, 2, 3);
667 verifySmallIntFormatter("321", 321, 2, 3);
668 verifySmallIntFormatter("219", 3219, 2, 3);
669 verifySmallIntFormatter("4095", 4095, 2, 4);
670 verifySmallIntFormatter("4095", 4095, 2, 5);
671 verifySmallIntFormatter("", 4096, 2, 5);
674 void NumberFormat2Test::TestPositiveIntDigitFormatter() {
675 DigitFormatter formatter
;
677 NumberFormat2Test_Attributes expectedAttributes
[] = {
678 {UNUM_INTEGER_FIELD
, 0, 4},
680 verifyPositiveIntDigitFormatter(
689 NumberFormat2Test_Attributes expectedAttributes
[] = {
690 {UNUM_INTEGER_FIELD
, 0, 5},
692 verifyPositiveIntDigitFormatter(
701 NumberFormat2Test_Attributes expectedAttributes
[] = {
702 {UNUM_INTEGER_FIELD
, 0, 5},
704 verifyPositiveIntDigitFormatter(
713 NumberFormat2Test_Attributes expectedAttributes
[] = {
714 {UNUM_INTEGER_FIELD
, 0, 3},
716 verifyPositiveIntDigitFormatter(
725 NumberFormat2Test_Attributes expectedAttributes
[] = {
726 {UNUM_INTEGER_FIELD
, 0, 10},
728 verifyPositiveIntDigitFormatter(
737 NumberFormat2Test_Attributes expectedAttributes
[] = {
738 {UNUM_INTEGER_FIELD
, 0, 12},
740 verifyPositiveIntDigitFormatter(
749 // Test long digit string where we have to append one
750 // character at a time.
751 NumberFormat2Test_Attributes expectedAttributes
[] = {
752 {UNUM_INTEGER_FIELD
, 0, 40},
754 verifyPositiveIntDigitFormatter(
755 "0000000000000000000000000000002147483647",
763 NumberFormat2Test_Attributes expectedAttributes
[] = {
764 {UNUM_INTEGER_FIELD
, 0, 4},
766 verifyPositiveIntDigitFormatter(
775 NumberFormat2Test_Attributes expectedAttributes
[] = {
776 {UNUM_INTEGER_FIELD
, 0, 1},
778 verifyPositiveIntDigitFormatter(
787 NumberFormat2Test_Attributes expectedAttributes
[] = {
788 {UNUM_INTEGER_FIELD
, 0, 1},
790 verifyPositiveIntDigitFormatter(
801 void NumberFormat2Test::TestDigitFormatterDefaultCtor() {
802 DigitFormatter formatter
;
803 VisibleDigits digits
;
804 FixedPrecision precision
;
805 UErrorCode status
= U_ZERO_ERROR
;
806 precision
.initVisibleDigits(246.801, digits
, status
);
807 assertSuccess("", status
);
808 DigitGrouping grouping
;
809 DigitFormatterOptions options
;
810 verifyDigitFormatter(
819 void NumberFormat2Test::TestDigitFormatterMonetary() {
820 UErrorCode status
= U_ZERO_ERROR
;
821 DecimalFormatSymbols
symbols("en", status
);
822 if (!assertSuccess("", status
)) {
826 DecimalFormatSymbols::kMonetarySeparatorSymbol
,
827 "decimal separator");
829 DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol
,
830 "grouping separator");
831 DigitFormatter
formatter(symbols
);
832 VisibleDigits visibleDigits
;
833 DigitGrouping grouping
;
834 FixedPrecision precision
;
835 precision
.initVisibleDigits(43560.02, visibleDigits
, status
);
836 if (!assertSuccess("", status
)) {
839 DigitFormatterOptions options
;
840 grouping
.fGrouping
= 3;
842 verifyDigitFormatter(
849 formatter
.setDecimalFormatSymbolsForMonetary(symbols
);
850 verifyDigitFormatter(
851 "43grouping separator560decimal separator02",
860 void NumberFormat2Test::TestDigitFormatter() {
861 UErrorCode status
= U_ZERO_ERROR
;
862 DecimalFormatSymbols
symbols("en", status
);
863 if (!assertSuccess("", status
)) {
866 DigitFormatter
formatter(symbols
);
867 DigitInterval interval
;
869 VisibleDigits visibleDigits
;
870 DigitGrouping grouping
;
871 FixedPrecision precision
;
872 precision
.initVisibleDigits((int64_t) 8192, visibleDigits
, status
);
873 if (!assertSuccess("", status
)) {
876 DigitFormatterOptions options
;
877 verifyDigitFormatter(
884 NumberFormat2Test_Attributes expectedAttributes
[] = {
885 {UNUM_INTEGER_FIELD
, 0, 4},
886 {UNUM_DECIMAL_SEPARATOR_FIELD
, 4, 5},
888 options
.fAlwaysShowDecimal
= TRUE
;
889 verifyDigitFormatter(
898 grouping
.fGrouping
= 3;
899 options
.fAlwaysShowDecimal
= FALSE
;
900 verifyDigitFormatter(
908 // turn on min grouping which will suppress grouping
909 grouping
.fMinGrouping
= 2;
910 verifyDigitFormatter(
918 // adding one more digit will enable grouping once again.
919 precision
.initVisibleDigits((int64_t) 43560, visibleDigits
, status
);
920 if (!assertSuccess("", status
)) {
923 verifyDigitFormatter(
932 DigitGrouping grouping
;
933 FixedPrecision precision
;
934 VisibleDigits visibleDigits
;
935 precision
.initVisibleDigits(
936 31415926.0078125, visibleDigits
, status
);
937 if (!assertSuccess("", status
)) {
940 DigitFormatterOptions options
;
941 verifyDigitFormatter(
949 // Turn on grouping with secondary.
950 grouping
.fGrouping
= 2;
951 grouping
.fGrouping2
= 3;
952 verifyDigitFormatter(
953 "314,159,26.0078125",
960 // Pad with zeros by widening interval.
961 precision
.fMin
.setIntDigitCount(9);
962 precision
.fMin
.setFracDigitCount(10);
963 precision
.initVisibleDigits(
964 31415926.0078125, visibleDigits
, status
);
965 if (!assertSuccess("", status
)) {
968 NumberFormat2Test_Attributes expectedAttributes
[] = {
969 {UNUM_GROUPING_SEPARATOR_FIELD
, 1, 2},
970 {UNUM_GROUPING_SEPARATOR_FIELD
, 5, 6},
971 {UNUM_GROUPING_SEPARATOR_FIELD
, 9, 10},
972 {UNUM_INTEGER_FIELD
, 0, 12},
973 {UNUM_DECIMAL_SEPARATOR_FIELD
, 12, 13},
974 {UNUM_FRACTION_FIELD
, 13, 23},
976 verifyDigitFormatter(
977 "0,314,159,26.0078125000",
985 DigitGrouping grouping
;
986 FixedPrecision precision
;
987 VisibleDigits visibleDigits
;
988 DigitFormatterOptions options
;
989 precision
.fMax
.setIntDigitCount(0);
990 precision
.fMax
.setFracDigitCount(0);
991 precision
.initVisibleDigits(
992 3125.0, visibleDigits
, status
);
993 if (!assertSuccess("", status
)) {
996 NumberFormat2Test_Attributes expectedAttributes
[] = {
997 {UNUM_INTEGER_FIELD
, 0, 1},
999 verifyDigitFormatter(
1005 expectedAttributes
);
1006 NumberFormat2Test_Attributes expectedAttributesWithDecimal
[] = {
1007 {UNUM_INTEGER_FIELD
, 0, 1},
1008 {UNUM_DECIMAL_SEPARATOR_FIELD
, 1, 2},
1010 options
.fAlwaysShowDecimal
= TRUE
;
1011 verifyDigitFormatter(
1017 expectedAttributesWithDecimal
);
1020 DigitGrouping grouping
;
1021 FixedPrecision precision
;
1022 VisibleDigits visibleDigits
;
1023 DigitFormatterOptions options
;
1024 precision
.fMax
.setIntDigitCount(1);
1025 precision
.fMin
.setFracDigitCount(1);
1026 precision
.initVisibleDigits(
1027 3125.0, visibleDigits
, status
);
1028 if (!assertSuccess("", status
)) {
1031 NumberFormat2Test_Attributes expectedAttributes
[] = {
1032 {UNUM_INTEGER_FIELD
, 0, 1},
1033 {UNUM_DECIMAL_SEPARATOR_FIELD
, 1, 2},
1034 {UNUM_FRACTION_FIELD
, 2, 3},
1036 options
.fAlwaysShowDecimal
= TRUE
;
1037 verifyDigitFormatter(
1043 expectedAttributes
);
1047 void NumberFormat2Test::TestSciFormatterDefaultCtor() {
1048 DigitFormatter formatter
;
1049 ScientificPrecision precision
;
1050 VisibleDigitsWithExponent visibleDigits
;
1051 UErrorCode status
= U_ZERO_ERROR
;
1052 precision
.initVisibleDigitsWithExponent(
1053 6.02E23
, visibleDigits
, status
);
1054 if (!assertSuccess("", status
)) {
1057 SciFormatterOptions options
;
1064 precision
.initVisibleDigitsWithExponent(
1065 6.62E-34, visibleDigits
, status
);
1066 if (!assertSuccess("", status
)) {
1077 void NumberFormat2Test::TestSciFormatter() {
1078 DigitFormatter formatter
;
1079 ScientificPrecision precision
;
1080 precision
.fMantissa
.fMin
.setIntDigitCount(4);
1081 precision
.fMantissa
.fMax
.setIntDigitCount(4);
1082 precision
.fMantissa
.fMin
.setFracDigitCount(0);
1083 precision
.fMantissa
.fMax
.setFracDigitCount(0);
1084 precision
.fMinExponentDigits
= 3;
1085 VisibleDigitsWithExponent visibleDigits
;
1086 UErrorCode status
= U_ZERO_ERROR
;
1087 precision
.initVisibleDigitsWithExponent(
1088 1.248E26
, visibleDigits
, status
);
1089 if (!assertSuccess("", status
)) {
1092 SciFormatterOptions options
;
1095 options
.fExponent
.fAlwaysShowSign
= TRUE
;
1096 NumberFormat2Test_Attributes expectedAttributes
[] = {
1097 {UNUM_INTEGER_FIELD
, 0, 4},
1098 {UNUM_EXPONENT_SYMBOL_FIELD
, 4, 5},
1099 {UNUM_EXPONENT_SIGN_FIELD
, 5, 6},
1100 {UNUM_EXPONENT_FIELD
, 6, 9},
1107 expectedAttributes
);
1110 options
.fMantissa
.fAlwaysShowDecimal
= TRUE
;
1111 options
.fExponent
.fAlwaysShowSign
= FALSE
;
1112 NumberFormat2Test_Attributes expectedAttributes
[] = {
1113 {UNUM_INTEGER_FIELD
, 0, 4},
1114 {UNUM_DECIMAL_SEPARATOR_FIELD
, 4, 5},
1115 {UNUM_EXPONENT_SYMBOL_FIELD
, 5, 6},
1116 {UNUM_EXPONENT_FIELD
, 6, 9},
1123 expectedAttributes
);
1127 void NumberFormat2Test::TestValueFormatterIsFastFormattable() {
1128 UErrorCode status
= U_ZERO_ERROR
;
1129 DecimalFormatSymbols
symbols("en", status
);
1130 if (!assertSuccess("", status
)) {
1133 DigitFormatter
formatter(symbols
);
1134 DigitGrouping grouping
;
1135 FixedPrecision precision
;
1136 DigitFormatterOptions options
;
1138 vf
.prepareFixedDecimalFormatting(
1139 formatter
, grouping
, precision
, options
);
1140 assertTrue("", vf
.isFastFormattable(0));
1141 assertTrue("", vf
.isFastFormattable(35));
1142 assertTrue("", vf
.isFastFormattable(-48));
1143 assertTrue("", vf
.isFastFormattable(2147483647));
1144 assertTrue("", vf
.isFastFormattable(-2147483647));
1145 assertFalse("", vf
.isFastFormattable(-2147483648L));
1147 DigitGrouping grouping
;
1148 grouping
.fGrouping
= 3;
1150 vf
.prepareFixedDecimalFormatting(
1151 formatter
, grouping
, precision
, options
);
1152 assertTrue("0", vf
.isFastFormattable(0));
1153 assertTrue("62", vf
.isFastFormattable(62));
1154 assertTrue("999", vf
.isFastFormattable(999));
1155 assertFalse("1000", vf
.isFastFormattable(1000));
1156 assertTrue("-1", vf
.isFastFormattable(-1));
1157 assertTrue("-38", vf
.isFastFormattable(-38));
1158 assertTrue("-999", vf
.isFastFormattable(-999));
1159 assertFalse("-1000", vf
.isFastFormattable(-1000));
1160 grouping
.fMinGrouping
= 2;
1161 assertTrue("-1000", vf
.isFastFormattable(-1000));
1162 assertTrue("-4095", vf
.isFastFormattable(-4095));
1163 assertTrue("4095", vf
.isFastFormattable(4095));
1164 // We give up on acounting digits at 4096
1165 assertFalse("-4096", vf
.isFastFormattable(-4096));
1166 assertFalse("4096", vf
.isFastFormattable(4096));
1169 // grouping on but with max integer digits set.
1170 DigitGrouping grouping
;
1171 grouping
.fGrouping
= 4;
1172 FixedPrecision precision
;
1173 precision
.fMax
.setIntDigitCount(4);
1175 vf
.prepareFixedDecimalFormatting(
1176 formatter
, grouping
, precision
, options
);
1177 assertTrue("-4096", vf
.isFastFormattable(-4096));
1178 assertTrue("4096", vf
.isFastFormattable(4096));
1179 assertTrue("-10000", vf
.isFastFormattable(-10000));
1180 assertTrue("10000", vf
.isFastFormattable(10000));
1181 assertTrue("-2147483647", vf
.isFastFormattable(-2147483647));
1182 assertTrue("2147483647", vf
.isFastFormattable(2147483647));
1184 precision
.fMax
.setIntDigitCount(5);
1185 assertFalse("-4096", vf
.isFastFormattable(-4096));
1186 assertFalse("4096", vf
.isFastFormattable(4096));
1190 // grouping on but with min integer digits set.
1191 DigitGrouping grouping
;
1192 grouping
.fGrouping
= 3;
1193 FixedPrecision precision
;
1194 precision
.fMin
.setIntDigitCount(3);
1196 vf
.prepareFixedDecimalFormatting(
1197 formatter
, grouping
, precision
, options
);
1198 assertTrue("-999", vf
.isFastFormattable(-999));
1199 assertTrue("999", vf
.isFastFormattable(999));
1200 assertFalse("-1000", vf
.isFastFormattable(-1000));
1201 assertFalse("1000", vf
.isFastFormattable(1000));
1203 precision
.fMin
.setIntDigitCount(4);
1204 assertFalse("-999", vf
.isFastFormattable(-999));
1205 assertFalse("999", vf
.isFastFormattable(999));
1206 assertFalse("-2147483647", vf
.isFastFormattable(-2147483647));
1207 assertFalse("2147483647", vf
.isFastFormattable(2147483647));
1211 DigitFormatterOptions options
;
1213 vf
.prepareFixedDecimalFormatting(
1214 formatter
, grouping
, precision
, options
);
1215 assertTrue("5125", vf
.isFastFormattable(5125));
1216 options
.fAlwaysShowDecimal
= TRUE
;
1217 assertFalse("5125", vf
.isFastFormattable(5125));
1218 options
.fAlwaysShowDecimal
= FALSE
;
1219 assertTrue("5125", vf
.isFastFormattable(5125));
1222 // test fraction digits
1223 FixedPrecision precision
;
1225 vf
.prepareFixedDecimalFormatting(
1226 formatter
, grouping
, precision
, options
);
1227 assertTrue("7127", vf
.isFastFormattable(7127));
1228 precision
.fMin
.setFracDigitCount(1);
1229 assertFalse("7127", vf
.isFastFormattable(7127));
1232 // test presence of significant digits
1233 FixedPrecision precision
;
1235 vf
.prepareFixedDecimalFormatting(
1236 formatter
, grouping
, precision
, options
);
1237 assertTrue("1049", vf
.isFastFormattable(1049));
1238 precision
.fSignificant
.setMin(1);
1239 assertFalse("1049", vf
.isFastFormattable(1049));
1242 // test presence of rounding increment
1243 FixedPrecision precision
;
1245 vf
.prepareFixedDecimalFormatting(
1246 formatter
, grouping
, precision
, options
);
1247 assertTrue("1099", vf
.isFastFormattable(1099));
1248 precision
.fRoundingIncrement
.set(2.3);
1249 assertFalse("1099", vf
.isFastFormattable(1099));
1252 // test scientific notation
1253 ScientificPrecision precision
;
1254 SciFormatterOptions options
;
1256 vf
.prepareScientificFormatting(
1257 formatter
, precision
, options
);
1258 assertFalse("1081", vf
.isFastFormattable(1081));
1262 void NumberFormat2Test::TestDigitAffix() {
1265 affix
.append("foo");
1266 affix
.append("--", UNUM_SIGN_FIELD
);
1267 affix
.append("%", UNUM_PERCENT_FIELD
);
1268 NumberFormat2Test_Attributes expectedAttributes
[] = {
1269 {UNUM_SIGN_FIELD
, 3, 5},
1270 {UNUM_PERCENT_FIELD
, 5, 6},
1272 verifyAffix("foo--%", affix
, expectedAttributes
);
1276 affix
.append("USD", UNUM_CURRENCY_FIELD
);
1278 NumberFormat2Test_Attributes expectedAttributes
[] = {
1279 {UNUM_CURRENCY_FIELD
, 0, 3},
1281 verifyAffix("USD ", affix
, expectedAttributes
);
1284 affix
.setTo("%%", UNUM_PERCENT_FIELD
);
1285 NumberFormat2Test_Attributes expectedAttributes
[] = {
1286 {UNUM_PERCENT_FIELD
, 0, 2},
1288 verifyAffix("%%", affix
, expectedAttributes
);
1292 void NumberFormat2Test::TestPluralAffix() {
1293 UErrorCode status
= U_ZERO_ERROR
;
1295 part
.setVariant("one", "Dollar", status
);
1296 part
.setVariant("few", "DollarFew", status
);
1297 part
.setVariant("other", "Dollars", status
);
1298 PluralAffix
dollar(part
);
1299 PluralAffix
percent(part
);
1301 part
.setVariant("one", "Percent", status
);
1302 part
.setVariant("many", "PercentMany", status
);
1303 part
.setVariant("other", "Percents", status
);
1306 part
.setVariant("one", "foo", status
);
1309 assertEquals("", "", pa
.getOtherVariant().toString());
1310 pa
.append(dollar
, UNUM_CURRENCY_FIELD
, status
);
1312 pa
.append(percent
, UNUM_PERCENT_FIELD
, status
);
1313 pa
.append("-", UNUM_SIGN_FIELD
);
1317 NumberFormat2Test_Attributes expectedAttributes
[] = {
1318 {UNUM_CURRENCY_FIELD
, 0, 7},
1319 {UNUM_PERCENT_FIELD
, 12, 20},
1320 {UNUM_SIGN_FIELD
, 20, 21},
1323 "Dollars and Percents-",
1324 pa
.getByCategory("other"),
1325 expectedAttributes
);
1328 // two which is same as other
1329 NumberFormat2Test_Attributes expectedAttributes
[] = {
1330 {UNUM_CURRENCY_FIELD
, 0, 7},
1331 {UNUM_PERCENT_FIELD
, 12, 20},
1332 {UNUM_SIGN_FIELD
, 20, 21},
1335 "Dollars and Percents-",
1336 pa
.getByCategory("two"),
1337 expectedAttributes
);
1340 // bad which is same as other
1341 NumberFormat2Test_Attributes expectedAttributes
[] = {
1342 {UNUM_CURRENCY_FIELD
, 0, 7},
1343 {UNUM_PERCENT_FIELD
, 12, 20},
1344 {UNUM_SIGN_FIELD
, 20, 21},
1347 "Dollars and Percents-",
1348 pa
.getByCategory("bad"),
1349 expectedAttributes
);
1353 NumberFormat2Test_Attributes expectedAttributes
[] = {
1354 {UNUM_CURRENCY_FIELD
, 0, 6},
1355 {UNUM_PERCENT_FIELD
, 11, 18},
1356 {UNUM_SIGN_FIELD
, 18, 19},
1359 "Dollar and Percent-",
1360 pa
.getByCategory("one"),
1361 expectedAttributes
);
1365 NumberFormat2Test_Attributes expectedAttributes
[] = {
1366 {UNUM_CURRENCY_FIELD
, 0, 9},
1367 {UNUM_PERCENT_FIELD
, 14, 22},
1368 {UNUM_SIGN_FIELD
, 22, 23},
1371 "DollarFew and Percents-",
1372 pa
.getByCategory("few"),
1373 expectedAttributes
);
1377 NumberFormat2Test_Attributes expectedAttributes
[] = {
1378 {UNUM_CURRENCY_FIELD
, 0, 7},
1379 {UNUM_PERCENT_FIELD
, 12, 23},
1380 {UNUM_SIGN_FIELD
, 23, 24},
1383 "Dollars and PercentMany-",
1384 pa
.getByCategory("many"),
1385 expectedAttributes
);
1387 assertTrue("", pa
.hasMultipleVariants());
1389 pa
.append("$$$", UNUM_CURRENCY_FIELD
);
1390 assertFalse("", pa
.hasMultipleVariants());
1394 void NumberFormat2Test::TestCurrencyAffixInfo() {
1395 CurrencyAffixInfo info
;
1396 assertTrue("", info
.isDefault());
1397 UnicodeString
expectedSymbol("\\u00a4");
1398 UnicodeString
expectedSymbolIso("\\u00a4\\u00a4");
1399 UnicodeString
expectedSymbols("\\u00a4\\u00a4\\u00a4");
1400 assertEquals("", expectedSymbol
.unescape(), info
.getSymbol());
1401 assertEquals("", expectedSymbolIso
.unescape(), info
.getISO());
1402 assertEquals("", expectedSymbols
.unescape(), info
.getLong().getByCategory("one").toString());
1403 assertEquals("", expectedSymbols
.unescape(), info
.getLong().getByCategory("other").toString());
1404 assertEquals("", expectedSymbols
.unescape(), info
.getLong().getByCategory("two").toString());
1405 UErrorCode status
= U_ZERO_ERROR
;
1406 static UChar USD
[] = {0x55, 0x53, 0x44, 0x0};
1407 LocalPointer
<PluralRules
> rules(PluralRules::forLocale("en", status
));
1408 if (!assertSuccess("", status
)) {
1411 info
.set("en", rules
.getAlias(), USD
, status
);
1412 assertEquals("", "$", info
.getSymbol(), TRUE
);
1413 assertEquals("", "USD", info
.getISO(), TRUE
);
1414 assertEquals("", "US dollar", info
.getLong().getByCategory("one").toString(), TRUE
);
1415 assertEquals("", "US dollars", info
.getLong().getByCategory("other").toString(), TRUE
);
1416 assertEquals("", "US dollars", info
.getLong().getByCategory("two").toString(), TRUE
);
1417 assertFalse("", info
.isDefault());
1418 info
.set(NULL
, NULL
, NULL
, status
);
1419 assertTrue("", info
.isDefault());
1420 assertEquals("", expectedSymbol
.unescape(), info
.getSymbol());
1421 assertEquals("", expectedSymbolIso
.unescape(), info
.getISO());
1422 assertEquals("", expectedSymbols
.unescape(), info
.getLong().getByCategory("one").toString());
1423 assertEquals("", expectedSymbols
.unescape(), info
.getLong().getByCategory("other").toString());
1424 assertEquals("", expectedSymbols
.unescape(), info
.getLong().getByCategory("two").toString());
1425 info
.setSymbol("$");
1426 assertFalse("", info
.isDefault());
1427 info
.set(NULL
, NULL
, NULL
, status
);
1428 assertTrue("", info
.isDefault());
1430 assertFalse("", info
.isDefault());
1431 assertSuccess("", status
);
1434 void NumberFormat2Test::TestAffixPattern() {
1435 static UChar chars
[500];
1436 for (int32_t i
= 0; i
< UPRV_LENGTHOF(chars
); ++i
) {
1437 chars
[i
] = (UChar
) (i
+ 1);
1440 first
.add(AffixPattern::kPercent
);
1441 first
.addLiteral(chars
, 0, 200);
1442 first
.addLiteral(chars
, 200, 300);
1443 first
.addCurrency(2);
1444 first
.addLiteral(chars
, 0, 256);
1445 AffixPattern second
;
1446 second
.add(AffixPattern::kPercent
);
1447 second
.addLiteral(chars
, 0, 300);
1448 second
.addLiteral(chars
, 300, 200);
1449 second
.addCurrency(2);
1450 second
.addLiteral(chars
, 0, 150);
1451 second
.addLiteral(chars
, 150, 106);
1452 assertTrue("", first
.equals(second
));
1453 AffixPatternIterator iter
;
1455 assertFalse("", second
.iterator(iter
).nextToken());
1456 assertTrue("", first
.iterator(iter
).nextToken());
1457 assertEquals("", AffixPattern::kPercent
, iter
.getTokenType());
1458 assertEquals("", 1, iter
.getTokenLength());
1459 assertTrue("", iter
.nextToken());
1461 assertEquals("", 500, iter
.getLiteral(str
).length());
1462 assertEquals("", AffixPattern::kLiteral
, iter
.getTokenType());
1463 assertEquals("", 500, iter
.getTokenLength());
1464 assertTrue("", iter
.nextToken());
1465 assertEquals("", AffixPattern::kCurrency
, iter
.getTokenType());
1466 assertEquals("", 2, iter
.getTokenLength());
1467 assertTrue("", iter
.nextToken());
1468 assertEquals("", 256, iter
.getLiteral(str
).length());
1469 assertEquals("", AffixPattern::kLiteral
, iter
.getTokenType());
1470 assertEquals("", 256, iter
.getTokenLength());
1471 assertFalse("", iter
.nextToken());
1474 void NumberFormat2Test::TestAffixPatternDoubleQuote() {
1475 UnicodeString
str("'Don''t'");
1476 AffixPattern expected
;
1478 static UChar chars
[] = {0x44, 0x6F, 0x6E, 0x27, 0x74};
1479 expected
.addLiteral(chars
, 0, UPRV_LENGTHOF(chars
));
1480 AffixPattern actual
;
1481 UErrorCode status
= U_ZERO_ERROR
;
1482 AffixPattern::parseUserAffixString(str
, actual
, status
);
1483 assertTrue("", expected
.equals(actual
));
1484 UnicodeString formattedString
;
1485 assertEquals("", "Don''t", actual
.toUserString(formattedString
));
1486 assertSuccess("", status
);
1489 void NumberFormat2Test::TestAffixPatternParser() {
1490 UErrorCode status
= U_ZERO_ERROR
;
1491 static UChar USD
[] = {0x55, 0x53, 0x44, 0x0};
1492 LocalPointer
<PluralRules
> rules(PluralRules::forLocale("en", status
));
1493 DecimalFormatSymbols
symbols("en", status
);
1494 if (U_FAILURE(status
)) {
1495 dataerrln("Error creating DecimalFormatSymbols - %s", u_errorName(status
));
1498 AffixPatternParser
parser(symbols
);
1499 CurrencyAffixInfo currencyAffixInfo
;
1500 currencyAffixInfo
.set("en", rules
.getAlias(), USD
, status
);
1502 UnicodeString
str("'--y'''dz'%'\\u00a4\\u00a4\\u00a4\\u00a4 y '\\u00a4\\u00a4\\u00a4 or '\\u00a4\\u00a4 but '\\u00a4");
1503 str
= str
.unescape();
1504 assertSuccess("", status
);
1505 AffixPattern affixPattern
;
1507 AffixPattern::parseAffixString(str
, affixPattern
, status
),
1511 UnicodeString formattedStr
;
1512 affixPattern
.toString(formattedStr
);
1513 UnicodeString
expectedFormattedStr("'--y''dz'%'\\u00a4\\u00a4\\u00a4\\u00a4 y '\\u00a4\\u00a4\\u00a4 or '\\u00a4\\u00a4 but '\\u00a4");
1514 expectedFormattedStr
= expectedFormattedStr
.unescape();
1515 assertEquals("1", expectedFormattedStr
, formattedStr
);
1516 AffixPattern userAffixPattern
;
1517 UnicodeString
userStr("-'-'y'''d'z%\\u00a4\\u00a4\\u00a4'\\u00a4' y \\u00a4\\u00a4\\u00a4 or \\u00a4\\u00a4 but \\u00a4");
1518 userStr
= userStr
.unescape();
1519 AffixPattern::parseUserAffixString(userStr
, userAffixPattern
, status
),
1520 assertTrue("", affixPattern
.equals(userAffixPattern
));
1521 AffixPattern userAffixPattern2
;
1522 UnicodeString formattedUserStr
;
1523 AffixPattern::parseUserAffixString(
1524 userAffixPattern
.toUserString(formattedUserStr
),
1527 UnicodeString
expectedFormattedUserStr(
1528 "-'-'y''dz%\\u00a4\\u00a4\\u00a4'\\u00a4' y \\u00a4\\u00a4\\u00a4 or \\u00a4\\u00a4 but \\u00a4");
1529 assertEquals("2", expectedFormattedUserStr
.unescape(), formattedUserStr
);
1530 assertTrue("", userAffixPattern2
.equals(userAffixPattern
));
1531 assertSuccess("", status
);
1532 assertTrue("", affixPattern
.usesCurrency());
1533 assertTrue("", affixPattern
.usesPercent());
1534 assertFalse("", affixPattern
.usesPermill());
1535 assertTrue("", affix
.hasMultipleVariants());
1538 NumberFormat2Test_Attributes expectedAttributes
[] = {
1539 {UNUM_SIGN_FIELD
, 0, 1},
1540 {UNUM_PERCENT_FIELD
, 6, 7},
1541 {UNUM_CURRENCY_FIELD
, 7, 17},
1542 {UNUM_CURRENCY_FIELD
, 21, 31},
1543 {UNUM_CURRENCY_FIELD
, 35, 38},
1544 {UNUM_CURRENCY_FIELD
, 43, 44},
1547 "--y'dz%US dollars\\u00a4 y US dollars or USD but $",
1548 affix
.getByCategory("other"),
1549 expectedAttributes
);
1553 NumberFormat2Test_Attributes expectedAttributes
[] = {
1554 {UNUM_SIGN_FIELD
, 0, 1},
1555 {UNUM_PERCENT_FIELD
, 6, 7},
1556 {UNUM_CURRENCY_FIELD
, 7, 16},
1557 {UNUM_CURRENCY_FIELD
, 20, 29},
1558 {UNUM_CURRENCY_FIELD
, 33, 36},
1559 {UNUM_CURRENCY_FIELD
, 41, 42},
1562 "--y'dz%US dollar\\u00a4 y US dollar or USD but $",
1563 affix
.getByCategory("one"),
1564 expectedAttributes
);
1568 affixPattern
.remove();
1570 AffixPattern::parseAffixString(str
, affixPattern
, status
),
1574 assertSuccess("", status
);
1575 assertFalse("", affixPattern
.usesCurrency());
1576 assertFalse("", affixPattern
.usesPercent());
1577 assertFalse("", affixPattern
.usesPermill());
1578 assertFalse("", affix
.hasMultipleVariants());
1581 NumberFormat2Test_Attributes expectedAttributes
[] = {
1582 {UNUM_SIGN_FIELD
, 1, 2},
1586 affix
.getByCategory("other"),
1587 expectedAttributes
);
1589 UnicodeString
a4("\\u00a4");
1590 AffixPattern scratchPattern
;
1591 AffixPattern::parseAffixString(a4
.unescape(), scratchPattern
, status
);
1592 assertFalse("", scratchPattern
.usesCurrency());
1594 // Test really long string > 256 chars.
1595 str
= "'\\u2030012345678901234567890123456789012345678901234567890123456789"
1596 "012345678901234567890123456789012345678901234567890123456789"
1597 "012345678901234567890123456789012345678901234567890123456789"
1598 "012345678901234567890123456789012345678901234567890123456789"
1599 "012345678901234567890123456789012345678901234567890123456789";
1600 str
= str
.unescape();
1601 affixPattern
.remove();
1604 AffixPattern::parseAffixString(str
, affixPattern
, status
),
1608 assertSuccess("", status
);
1609 assertFalse("", affixPattern
.usesCurrency());
1610 assertFalse("", affixPattern
.usesPercent());
1611 assertTrue("", affixPattern
.usesPermill());
1612 assertFalse("", affix
.hasMultipleVariants());
1614 UnicodeString expected
=
1615 "\\u2030012345678901234567890123456789012345678901234567890123456789"
1616 "012345678901234567890123456789012345678901234567890123456789"
1617 "012345678901234567890123456789012345678901234567890123456789"
1618 "012345678901234567890123456789012345678901234567890123456789"
1619 "012345678901234567890123456789012345678901234567890123456789";
1620 expected
= expected
.unescape();
1621 NumberFormat2Test_Attributes expectedAttributes
[] = {
1622 {UNUM_PERMILL_FIELD
, 0, 1},
1626 affix
.getOtherVariant(),
1627 expectedAttributes
);
1631 void NumberFormat2Test::TestAffixPatternAppend() {
1632 AffixPattern pattern
;
1633 UErrorCode status
= U_ZERO_ERROR
;
1634 UnicodeString
patternStr("%\\u2030");
1635 AffixPattern::parseUserAffixString(
1636 patternStr
.unescape(), pattern
, status
);
1638 AffixPattern appendPattern
;
1639 UnicodeString
appendPatternStr("-\\u00a4\\u00a4*");
1640 AffixPattern::parseUserAffixString(
1641 appendPatternStr
.unescape(), appendPattern
, status
);
1643 AffixPattern expectedPattern
;
1644 UnicodeString
expectedPatternStr("%\\u2030-\\u00a4\\u00a4*");
1645 AffixPattern::parseUserAffixString(
1646 expectedPatternStr
.unescape(), expectedPattern
, status
);
1648 assertTrue("", pattern
.append(appendPattern
).equals(expectedPattern
));
1649 assertSuccess("", status
);
1652 void NumberFormat2Test::TestAffixPatternAppendAjoiningLiterals() {
1653 AffixPattern pattern
;
1654 UErrorCode status
= U_ZERO_ERROR
;
1655 UnicodeString
patternStr("%baaa");
1656 AffixPattern::parseUserAffixString(
1657 patternStr
, pattern
, status
);
1659 AffixPattern appendPattern
;
1660 UnicodeString
appendPatternStr("caa%");
1661 AffixPattern::parseUserAffixString(
1662 appendPatternStr
, appendPattern
, status
);
1664 AffixPattern expectedPattern
;
1665 UnicodeString
expectedPatternStr("%baaacaa%");
1666 AffixPattern::parseUserAffixString(
1667 expectedPatternStr
, expectedPattern
, status
);
1669 assertTrue("", pattern
.append(appendPattern
).equals(expectedPattern
));
1670 assertSuccess("", status
);
1673 void NumberFormat2Test::TestLargeIntValue() {
1674 VisibleDigits digits
;
1676 UErrorCode status
= U_ZERO_ERROR
;
1677 FixedPrecision precision
;
1679 // Last 18 digits for int values.
1681 223372036854775807LL,
1682 precision
.initVisibleDigits(INT64_MAX
, digits
, status
));
1683 assertSuccess("INT64_MAX", status
);
1686 UErrorCode status
= U_ZERO_ERROR
;
1687 FixedPrecision precision
;
1688 precision
.fMax
.setIntDigitCount(5);
1690 // Last 18 digits for int values.
1693 precision
.initVisibleDigits(INT64_MAX
, digits
, status
));
1694 verifySource(75807.0, digits
);
1695 assertSuccess("75807", status
);
1698 UErrorCode status
= U_ZERO_ERROR
;
1699 FixedPrecision precision
;
1701 // Last 18 digits for int values.
1703 223372036854775808LL,
1704 precision
.initVisibleDigits(INT64_MIN
, digits
, status
));
1705 assertSuccess("INT64_MIN", status
);
1708 UErrorCode status
= U_ZERO_ERROR
;
1709 FixedPrecision precision
;
1710 precision
.fMax
.setIntDigitCount(5);
1712 // Last 18 digits for int values.
1715 precision
.initVisibleDigits(INT64_MIN
, digits
, status
));
1716 verifySource(75808.0, digits
);
1717 assertSuccess("75808", status
);
1722 void NumberFormat2Test::TestIntInitVisibleDigits() {
1723 VisibleDigits digits
;
1725 UErrorCode status
= U_ZERO_ERROR
;
1726 FixedPrecision precision
;
1727 verifyVisibleDigits(
1730 precision
.initVisibleDigits((int64_t) 13LL, digits
, status
));
1731 assertSuccess("13", status
);
1734 UErrorCode status
= U_ZERO_ERROR
;
1735 FixedPrecision precision
;
1736 verifyVisibleDigits(
1739 precision
.initVisibleDigits((int64_t) -17LL, digits
, status
));
1740 assertSuccess("-17", status
);
1743 UErrorCode status
= U_ZERO_ERROR
;
1744 FixedPrecision precision
;
1745 verifyVisibleDigits(
1746 "9223372036854775808",
1748 precision
.initVisibleDigits(INT64_MIN
, digits
, status
));
1749 assertSuccess("-9223372036854775808", status
);
1752 UErrorCode status
= U_ZERO_ERROR
;
1753 FixedPrecision precision
;
1754 verifyVisibleDigits(
1755 "9223372036854775807",
1757 precision
.initVisibleDigits(INT64_MAX
, digits
, status
));
1758 assertSuccess("9223372036854775807", status
);
1761 UErrorCode status
= U_ZERO_ERROR
;
1762 FixedPrecision precision
;
1763 verifyVisibleDigits(
1766 precision
.initVisibleDigits((int64_t) -31536000LL, digits
, status
));
1767 assertSuccess("-31536000", status
);
1770 UErrorCode status
= U_ZERO_ERROR
;
1771 FixedPrecision precision
;
1772 verifyVisibleDigits(
1775 precision
.initVisibleDigits((int64_t) 0LL, digits
, status
));
1776 assertSuccess("0", status
);
1779 UErrorCode status
= U_ZERO_ERROR
;
1780 FixedPrecision precision
;
1781 precision
.fMin
.setIntDigitCount(4);
1782 precision
.fMin
.setFracDigitCount(2);
1783 verifyVisibleDigits(
1786 precision
.initVisibleDigits((int64_t) 0LL, digits
, status
));
1787 assertSuccess("0", status
);
1790 UErrorCode status
= U_ZERO_ERROR
;
1791 FixedPrecision precision
;
1792 precision
.fMin
.setIntDigitCount(4);
1793 precision
.fMin
.setFracDigitCount(2);
1794 verifyVisibleDigits(
1797 precision
.initVisibleDigits((int64_t) 57LL, digits
, status
));
1798 assertSuccess("57", status
);
1801 UErrorCode status
= U_ZERO_ERROR
;
1802 FixedPrecision precision
;
1803 precision
.fMin
.setIntDigitCount(4);
1804 precision
.fMin
.setFracDigitCount(2);
1805 verifyVisibleDigits(
1808 precision
.initVisibleDigits((int64_t) -57LL, digits
, status
));
1809 assertSuccess("-57", status
);
1812 UErrorCode status
= U_ZERO_ERROR
;
1813 FixedPrecision precision
;
1814 precision
.fMax
.setIntDigitCount(2);
1815 precision
.fMin
.setFracDigitCount(1);
1816 verifyVisibleDigits(
1819 precision
.initVisibleDigits((int64_t) 235LL, digits
, status
));
1820 assertSuccess("235", status
);
1823 UErrorCode status
= U_ZERO_ERROR
;
1824 FixedPrecision precision
;
1825 precision
.fMax
.setIntDigitCount(2);
1826 precision
.fMin
.setFracDigitCount(1);
1827 precision
.fFailIfOverMax
= TRUE
;
1828 precision
.initVisibleDigits((int64_t) 239LL, digits
, status
);
1829 if (status
!= U_ILLEGAL_ARGUMENT_ERROR
) {
1830 errln("239: Expected U_ILLEGAL_ARGUMENT_ERROR");
1834 UErrorCode status
= U_ZERO_ERROR
;
1835 FixedPrecision precision
;
1836 precision
.fSignificant
.setMin(5);
1837 verifyVisibleDigits(
1840 precision
.initVisibleDigits((int64_t) 153LL, digits
, status
));
1841 assertSuccess("153", status
);
1844 UErrorCode status
= U_ZERO_ERROR
;
1845 FixedPrecision precision
;
1846 precision
.fSignificant
.setMax(2);
1847 precision
.fExactOnly
= TRUE
;
1848 precision
.initVisibleDigits((int64_t) 154LL, digits
, status
);
1849 if (status
!= U_FORMAT_INEXACT_ERROR
) {
1850 errln("154: Expected U_FORMAT_INEXACT_ERROR");
1854 UErrorCode status
= U_ZERO_ERROR
;
1855 FixedPrecision precision
;
1856 precision
.fSignificant
.setMax(5);
1857 verifyVisibleDigits(
1860 precision
.initVisibleDigits((int64_t) 150LL, digits
, status
));
1861 assertSuccess("150", status
);
1865 void NumberFormat2Test::TestIntInitVisibleDigitsToDigitList() {
1866 VisibleDigits digits
;
1868 UErrorCode status
= U_ZERO_ERROR
;
1869 FixedPrecision precision
;
1870 precision
.fRoundingIncrement
.set(7.3);
1871 verifyVisibleDigits(
1874 precision
.initVisibleDigits((int64_t) -30LL, digits
, status
));
1875 assertSuccess("-29.2", status
);
1878 UErrorCode status
= U_ZERO_ERROR
;
1879 FixedPrecision precision
;
1880 precision
.fRoundingIncrement
.set(7.3);
1881 precision
.fRoundingMode
= DecimalFormat::kRoundFloor
;
1882 verifyVisibleDigits(
1885 precision
.initVisibleDigits((int64_t) -30LL, digits
, status
));
1886 assertSuccess("-36.5", status
);
1889 UErrorCode status
= U_ZERO_ERROR
;
1890 FixedPrecision precision
;
1891 precision
.fSignificant
.setMax(3);
1892 precision
.fRoundingMode
= DecimalFormat::kRoundCeiling
;
1893 verifyVisibleDigits(
1896 precision
.initVisibleDigits((int64_t) 1381LL, digits
, status
));
1897 assertSuccess("1390", status
);
1900 UErrorCode status
= U_ZERO_ERROR
;
1901 FixedPrecision precision
;
1902 precision
.fSignificant
.setMax(1);
1903 precision
.fRoundingMode
= DecimalFormat::kRoundFloor
;
1904 verifyVisibleDigits(
1907 precision
.initVisibleDigits((int64_t) -1381LL, digits
, status
));
1908 assertSuccess("-2000", status
);
1912 void NumberFormat2Test::TestDoubleInitVisibleDigits() {
1913 VisibleDigits digits
;
1915 UErrorCode status
= U_ZERO_ERROR
;
1916 FixedPrecision precision
;
1917 verifyVisibleDigits(
1920 precision
.initVisibleDigits(2.05, digits
, status
));
1921 assertSuccess("2.05", status
);
1924 UErrorCode status
= U_ZERO_ERROR
;
1925 FixedPrecision precision
;
1926 verifyVisibleDigits(
1929 precision
.initVisibleDigits(3547.0, digits
, status
));
1930 assertSuccess("3547", status
);
1933 UErrorCode status
= U_ZERO_ERROR
;
1934 FixedPrecision precision
;
1935 precision
.fMax
.setFracDigitCount(2);
1936 precision
.fMax
.setIntDigitCount(1);
1937 precision
.fFailIfOverMax
= TRUE
;
1938 precision
.fExactOnly
= TRUE
;
1939 verifyVisibleDigits(
1942 precision
.initVisibleDigits(-2.05, digits
, status
));
1943 assertSuccess("-2.05", status
);
1946 UErrorCode status
= U_ZERO_ERROR
;
1947 FixedPrecision precision
;
1948 precision
.fMax
.setFracDigitCount(1);
1949 precision
.fMax
.setIntDigitCount(1);
1950 precision
.fFailIfOverMax
= TRUE
;
1951 precision
.fExactOnly
= TRUE
;
1952 precision
.initVisibleDigits(-2.05, digits
, status
);
1953 if (status
!= U_FORMAT_INEXACT_ERROR
) {
1954 errln("6245.3: Expected U_FORMAT_INEXACT_ERROR");
1958 UErrorCode status
= U_ZERO_ERROR
;
1959 FixedPrecision precision
;
1960 precision
.fMax
.setFracDigitCount(2);
1961 precision
.fMax
.setIntDigitCount(0);
1962 precision
.fFailIfOverMax
= TRUE
;
1963 precision
.fExactOnly
= TRUE
;
1964 precision
.initVisibleDigits(-2.05, digits
, status
);
1965 if (status
!= U_ILLEGAL_ARGUMENT_ERROR
) {
1966 errln("-2.05: Expected U_ILLEGAL_ARGUMENT_ERROR");
1970 UErrorCode status
= U_ZERO_ERROR
;
1971 FixedPrecision precision
;
1972 precision
.fMin
.setIntDigitCount(5);
1973 precision
.fMin
.setFracDigitCount(2);
1974 precision
.fExactOnly
= TRUE
;
1975 verifyVisibleDigits(
1978 precision
.initVisibleDigits(6245.3, digits
, status
));
1979 assertSuccess("06245.30", status
);
1982 UErrorCode status
= U_ZERO_ERROR
;
1983 FixedPrecision precision
;
1984 precision
.fSignificant
.setMax(5);
1985 precision
.fExactOnly
= TRUE
;
1986 verifyVisibleDigits(
1989 precision
.initVisibleDigits(6245.3, digits
, status
));
1990 assertSuccess("6245.3", status
);
1993 UErrorCode status
= U_ZERO_ERROR
;
1994 FixedPrecision precision
;
1995 precision
.fSignificant
.setMax(4);
1996 precision
.fExactOnly
= TRUE
;
1997 precision
.initVisibleDigits(6245.3, digits
, status
);
1998 if (status
!= U_FORMAT_INEXACT_ERROR
) {
1999 errln("6245.3: Expected U_FORMAT_INEXACT_ERROR");
2003 UErrorCode status
= U_ZERO_ERROR
;
2004 FixedPrecision precision
;
2005 precision
.fMax
.setIntDigitCount(3);
2006 precision
.fMin
.setFracDigitCount(2);
2007 verifyVisibleDigits(
2010 precision
.initVisibleDigits(2384.9, digits
, status
));
2011 assertSuccess("380.00", status
);
2014 UErrorCode status
= U_ZERO_ERROR
;
2015 FixedPrecision precision
;
2016 precision
.fMax
.setIntDigitCount(3);
2017 precision
.fMin
.setFracDigitCount(2);
2018 precision
.fFailIfOverMax
= TRUE
;
2019 precision
.initVisibleDigits(2384.9, digits
, status
);
2020 if (status
!= U_ILLEGAL_ARGUMENT_ERROR
) {
2021 errln("2384.9: Expected U_ILLEGAL_ARGUMENT_ERROR");
2026 void NumberFormat2Test::TestDoubleInitVisibleDigitsToDigitList() {
2027 VisibleDigits digits
;
2029 UErrorCode status
= U_ZERO_ERROR
;
2030 FixedPrecision precision
;
2031 // 2.01 produces round off error when multiplied by powers of
2032 // 10 forcing the use of DigitList.
2033 verifyVisibleDigits(
2036 precision
.initVisibleDigits(-2.01, digits
, status
));
2037 assertSuccess("-2.01", status
);
2040 UErrorCode status
= U_ZERO_ERROR
;
2041 FixedPrecision precision
;
2042 precision
.fSignificant
.setMax(3);
2043 precision
.fMin
.setFracDigitCount(2);
2044 verifyVisibleDigits(
2047 precision
.initVisibleDigits(2385.0, digits
, status
));
2048 assertSuccess("2380.00", status
);
2051 UErrorCode status
= U_ZERO_ERROR
;
2052 FixedPrecision precision
;
2053 precision
.fMax
.setFracDigitCount(2);
2054 verifyVisibleDigits(
2057 precision
.initVisibleDigits(-45.8251, digits
, status
));
2058 assertSuccess("45.83", status
);
2062 void NumberFormat2Test::TestDigitListInitVisibleDigits() {
2063 VisibleDigits digits
;
2066 UErrorCode status
= U_ZERO_ERROR
;
2067 FixedPrecision precision
;
2068 precision
.fMax
.setIntDigitCount(3);
2069 precision
.fMin
.setFracDigitCount(2);
2070 precision
.fFailIfOverMax
= TRUE
;
2072 precision
.initVisibleDigits(dlist
, digits
, status
);
2073 if (status
!= U_ILLEGAL_ARGUMENT_ERROR
) {
2074 errln("2384.9: Expected U_ILLEGAL_ARGUMENT_ERROR");
2078 UErrorCode status
= U_ZERO_ERROR
;
2079 FixedPrecision precision
;
2080 precision
.fSignificant
.setMax(4);
2081 precision
.fExactOnly
= TRUE
;
2083 precision
.initVisibleDigits(dlist
, digits
, status
);
2084 if (status
!= U_FORMAT_INEXACT_ERROR
) {
2085 errln("6245.3: Expected U_FORMAT_INEXACT_ERROR");
2090 void NumberFormat2Test::TestSpecialInitVisibleDigits() {
2091 VisibleDigits digits
;
2093 UErrorCode status
= U_ZERO_ERROR
;
2094 FixedPrecision precision
;
2095 precision
.fSignificant
.setMax(3);
2096 precision
.fMin
.setFracDigitCount(2);
2097 precision
.initVisibleDigits(-uprv_getInfinity(), digits
, status
);
2098 assertFalse("", digits
.isNaN());
2099 assertTrue("", digits
.isInfinite());
2100 assertTrue("", digits
.isNegative());
2101 assertSuccess("-Inf", status
);
2104 UErrorCode status
= U_ZERO_ERROR
;
2105 FixedPrecision precision
;
2106 precision
.initVisibleDigits(uprv_getInfinity(), digits
, status
);
2107 assertFalse("", digits
.isNaN());
2108 assertTrue("", digits
.isInfinite());
2109 assertFalse("", digits
.isNegative());
2110 assertSuccess("Inf", status
);
2113 UErrorCode status
= U_ZERO_ERROR
;
2114 FixedPrecision precision
;
2115 precision
.initVisibleDigits(uprv_getNaN(), digits
, status
);
2116 assertTrue("", digits
.isNaN());
2117 assertSuccess("Inf", status
);
2121 void NumberFormat2Test::TestVisibleDigitsWithExponent() {
2122 VisibleDigitsWithExponent digits
;
2124 UErrorCode status
= U_ZERO_ERROR
;
2125 ScientificPrecision precision
;
2126 precision
.initVisibleDigitsWithExponent(389.256, digits
, status
);
2127 verifyVisibleDigitsWithExponent(
2128 "3.89256E2", FALSE
, digits
);
2129 assertSuccess("3.89256E2", status
);
2132 UErrorCode status
= U_ZERO_ERROR
;
2133 ScientificPrecision precision
;
2134 precision
.initVisibleDigitsWithExponent(-389.256, digits
, status
);
2135 verifyVisibleDigitsWithExponent(
2136 "3.89256E2", TRUE
, digits
);
2137 assertSuccess("-3.89256E2", status
);
2140 UErrorCode status
= U_ZERO_ERROR
;
2141 ScientificPrecision precision
;
2142 precision
.fMinExponentDigits
= 3;
2143 precision
.fMantissa
.fMin
.setIntDigitCount(1);
2144 precision
.fMantissa
.fMax
.setIntDigitCount(3);
2145 precision
.initVisibleDigitsWithExponent(12345.67, digits
, status
);
2146 verifyVisibleDigitsWithExponent(
2147 "12.34567E003", FALSE
, digits
);
2148 assertSuccess("12.34567E003", status
);
2151 UErrorCode status
= U_ZERO_ERROR
;
2152 ScientificPrecision precision
;
2153 precision
.fMantissa
.fRoundingIncrement
.set(0.073);
2154 precision
.fMantissa
.fMin
.setIntDigitCount(2);
2155 precision
.fMantissa
.fMax
.setIntDigitCount(2);
2156 precision
.initVisibleDigitsWithExponent(999.74, digits
, status
);
2157 verifyVisibleDigitsWithExponent(
2158 "10.001E2", FALSE
, digits
);
2159 assertSuccess("10.001E2", status
);
2163 void NumberFormat2Test::TestDigitAffixesAndPadding() {
2164 UErrorCode status
= U_ZERO_ERROR
;
2165 DecimalFormatSymbols
symbols("en", status
);
2166 if (!assertSuccess("", status
)) {
2169 DigitFormatter
formatter(symbols
);
2170 DigitGrouping grouping
;
2171 grouping
.fGrouping
= 3;
2172 FixedPrecision precision
;
2173 DigitFormatterOptions options
;
2174 options
.fAlwaysShowDecimal
= TRUE
;
2176 vf
.prepareFixedDecimalFormatting(
2181 DigitAffixesAndPadding aap
;
2182 aap
.fPositivePrefix
.append("(+", UNUM_SIGN_FIELD
);
2183 aap
.fPositiveSuffix
.append("+)", UNUM_SIGN_FIELD
);
2184 aap
.fNegativePrefix
.append("(-", UNUM_SIGN_FIELD
);
2185 aap
.fNegativeSuffix
.append("-)", UNUM_SIGN_FIELD
);
2187 aap
.fPadPosition
= DigitAffixesAndPadding::kPadBeforePrefix
;
2189 NumberFormat2Test_Attributes expectedAttributes
[] = {
2190 {UNUM_SIGN_FIELD
, 4, 6},
2191 {UNUM_INTEGER_FIELD
, 6, 7},
2192 {UNUM_DECIMAL_SEPARATOR_FIELD
, 7, 8},
2193 {UNUM_SIGN_FIELD
, 8, 10},
2195 verifyAffixesAndPaddingInt32(
2201 expectedAttributes
);
2203 aap
.fPadPosition
= DigitAffixesAndPadding::kPadAfterPrefix
;
2205 NumberFormat2Test_Attributes expectedAttributes
[] = {
2206 {UNUM_SIGN_FIELD
, 0, 2},
2207 {UNUM_INTEGER_FIELD
, 6, 7},
2208 {UNUM_DECIMAL_SEPARATOR_FIELD
, 7, 8},
2209 {UNUM_SIGN_FIELD
, 8, 10},
2211 verifyAffixesAndPaddingInt32(
2217 expectedAttributes
);
2219 aap
.fPadPosition
= DigitAffixesAndPadding::kPadBeforeSuffix
;
2221 NumberFormat2Test_Attributes expectedAttributes
[] = {
2222 {UNUM_SIGN_FIELD
, 0, 2},
2223 {UNUM_INTEGER_FIELD
, 2, 3},
2224 {UNUM_DECIMAL_SEPARATOR_FIELD
, 3, 4},
2225 {UNUM_SIGN_FIELD
, 8, 10},
2227 verifyAffixesAndPaddingInt32(
2233 expectedAttributes
);
2235 aap
.fPadPosition
= DigitAffixesAndPadding::kPadAfterSuffix
;
2237 NumberFormat2Test_Attributes expectedAttributes
[] = {
2238 {UNUM_SIGN_FIELD
, 0, 2},
2239 {UNUM_INTEGER_FIELD
, 2, 3},
2240 {UNUM_DECIMAL_SEPARATOR_FIELD
, 3, 4},
2241 {UNUM_SIGN_FIELD
, 4, 6},
2243 verifyAffixesAndPaddingInt32(
2249 expectedAttributes
);
2251 aap
.fPadPosition
= DigitAffixesAndPadding::kPadAfterSuffix
;
2254 digits
.set(-1234.5);
2255 NumberFormat2Test_Attributes expectedAttributes
[] = {
2256 {UNUM_SIGN_FIELD
, 0, 2},
2257 {UNUM_GROUPING_SEPARATOR_FIELD
, 3, 4},
2258 {UNUM_INTEGER_FIELD
, 2, 7},
2259 {UNUM_DECIMAL_SEPARATOR_FIELD
, 7, 8},
2260 {UNUM_FRACTION_FIELD
, 8, 9},
2261 {UNUM_SIGN_FIELD
, 9, 11},
2263 verifyAffixesAndPadding(
2269 expectedAttributes
);
2271 assertFalse("", aap
.needsPluralRules());
2274 aap
.fPositivePrefix
.remove();
2275 aap
.fPositiveSuffix
.remove();
2276 aap
.fNegativePrefix
.remove();
2277 aap
.fNegativeSuffix
.remove();
2279 // Set up for plural currencies.
2280 aap
.fNegativePrefix
.append("-", UNUM_SIGN_FIELD
);
2283 part
.setVariant("one", " Dollar", status
);
2284 part
.setVariant("other", " Dollars", status
);
2285 aap
.fPositiveSuffix
.append(part
, UNUM_CURRENCY_FIELD
, status
);
2287 aap
.fNegativeSuffix
= aap
.fPositiveSuffix
;
2289 LocalPointer
<PluralRules
> rules(PluralRules::forLocale("en", status
));
2290 if (!assertSuccess("", status
)) {
2294 // Exercise the fastrack path
2296 options
.fAlwaysShowDecimal
= FALSE
;
2297 NumberFormat2Test_Attributes expectedAttributes
[] = {
2298 {UNUM_SIGN_FIELD
, 0, 1},
2299 {UNUM_INTEGER_FIELD
, 1, 3},
2300 {UNUM_CURRENCY_FIELD
, 3, 11},
2302 verifyAffixesAndPaddingInt32(
2308 expectedAttributes
);
2309 options
.fAlwaysShowDecimal
= TRUE
;
2313 assertTrue("", aap
.needsPluralRules());
2315 NumberFormat2Test_Attributes expectedAttributes
[] = {
2316 {UNUM_INTEGER_FIELD
, 0, 1},
2317 {UNUM_DECIMAL_SEPARATOR_FIELD
, 1, 2},
2318 {UNUM_CURRENCY_FIELD
, 2, 9},
2320 verifyAffixesAndPaddingInt32(
2326 expectedAttributes
);
2329 NumberFormat2Test_Attributes expectedAttributes
[] = {
2330 {UNUM_SIGN_FIELD
, 0, 1},
2331 {UNUM_INTEGER_FIELD
, 1, 2},
2332 {UNUM_DECIMAL_SEPARATOR_FIELD
, 2, 3},
2333 {UNUM_CURRENCY_FIELD
, 3, 10},
2335 verifyAffixesAndPaddingInt32(
2341 expectedAttributes
);
2343 precision
.fMin
.setFracDigitCount(2);
2345 NumberFormat2Test_Attributes expectedAttributes
[] = {
2346 {UNUM_INTEGER_FIELD
, 0, 1},
2347 {UNUM_DECIMAL_SEPARATOR_FIELD
, 1, 2},
2348 {UNUM_FRACTION_FIELD
, 2, 4},
2349 {UNUM_CURRENCY_FIELD
, 4, 12},
2351 verifyAffixesAndPaddingInt32(
2357 expectedAttributes
);
2361 void NumberFormat2Test::TestPluralsAndRounding() {
2362 UErrorCode status
= U_ZERO_ERROR
;
2363 DecimalFormatSymbols
symbols("en", status
);
2364 if (!assertSuccess("", status
)) {
2367 DigitFormatter
formatter(symbols
);
2368 DigitGrouping grouping
;
2369 FixedPrecision precision
;
2370 precision
.fSignificant
.setMax(3);
2371 DigitFormatterOptions options
;
2373 vf
.prepareFixedDecimalFormatting(
2379 DigitAffixesAndPadding aap
;
2380 // Set up for plural currencies.
2381 aap
.fNegativePrefix
.append("-", UNUM_SIGN_FIELD
);
2384 part
.setVariant("one", " Dollar", status
);
2385 part
.setVariant("other", " Dollars", status
);
2386 aap
.fPositiveSuffix
.append(part
, UNUM_CURRENCY_FIELD
, status
);
2388 aap
.fNegativeSuffix
= aap
.fPositiveSuffix
;
2390 LocalPointer
<PluralRules
> rules(PluralRules::forLocale("en", status
));
2391 if (!assertSuccess("", status
)) {
2396 verifyAffixesAndPadding(
2406 verifyAffixesAndPadding(
2416 verifyAffixesAndPadding(
2424 precision
.fSignificant
.setMin(2);
2427 verifyAffixesAndPadding(
2437 verifyAffixesAndPadding(
2445 precision
.fSignificant
.setMin(0);
2447 digits
.set(-79.214);
2448 verifyAffixesAndPadding(
2456 // No more sig digits just max fractions
2457 precision
.fSignificant
.setMax(0);
2458 precision
.fMax
.setFracDigitCount(4);
2460 digits
.set(79.213562);
2461 verifyAffixesAndPadding(
2473 void NumberFormat2Test::TestPluralsAndRoundingScientific() {
2474 UErrorCode status
= U_ZERO_ERROR
;
2475 DecimalFormatSymbols
symbols("en", status
);
2476 if (!assertSuccess("", status
)) {
2479 DigitFormatter
formatter(symbols
);
2480 ScientificPrecision precision
;
2481 precision
.fMantissa
.fSignificant
.setMax(4);
2482 SciFormatterOptions options
;
2484 vf
.prepareScientificFormatting(
2489 DigitAffixesAndPadding aap
;
2490 aap
.fNegativePrefix
.append("-", UNUM_SIGN_FIELD
);
2493 part
.setVariant("one", " Meter", status
);
2494 part
.setVariant("other", " Meters", status
);
2495 aap
.fPositiveSuffix
.append(part
, UNUM_FIELD_COUNT
, status
);
2497 aap
.fNegativeSuffix
= aap
.fPositiveSuffix
;
2498 LocalPointer
<PluralRules
> rules(PluralRules::forLocale("en", status
));
2499 if (!assertSuccess("", status
)) {
2503 digits
.set(0.99996);
2504 NumberFormat2Test_Attributes expectedAttributes
[] = {
2505 {UNUM_INTEGER_FIELD
, 0, 1},
2506 {UNUM_EXPONENT_SYMBOL_FIELD
, 1, 2},
2507 {UNUM_EXPONENT_FIELD
, 2, 3},
2509 verifyAffixesAndPadding(
2515 expectedAttributes
);
2517 options
.fMantissa
.fAlwaysShowDecimal
= TRUE
;
2519 digits
.set(0.99996);
2520 NumberFormat2Test_Attributes expectedAttributes
[] = {
2521 {UNUM_INTEGER_FIELD
, 0, 1},
2522 {UNUM_DECIMAL_SEPARATOR_FIELD
, 1, 2},
2523 {UNUM_EXPONENT_SYMBOL_FIELD
, 2, 3},
2524 {UNUM_EXPONENT_FIELD
, 3, 4},
2526 verifyAffixesAndPadding(
2532 expectedAttributes
);
2535 digits
.set(-299792458);
2536 NumberFormat2Test_Attributes expectedAttributes
[] = {
2537 {UNUM_SIGN_FIELD
, 0, 1},
2538 {UNUM_INTEGER_FIELD
, 1, 2},
2539 {UNUM_DECIMAL_SEPARATOR_FIELD
, 2, 3},
2540 {UNUM_FRACTION_FIELD
, 3, 6},
2541 {UNUM_EXPONENT_SYMBOL_FIELD
, 6, 7},
2542 {UNUM_EXPONENT_FIELD
, 7, 8},
2544 verifyAffixesAndPadding(
2550 expectedAttributes
);
2552 precision
.fMantissa
.fSignificant
.setMin(4);
2553 options
.fExponent
.fAlwaysShowSign
= TRUE
;
2554 precision
.fMinExponentDigits
= 3;
2557 NumberFormat2Test_Attributes expectedAttributes
[] = {
2558 {UNUM_INTEGER_FIELD
, 0, 1},
2559 {UNUM_DECIMAL_SEPARATOR_FIELD
, 1, 2},
2560 {UNUM_FRACTION_FIELD
, 2, 5},
2561 {UNUM_EXPONENT_SYMBOL_FIELD
, 5, 6},
2562 {UNUM_EXPONENT_SIGN_FIELD
, 6, 7},
2563 {UNUM_EXPONENT_FIELD
, 7, 10},
2565 verifyAffixesAndPadding(
2566 "3.000E+000 Meters",
2571 expectedAttributes
);
2573 precision
.fMantissa
.fMax
.setIntDigitCount(3);
2575 digits
.set(0.00025001);
2576 NumberFormat2Test_Attributes expectedAttributes
[] = {
2577 {UNUM_INTEGER_FIELD
, 0, 3},
2578 {UNUM_DECIMAL_SEPARATOR_FIELD
, 3, 4},
2579 {UNUM_FRACTION_FIELD
, 4, 5},
2580 {UNUM_EXPONENT_SYMBOL_FIELD
, 5, 6},
2581 {UNUM_EXPONENT_SIGN_FIELD
, 6, 7},
2582 {UNUM_EXPONENT_FIELD
, 7, 10},
2584 verifyAffixesAndPadding(
2585 "250.0E-006 Meters",
2590 expectedAttributes
);
2593 digits
.set(0.0000025001);
2594 NumberFormat2Test_Attributes expectedAttributes
[] = {
2595 {UNUM_INTEGER_FIELD
, 0, 1},
2596 {UNUM_DECIMAL_SEPARATOR_FIELD
, 1, 2},
2597 {UNUM_FRACTION_FIELD
, 2, 5},
2598 {UNUM_EXPONENT_SYMBOL_FIELD
, 5, 6},
2599 {UNUM_EXPONENT_SIGN_FIELD
, 6, 7},
2600 {UNUM_EXPONENT_FIELD
, 7, 10},
2602 verifyAffixesAndPadding(
2603 "2.500E-006 Meters",
2608 expectedAttributes
);
2610 precision
.fMantissa
.fMax
.setFracDigitCount(1);
2612 digits
.set(0.0000025499);
2613 NumberFormat2Test_Attributes expectedAttributes
[] = {
2614 {UNUM_INTEGER_FIELD
, 0, 1},
2615 {UNUM_DECIMAL_SEPARATOR_FIELD
, 1, 2},
2616 {UNUM_FRACTION_FIELD
, 2, 3},
2617 {UNUM_EXPONENT_SYMBOL_FIELD
, 3, 4},
2618 {UNUM_EXPONENT_SIGN_FIELD
, 4, 5},
2619 {UNUM_EXPONENT_FIELD
, 5, 8},
2621 verifyAffixesAndPadding(
2627 expectedAttributes
);
2629 precision
.fMantissa
.fMax
.setIntDigitCount(1);
2630 precision
.fMantissa
.fMax
.setFracDigitCount(2);
2632 digits
.set(299792458);
2633 verifyAffixesAndPadding(
2641 // clear significant digits
2642 precision
.fMantissa
.fSignificant
.setMin(0);
2643 precision
.fMantissa
.fSignificant
.setMax(0);
2645 // set int and fraction digits
2646 precision
.fMantissa
.fMin
.setFracDigitCount(2);
2647 precision
.fMantissa
.fMax
.setFracDigitCount(4);
2648 precision
.fMantissa
.fMin
.setIntDigitCount(2);
2649 precision
.fMantissa
.fMax
.setIntDigitCount(3);
2651 digits
.set(-0.0000025300001);
2652 verifyAffixesAndPadding(
2653 "-253.00E-008 Meters",
2661 digits
.set(-0.0000025300006);
2662 verifyAffixesAndPadding(
2663 "-253.0001E-008 Meters",
2671 digits
.set(-0.000025300006);
2672 verifyAffixesAndPadding(
2673 "-25.30E-006 Meters",
2683 void NumberFormat2Test::TestRoundingIncrement() {
2684 UErrorCode status
= U_ZERO_ERROR
;
2685 DecimalFormatSymbols
symbols("en", status
);
2686 if (U_FAILURE(status
)) {
2687 dataerrln("Error creating DecimalFormatSymbols - %s", u_errorName(status
));
2690 DigitFormatter
formatter(symbols
);
2691 ScientificPrecision precision
;
2692 SciFormatterOptions options
;
2693 precision
.fMantissa
.fRoundingIncrement
.set(0.25);
2694 precision
.fMantissa
.fSignificant
.setMax(4);
2695 DigitGrouping grouping
;
2699 vf
.prepareFixedDecimalFormatting(
2702 precision
.fMantissa
,
2705 DigitAffixesAndPadding aap
;
2706 aap
.fNegativePrefix
.append("-", UNUM_SIGN_FIELD
);
2709 verifyAffixesAndPadding(
2718 verifyAffixesAndPadding(
2727 verifyAffixesAndPadding(
2734 precision
.fMantissa
.fMin
.setFracDigitCount(2);
2737 verifyAffixesAndPadding(
2745 digits
.set(-639.65);
2746 verifyAffixesAndPadding(
2754 precision
.fMantissa
.fMin
.setIntDigitCount(2);
2755 // Scientific notation
2756 vf
.prepareScientificFormatting(
2761 digits
.set(-6396.5);
2762 verifyAffixesAndPadding(
2770 digits
.set(-0.00092374);
2771 verifyAffixesAndPadding(
2778 precision
.fMantissa
.fMax
.setIntDigitCount(3);
2780 digits
.set(-0.00092374);
2781 verifyAffixesAndPadding(
2790 void NumberFormat2Test::TestToPatternScientific11648() {
2792 UErrorCode status = U_ZERO_ERROR;
2794 DecimalFormat2 fmt(en, "0.00", status);
2795 fmt.setScientificNotation(TRUE);
2796 UnicodeString pattern;
2797 // Fails, produces "0.00E"
2798 assertEquals("", "0.00E0", fmt.toPattern(pattern));
2799 DecimalFormat fmt2(pattern, status);
2800 // Fails, bad pattern.
2801 assertSuccess("", status);
2805 void NumberFormat2Test::verifyAffixesAndPadding(
2806 const UnicodeString
&expected
,
2807 const DigitAffixesAndPadding
&aaf
,
2809 const ValueFormatter
&vf
,
2810 const PluralRules
*optPluralRules
,
2811 const NumberFormat2Test_Attributes
*expectedAttributes
) {
2812 UnicodeString appendTo
;
2813 NumberFormat2Test_FieldPositionHandler handler
;
2814 UErrorCode status
= U_ZERO_ERROR
;
2825 if (!assertSuccess("", status
)) {
2828 if (expectedAttributes
!= NULL
) {
2829 verifyAttributes(expectedAttributes
, handler
.attributes
);
2833 void NumberFormat2Test::verifyAffixesAndPaddingInt32(
2834 const UnicodeString
&expected
,
2835 const DigitAffixesAndPadding
&aaf
,
2837 const ValueFormatter
&vf
,
2838 const PluralRules
*optPluralRules
,
2839 const NumberFormat2Test_Attributes
*expectedAttributes
) {
2840 UnicodeString appendTo
;
2841 NumberFormat2Test_FieldPositionHandler handler
;
2842 UErrorCode status
= U_ZERO_ERROR
;
2853 if (!assertSuccess("", status
)) {
2856 if (expectedAttributes
!= NULL
) {
2857 verifyAttributes(expectedAttributes
, handler
.attributes
);
2861 verifyAffixesAndPadding(
2862 expected
, aaf
, digits
, vf
, optPluralRules
, expectedAttributes
);
2865 void NumberFormat2Test::verifyAffix(
2866 const UnicodeString
&expected
,
2867 const DigitAffix
&affix
,
2868 const NumberFormat2Test_Attributes
*expectedAttributes
) {
2869 UnicodeString appendTo
;
2870 NumberFormat2Test_FieldPositionHandler handler
;
2873 expected
.unescape(),
2874 affix
.format(handler
, appendTo
));
2875 if (expectedAttributes
!= NULL
) {
2876 verifyAttributes(expectedAttributes
, handler
.attributes
);
2880 // Right now only works for positive values.
2881 void NumberFormat2Test::verifyDigitList(
2882 const UnicodeString
&expected
,
2883 const DigitList
&digits
) {
2884 DigitFormatter formatter
;
2885 DigitGrouping grouping
;
2886 VisibleDigits visibleDigits
;
2887 FixedPrecision precision
;
2888 precision
.fMin
.setIntDigitCount(0);
2889 DigitFormatterOptions options
;
2890 UErrorCode status
= U_ZERO_ERROR
;
2891 DigitList
dlCopy(digits
);
2892 precision
.initVisibleDigits(
2893 dlCopy
, visibleDigits
, status
);
2894 if (!assertSuccess("", status
)) {
2897 verifyDigitFormatter(
2906 void NumberFormat2Test::verifyVisibleDigits(
2907 const UnicodeString
&expected
,
2909 const VisibleDigits
&digits
) {
2910 DigitFormatter formatter
;
2911 DigitGrouping grouping
;
2912 DigitFormatterOptions options
;
2913 verifyDigitFormatter(
2920 if (digits
.isNegative() != bNegative
) {
2921 errln(expected
+ ": Wrong sign.");
2923 if (digits
.isNaN() || digits
.isInfinite()) {
2924 errln(expected
+ ": Require real value.");
2928 void NumberFormat2Test::verifyVisibleDigitsWithExponent(
2929 const UnicodeString
&expected
,
2931 const VisibleDigitsWithExponent
&digits
) {
2932 DigitFormatter formatter
;
2933 SciFormatterOptions options
;
2940 if (digits
.isNegative() != bNegative
) {
2941 errln(expected
+ ": Wrong sign.");
2943 if (digits
.isNaN() || digits
.isInfinite()) {
2944 errln(expected
+ ": Require real value.");
2948 void NumberFormat2Test::verifySciFormatter(
2949 const UnicodeString
&expected
,
2950 const DigitFormatter
&formatter
,
2951 const VisibleDigitsWithExponent
&digits
,
2952 const SciFormatterOptions
&options
,
2953 const NumberFormat2Test_Attributes
*expectedAttributes
) {
2956 expected
.countChar32(),
2957 formatter
.countChar32(digits
, options
));
2958 UnicodeString appendTo
;
2959 NumberFormat2Test_FieldPositionHandler handler
;
2968 if (expectedAttributes
!= NULL
) {
2969 verifyAttributes(expectedAttributes
, handler
.attributes
);
2973 void NumberFormat2Test::verifyPositiveIntDigitFormatter(
2974 const UnicodeString
&expected
,
2975 const DigitFormatter
&formatter
,
2979 const NumberFormat2Test_Attributes
*expectedAttributes
) {
2980 IntDigitCountRange
range(minDigits
, maxDigits
);
2981 UnicodeString appendTo
;
2982 NumberFormat2Test_FieldPositionHandler handler
;
2986 formatter
.formatPositiveInt32(
2991 if (expectedAttributes
!= NULL
) {
2992 verifyAttributes(expectedAttributes
, handler
.attributes
);
2996 void NumberFormat2Test::verifyDigitFormatter(
2997 const UnicodeString
&expected
,
2998 const DigitFormatter
&formatter
,
2999 const VisibleDigits
&digits
,
3000 const DigitGrouping
&grouping
,
3001 const DigitFormatterOptions
&options
,
3002 const NumberFormat2Test_Attributes
*expectedAttributes
) {
3005 expected
.countChar32(),
3006 formatter
.countChar32(digits
, grouping
, options
));
3007 UnicodeString appendTo
;
3008 NumberFormat2Test_FieldPositionHandler handler
;
3018 if (expectedAttributes
!= NULL
) {
3019 verifyAttributes(expectedAttributes
, handler
.attributes
);
3023 void NumberFormat2Test::verifySmallIntFormatter(
3024 const UnicodeString
&expected
,
3025 int32_t positiveValue
,
3027 int32_t maxDigits
) {
3028 IntDigitCountRange
range(minDigits
, maxDigits
);
3029 if (!SmallIntFormatter::canFormat(positiveValue
, range
)) {
3030 UnicodeString actual
;
3031 assertEquals("", expected
, actual
);
3034 UnicodeString actual
;
3035 assertEquals("", expected
, SmallIntFormatter::format(positiveValue
, range
, actual
));
3038 void NumberFormat2Test::verifyAttributes(
3039 const NumberFormat2Test_Attributes
*expected
,
3040 const NumberFormat2Test_Attributes
*actual
) {
3042 while (expected
[idx
].spos
!= -1 && actual
[idx
].spos
!= -1) {
3043 assertEquals("id", expected
[idx
].id
, actual
[idx
].id
);
3044 assertEquals("spos", expected
[idx
].spos
, actual
[idx
].spos
);
3045 assertEquals("epos", expected
[idx
].epos
, actual
[idx
].epos
);
3049 "expected and actual not same length",
3054 void NumberFormat2Test::verifyIntValue(
3055 int64_t expected
, const VisibleDigits
&digits
) {
3056 double unusedSource
;
3061 UBool unusedHasIntValue
;
3062 digits
.getFixedDecimal(
3063 unusedSource
, intValue
, unusedF
,
3064 unusedT
, unusedV
, unusedHasIntValue
);
3065 assertEquals("", expected
, intValue
);
3068 void NumberFormat2Test::verifySource(
3069 double expected
, const VisibleDigits
&digits
) {
3071 int64_t unusedIntValue
;
3075 UBool unusedHasIntValue
;
3076 digits
.getFixedDecimal(
3077 source
, unusedIntValue
, unusedF
,
3078 unusedT
, unusedV
, unusedHasIntValue
);
3079 if (expected
!= source
) {
3080 errln("Expected %f, got %f instead", expected
, source
);
3084 extern IntlTest
*createNumberFormat2Test() {
3085 return new NumberFormat2Test();
3088 #endif /* !UCONFIG_NO_FORMATTING */