-// Copyright (C) 2016 and later: Unicode, Inc. and others.
+// Copyright (C) 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
// Copyright (C) 2015-2016, International Business Machines
// Corporation and others. All Rights Reserved.
// for that test suite. After the global settings, comes "begin", the
// per-test field names, and finally the test specific field values, 1 test
// per line.
+//
+// Field names:
+// J = ICU4J (current)
+// K = JDK (ignored if not OpenJDK 1.8)
+// C = ICU4C (current)
+// P = Properties-based ICU4J (bypasses DecimalFormat wrapper)
+//
// For more information on the format of this file, including all the available
// field names, please see
// https://docs.google.com/document/d/1T2P0p953_Lh1pRwo-5CuPVrHlIBa_wcXElG-Hhg_WHM/edit?usp=sharing
test plus sign
-set locale ar
+set locale ar-EG
set pattern +0;-#
begin
format output breaks
-6 \u061C+\u0666 JK
--6 \u061C-\u0666 JK
+6 \u061C+\u0666 K
+-6 \u061C-\u0666 K
test basic patterns
set locale fr_FR
set format 1234.567
begin
-pattern output
-#,##0.## 1\u00a0234,57
+pattern output breaks
+// K does not use \u202f narrow space
+#,##0.## 1\u202f234,57 K
0.## 1234,57
0 1235
-#,##0.### 1\u00a0234,567
+#,##0.### 1\u202f234,567 K
###0.###### 1234,567
###0.0000# 1234,5670
00000.0000 01234,5670
-#,##0.00 \u00a4 1\u00a0234,57 \u20ac
+#,##0.00 \u00a4 1\u202f234,57 \u20ac K
'tick''bitten '0.00 tick'bitten 1234,57
'tick' 'bitten '0.00 tick bitten 1234,57
12345 2345.000
72.1234 72.1234
+test patterns with no '0' symbols
+set locale en_US
+begin
+pattern format output breaks
+# 514.23 514
+# 0.23 0
+# 0 0
+# 1 1
+##.# 514.23 514.2
+##.# 0.23 0.2
+##.# 0 0
+##.# 1 1
+#.# 514.23 514.2
+#.# 0.23 0.2
+#.# 0 0
+#.# 1 1
+.# 514.23 514.2
+.# 0.23 .2
+.# 0 .0
+.# 1 1.0
+#. 514.23 514.
+#. 0.23 0.
+#. 0 0.
+#. 1 1.
+. 514.23 514.
+. 0.23 0.
+. 0 0.
+. 1 1.
+
+test behavior on numbers approaching zero
+set locale en
+begin
+pattern format output breaks
+#.## 0.01 0.01
+#.## 0.001 0
+#.## 0 0
+#.00 0.01 .01
+#.00 0.001 .00
+#.00 0 .00
+0.00 0.01 0.01
+0.00 0.001 0.00
+0.00 0 0.00
+
+// Not in official spec, but needed for backwards compatibility
+test patterns with leading grouping separator
+set locale en_US
+begin
+pattern format output breaks
+,##0 1234.56 1,235
+'#',## 3456 #34,56
+
+test patterns with valid and invalid quote marks
+set locale et
+begin
+pattern format output breaks
+'# 1 fail
+''# 1 '1
+'''# 1 fail
+''''# 1 ''1
+'''''# 1 fail
+'-''-'# 1 -'-1
+// K doesn't know the locale symbol for et
+-'-'# 1 −-1 K
+'#'# 1 #1
+''#'' 1 '1'
+''#- 1 '1− K
+'-'#- 1 -1− K
+-#'-' 1 −1- K
+
test int64
set locale en
begin
4 10.0 8 K
2.70 99.0 99,90 K
2.73 272.0 273,00 K
-#,#3.70 104.0 1\u00a003,60 K
+#,#3.70 104.0 1\u202f03,60 K
test significant digits
set locale en
// JDK gives 12,3001E3
##0.000#E0 12300.1 12,30E3 K
##0.000#E0 12301 12,301E3
-0.05E0 12301.2 1,25E4 JK
+0.05E0 12301.2 1,25E4 K
##0.000#E0 0.17 170,0E-3
// JDK doesn't support significant digits in exponents
+@@@E0 6.235 6,24E0 K
@@@E0 6235 6,24E3 K
@@@#E0 6200 6,20E3 K
@@@#E0 6201 6,201E3 K
@@@#E0 6201.7 6,202E3 K
@@@#E00 6201.7 6,202E03 K
@@@#E+00 6201.7 6,202E+03 K
+// If no zeros are specified, significant digits is fraction length plus 1
+#.##E0 52413 5,24E4
+###.##E0 52413 52,4E3 K
+#E0 52413 5,2413E4 K
+0E0 52413 5E4
+
+test scientific infinite precision
+// ICU-11511, ICU-7460, CLDR-10103
+set locale en
+begin
+pattern format output breaks
+// From the spec:
+// "0.##E0 means a max of 3 significant digits."
+0.##E0 98760 9.88E4
+// "#.##E0 also means a max of 3 significant digits."
+#.##E0 98760 9.88E4
+// "#.0#E0 means a max of 2 significant digits."
+#.0#E0 98760 9.9E4 K
+// "0E0 means a max of 1 significant digit."
+0E0 98760 1E5
+// "#E0 means infinite precision."
+#E0 98760 9.876E4 K
+// "###E0 means engineering notation with infinite precision."
+###E0 98760 98.76E3 K
+// Additional tests:
+##0.#E0 98760 99E3 K
+###.#E0 98760 99E3 K
+##0E0 98760 100E3 K
test percents
set locale fr
p%p0.0 0.573 p%p57,3
p'%'p0.0 0.573 p%p0,6
%@@@@ 0.0326 %3,260 K
-%#,@@@ 15.43 %1\u00a0540 K
+%#,@@@ 15.43 %1\u202f540 K
// JDK does not support rounding increments
-%#,##4.1 16.55 %1\u00a0656,4 K
+%#,##4.1 16.55 %1\u202f656,4 K
// JDK gives %16,255E3
%##0.00E0 162.55 %16,3E3 K
p\u2030p0.0 0.573 p\u2030p573,0
p'\u2030'p0.0 0.573 p\u2030p0,6
\u2030@@@@ 0.0326 \u203032,60 K
-\u2030#,@@@ 15.43 \u203015\u00a0400 K
-\u2030#,##4.1 16.55 \u203016\u00a0551,7 K
+\u2030#,@@@ 15.43 \u203015\u202f400 K
+\u2030#,##4.1 16.55 \u203016\u202f551,7 K
// JDK gives \u2030162,55E3
\u2030##0.00E0 162.55 \u2030163E3 K
begin
pattern format output breaks
// JDK does not seem to support padding
-$**####,##0 1234 $***1\u00a0234 K
-*x$####,##0 1234 xxx$1\u00a0234 K
-####,##0*x$ 1234 1\u00a0234xxx$ K
-####,##0$*x 1234 1\u00a0234$xxx K
+$**####,##0 1234 $***1\u202f234 K
+*x$####,##0 1234 xxx$1\u202f234 K
+####,##0*x$ 1234 1\u202f234xxx$ K
+####,##0$*x 1234 1\u202f234$xxx K
// JDK doesn't seem to handle suffixes correctly dropping the 'nx' entirely
-####,##0$*x;ne#n -1234 ne1\u00a0234nx K
-####,##0$*x;n#'*' -1234 n1\u00a0234*xx K
+####,##0$*x;ne#n -1234 ne1\u202f234nx K
+####,##0$*x;n#'*' -1234 n1\u202f234*xx K
*y%4.2###### 4.33 yyyy%432,6 K
// In J ICU adds padding as if 'EUR' is only 2 chars (2 * 0xa4)
-\u00a4\u00a4 **####0.00 433.0 EUR *433,00 JK
-// In J ICU adds padding as if 'EUR' is only 2 chars (2 * 0xa4)
-\u00a4\u00a4 **#######0 433.0 EUR *433,00 JK
+\u00a4\u00a4 **####0.00 433.0 EUR *433,00 K
+// P fails this one because the test code bypasses CurrencyUsage
+\u00a4\u00a4 **#######0 433.0 EUR *433,00 KP
test padding and currencies
begin
locale currency pattern format output breaks
// In J, JPY is considered 2 char (2 * 0xa4) even though padding is done
// after prefix. In C this test works.
-fr JPY \u00a4\u00a4 **#######0 433.22 JPY ****433 JK
+fr JPY \u00a4\u00a4 **#######0 433.22 JPY ****433 K
// JDK doesn't correct rounding for currency, shows USD (433
en USD \u00a4\u00a4 **#######0;\u00a4\u00a4 (#) -433.22 USD (433.22) K
begin
pattern currency output breaks
// JDK gives shows EUR instead of the euro symbol in this case
-#,##0.00 \u00a4 EUR 1\u00a0234,57 \u20ac K
+#,##0.00 \u00a4 EUR 1\u202f234,57 \u20ac K
// JDK gives 1\u00A0234,57. JDK doesn't seem to correct rounding
// based on currency.
-#,##0.00 \u00a4 JPY 1\u00a0235 JPY K
+#,##0.00 \u00a4 JPY 1\u202f235 JPY K
test prefixes and suffixes
set locale en
set minGroupingDigits 2
begin
format output breaks
-// min grouping digits not supported in any existing implementation
-// but could be easily added to the new DecimalFormat C code.
-1000 1000 JK
+1000 1000 K
10000 10,000
100000 100,000
1000000 1,000,000
set format 299792458.0
begin
minIntegerDigits maxIntegerDigits minFractionDigits maxFractionDigits output breaks
+// JDK gives 2.99792458E8 (maxInt + maxFrac instead of minInt + maxFrac)
+1 99 0 5 2.99792E8 K
// JDK gives .3E9 instead of unlimited precision.
0 1 0 0 2.99792458E8 K
1 1 0 0 3E8
// JDK gives E0 instead of allowing for unlimited precision
0 0 0 0 2.99792458E8 K
-// JDK gives .299792E9
-0 1 0 5 2.9979E8 K
+// J gives 2.9979E8
+0 1 0 5 2.99792E8 K
// JDK gives 300E6
0 3 0 0 299.792458E6 K
// JDK gives 299.8E6 (maybe maxInt + maxFrac instead of minInt + maxFrac)?
0 0 1 5 .29979E9
// JDK gives E0
0 0 1 0 2.99792458E8 K
-// JDK gives .2998E9
-0 0 0 4 2.998E8 K
-// JDK uses 8 + 6 for significant digits instead of 2 + 6
+// J gives 2.998E8
+0 0 0 4 .29979E9 K
+// According to the spec, if maxInt>minInt and minInt>1, then set
+// Context: #13289
2 8 1 6 2.9979246E8 K
// Treat max int digits > 8 as being the same as min int digits.
// This behavior is not spelled out in the specification.
// JDK fails here because it tries to use 9 + 6 = 15 sig digits.
2 9 1 6 29.979246E7 K
+test ticket 20058
+set locale en
+begin
+pattern format output breaks
+#00.0##E0 0 0.0E0 K
+#00.0##E0 1.2 1.2E0 K
+#00.0E0 0 0.0E0 K
+#00.0E0 1.2 1.2E0 K
+
test significant digits scientific
set locale en
set pattern #E0
set locale en
set pattern #,##0.###
begin
-format maxIntegerDigits output
-123 1 3
-123 -2147483648 0
-12345 1 5
-12345 -2147483648 0
-5.3 1 5.3
-5.3 -2147483648 .3
+format maxIntegerDigits output breaks
+123 1 3
+// C obeys maxIntegerDigits and prints after the decimal place
+0 0 .0 KP
+// CJP ignore max integer if it is less than zero and prints "123"
+123 -2147483648 0 CJP
+12345 1 5
+12345 -2147483648 0 CJP
+5.3 1 5.3
+5.3 -2147483648 .3 CJP
test patterns with zero
set locale en
set format 0
begin
-pattern output
+pattern output breaks
#.# 0
#. 0.
.# .0
# 0
+#,##0.00 0.00
+#,###.00 .00
00.000E00 00.000E00
0.####E0 0E0
##0.######E000 0E000
0.001234 0.001234 K
0.0012345 0.0012345 K
0.00123456 0.0012346 K
--43 -43.0 K
--43.7 -43.7 K
+-43 -43.0
+-43.7 -43.7
-43.76 -43.76 K
-43.762 -43.762 K
-43.7626 -43.763 K
12,345 1
12345 0
+test grouping used setters in parsing
+set pattern #,##0
+begin
+locale useGrouping parse output breaks
+en_US 1 123,456 123456
+en_US 0 123,456 123
+en_US 1 123.456 123.456
+en_US 0 123.456 123.456
+it_IT 1 123,456 123.456
+it_IT 0 123,456 123.456
+it_IT 1 123.456 123456
+it_IT 0 123.456 123
+
+test no grouping in pattern with parsing
+set pattern 0
+begin
+locale parse output breaks
+en_US 123,456 123
+en_US 123.456 123.456
+fr_FR 123,456 123.456
+fr_FR 123.456 123
+
test grouping setters
set locale en_US
set pattern 0
set format 123456789
set useGrouping 1
begin
-output grouping breaks grouping2 minGroupingDigits
+output grouping grouping2 breaks
1,2345,6789 4
-1,23,45,6789 4 K 2
-1,23,45,6789 4 K 2 2
-123,456789 6 K 6 3
-123456789 6 JK 6 4
+1,23,45,6789 4 2 K
+
+test grouping setters with min grouping digits
+set locale en_US
+set pattern 0
+set format 123456789
+set useGrouping 1
+begin
+output grouping grouping2 minGroupingDigits breaks
+1,23,45,6789 4 2 2 K
+123,456789 6 6 3
+123456789 6 6 4 K
test multiplier setters
set locale en_US
format multiplier output breaks
23 -12 -276
23 -1 -23
-// ICU4J and JDK throw exception on zero multiplier. ICU4C does not.
-23 0 23 JK
+// J (current ICU4J) throws exception on zero multiplier.
+// ICU4C prints 23.
+// Q multiplies by zero and prints 0.
+23 0 0 CJ
23 1 23
23 12 276
-23 12 -276
format output breaks
-0.35 -0.25 K
0.35 0.25 K
-0.39 0.5 K
-0.62 0.5 K
+// P doesn't support mixing minFrac with roundingIncrement (prints 0.50).
+0.39 0.5 JKP
+0.62 0.5 JKP
0.63 0.75 K
test padding setters
set format 1357
begin
padCharacter formatWidth output breaks
-* 8 bill1357 K
+* 8 bill1357
* 9 *bill1357 K
^ 10 ^^bill1357 K
set pattern 0.00
set format 186283
begin
-output breaks useScientific
+output useScientific breaks
186283.00
-1.86E5 K 1
-186283.00 K 0
+1.86E5 1 K
+186283.00 0
test rounding mode setters
set locale en_US
-set pattern 0.#
-set roundingIncrement 0.5
+set pattern 0.5
begin
format roundingMode output breaks
-1.24 halfUp 1 K
-1.25 halfUp 1.5 K
-1.25 halfDown 1 K
-1.26 halfDown 1.5 K
-1.25 halfEven 1 K
--1.01 up -1.5 K
--1.49 down -1 K
-1.01 up 1.5 K
-1.49 down 1 K
--1.01 ceiling -1 K
--1.49 floor -1.5 K
+1.24 halfUp 1.0 K
+1.25 halfUp 1.5
+1.25 halfDown 1.0 K
+1.26 halfDown 1.5
+1.25 halfEven 1.0 K
+-1.01 up -1.5
+-1.49 down -1.0 K
+1.01 up 1.5
+1.49 down 1.0 K
+-1.01 ceiling -1.0 K
+-1.49 floor -1.5
test currency usage setters
-// TODO: Find a country and currency where standard and cash differ
set locale CH
-set currency CHF
set pattern \u00a4\u00a4 0
begin
-format currencyUsage output breaks
-0.37 standard CHF 0.37 K
-// TODO: Get the rounding data into ICU4C and ICU4J
-0.37 cash CHF 0.35 CJK
+format currency currencyUsage output breaks
+0.37 CHF standard CHF 0.37 K
+0.37 CHF cash CHF 0.35 K
+1.234 CZK standard CZK 1.23 K
+1.234 CZK cash CZK 1
+
+test currency usage to pattern
+set locale en
+begin
+currency currencyUsage toPattern breaks
+// These work in J, but it prepends an extra hash sign to the pattern.
+// K does not support this feature.
+USD standard 0.00 K
+CHF standard 0.00 K
+CZK standard 0.00 K
+USD cash 0.00 K
+CHF cash 0.05 K
+CZK cash 0 K
+
+test currency rounding
+set locale en
+set currency USD
+begin
+pattern format output breaks
+# 123 123 P
+// Currency rounding should always override the pattern.
+// K prints the currency in ISO format for some reason.
+\u00a4# 123 $123.00 K
+\u00a4#.000 123 $123.00 K
+\u00a4#.## 123 $123.00 K
test exponent parameter setters
set locale en_US
decimalSeparatorAlwaysShown exponentSignAlwaysShown minimumExponentDigits output breaks
0 0 2 3E08 K
0 1 3 3E+008 K
-// ICU DecimalFormat J does not honor decimalSeparatorAlwaysShown
-// for scientific notation. But JDK DecimalFormat does honor
// decimalSeparatorAlwaysShown K=JDK; C=ICU4C; J=ICU4J
// See ticket 11621
-1 0 2 3.E08 JK
-1 1 3 3.E+008 JK
+1 0 2 3.E08 K
+1 1 3 3.E+008 K
1 0 1 3.E8
0 0 1 3E8
set locale en_US
set pattern 0.##E0
begin
-format output breaks decimalSeparatorAlwaysShown
+format output decimalSeparatorAlwaysShown breaks
// decimalSeparatorAlwaysShown off by default
299792458 3E8
299000000 2.99E8
-299792458 3.E8 J 1
+299792458 3.E8 1
test pad position setters
set locale en_US
set pattern [0.00];(#)
begin
format output breaks
-Inf [\u221e] K
+Inf [\u221e]
-Inf (\u221e) K
-NaN NaN K
+// J does not print the affixes
+// K prints \uFFFD
+NaN [NaN] K
test nan and infinity with multiplication
set locale en
test nan and infinity with padding
set locale en_US
set pattern $$$0.00$
-set formatWidth 7
+set formatWidth 8
begin
format padPosition output breaks
-Inf beforePrefix $$$\u221e$ K
-Inf afterPrefix $$$ \u221e$ K
-Inf beforeSuffix $$$\u221e $ K
-Inf afterSuffix $$$\u221e$ K
-NaN beforePrefix NaN K
-NaN afterPrefix NaN K
-NaN beforeSuffix NaN K
-NaN afterSuffix NaN K
+Inf beforePrefix $$$\u221e$ K
+Inf afterPrefix $$$ \u221e$ K
+Inf beforeSuffix $$$\u221e $ K
+Inf afterSuffix $$$\u221e$ K
+// J does not print the affixes
+// K prints \uFFFD
+NaN beforePrefix $$$NaN$ K
+NaN afterPrefix $$$ NaN$ K
+NaN beforeSuffix $$$NaN $ K
+NaN afterSuffix $$$NaN$ K
test apply formerly localized patterns
begin
locale pattern format output breaks
en #0% 0.4376 44%
// This next test breaks JDK. JDK doesn't multiply by 100.
-// It also is now broken in ICU4J until #10368 is fixed.
-fa \u0025\u00a0\u0023\u0030 0.4376 \u200e\u066a\u00a0\u06f4\u06f4 JK
+fa \u0025\u00a0\u0023\u0030 0.4376 \u066a\u00a0\u06f4\u06f4 K
+
+test localized pattern basic symbol coverage
+begin
+locale localizedPattern toPattern breaks
+it #.##0,00 #,##0.00
+// JDK either doesn't know sl uses this character for minus sign
+// or doesn't support minus sign in localized pattern
+sl #.##0;#.##0− #,##0;#,##0- K
+// JDK does not have data for "×10^" in this locale
+en_SE 0,00×10^0;0,00×10^0- 0.00E0;0.00E0- K
+// JDK does not seem to transform the digits in localized patterns
+ar_SA #\u066C##\u0660\u066B\u0660\u0660;a# #,##0.00;a#,##0.00 K
test toPattern
set locale en
begin
pattern toPattern breaks
+// All of the C and S failures in this section are because of functionally equivalent patterns
// JDK doesn't support any patterns with padding or both negative prefix and suffix
-// Breaks ICU4J See ticket 11671
-**0,000 **0,000 JK
+**0,000 **0,000 K
**##0,000 **##0,000 K
**###0,000 **###0,000 K
-**####0,000 **#,##0,000 K
+**####0,000 **#,##0,000 CJKP
###,000. #,000.
-0,000 #0,000
+0,000 #0,000 CJP
.00 #.00
-000 #000
-000,000 #,000,000
+000 #000 CJP
+000,000 #,000,000 CJP
pp#,000 pp#,000
-00.## #00.##
+00.## #00.## CJP
#,#00.025 #,#00.025
// No secondary grouping in JDK
#,##,###.02500 #,##,###.02500 K
pp#,000;(#) pp#,000;(#,000) K
-**####,##,##0.0##;(#) **#,##,##,##0.0##;**(##,##,##0.0##) K
+**####,##,##0.0##;(#) **#,##,##,##0.0##;**(##,##,##0.0##) CJKP
// No significant digits in JDK
@@### @@### K
@,@#,### @,@#,### K
0.00E0 0.00E0
-@@@##E0 @@@##E0 K
+// The following one works in JDK, probably because
+// it just returns the same string
+@@@##E0 @@@##E0
###0.00#E0 ###0.00#E0
##00.00#E0 ##00.00#E0
0.00E+00 0.00E+00 K
+5347,,, 5347
+5347,,,d8 5347
(5,347.25) -5347.25
-// J requires prefix and suffix for lenient parsing, but C doesn't
-5,347.25 5347.25 JK
-(5,347.25 -5347.25 J
--5,347.25 fail
+5,347.25 5347.25 K
+(5,347.25 -5347.25
+// S is successful at parsing this as -5347.25 in lenient mode
+-5,347.25 -5347.25 K
+3.52E4 35200
(34.8E-3) -0.0348
// JDK stops parsing at the spaces. JDK doesn't see space as a grouping separator
(34 25E-1) -342.5 K
(34,,25E-1) -342.5
-// J doesn't allow trailing separators before E but C does
-(34,,25,E-1) -342.5 J
-(34 25 E-1) -342.5 JK
-(34,,25 E-1) -3425 J
+// Trailing grouping separators are not OK.
+// C/J/P stop at the offending separator.
+(34,,25,E-1) fail CJKP
+(34,,25,E-1) -3425 K
+(34 25 E-1) -342.5 K
+(34,,25 E-1) -342.5 K
// Spaces are not allowed after exponent symbol
-// C parses up to the E but J bails
-(34 25E -1) -3425 JK
+// C parses up to the E
+(34 25E -1) -3425 K
+3.52EE4 3.52
+1,234,567.8901 1234567.8901
+1,23,4567.8901 1234567.8901
+// Fraction grouping is disabled by default
+1,23,4567.89,01 1234567.89
+1,23,456.78.9 123456.78
+12.34,56 12.34
-+79,,20,3 79203
-+79 20 3 79203 K
++79,,20,33 792033
+// JDK gets 79
++79 20 33 792033 K
// Parsing stops at comma as it is different from other separators
-+79 20,3 7920 K
-+79,,20 3 7920
++79 20,33 7920 K
++79,,20 33 7920
+ 79 79 K
-+,79,,20,3 79203
++,79,,20,33 792033
+7920d3 7920
-// Whitespace immediately after prefix doesn't count as digit separator
-// in C but is does in J
-+ ,79,,20,3 79203 JK
+// Whitespace immediately after prefix doesn't count as digit separator in C
++ ,79,,20,33 792033 K
( 19 45) -1945 K
// C allows trailing separators when there is a prefix and suffix.
-// J allows trailing separators only when there is just a prefix.
-// In this case, J just bails
-( 19 45 ) -1945 JK
+( 19 45 ) -1945 K
(,,19,45) -1945
-// C parses to the space, but J bails
-(,,19 45) -19 J
-// J bails b/c comma different separator than space. C doesn't treat leading spaces
-// as a separator.
-( 19,45) -1945 JK
-// J bails. Doesn't allow trailing separators when there is prefix and suffix.
-(,,19,45,) -1945 J
-// J bails on next 4 because J doesn't allow letters inside prefix and suffix.
+// C parses to the spaces
+(,,19 45) -19
+( 19,45) -1945 K
+(,,19,45,) -1945
// C will parse up to the letter.
-(,,19,45,d1) -1945 J
-(,,19,45d1) -1945 J
-( 19 45 d1) -1945 JK
-( 19 45d1) -1945 JK
-// J does allow trailing separator before a decimal point
+(,,19,45,d1) -1945
+(,,19,45d1) -1945
+( 19 45 d1) -1945 K
+( 19 45d1) -1945 K
(19,45,.25) -1945.25
// 2nd decimal points are ignored
+4.12.926 4.12
set pattern #,##0.0###+;#-
begin
parse output breaks
-// C sees this as -3426, don't understand why
-3426 -3426 JK
+// J and K just bail.
+3426 3426 K
3426+ 3426
-// J bails, but JDK will parse up to the space and get 34.
-// C sees -34
-34 d1+ -34 JK
+// J bails; K sees -34
+34 d1+ 34 K
// JDK sees this as -1234 for some reason
-// J bails b/c of trailing separators
-// C parses until trailing separators, but sees -1234
-1,234,,,+ -1234 JK
+1,234,,,+ 1234 K
1,234- -1234
-// J bails because of trailing separators
-1,234,- -1234 J
-// J bails here too
-1234 - -1234 J
+// C and P bail because of trailing separators
+1,234,- -1234 CJP
+1234 - -1234
test parse strict
set locale en
-set pattern +#,##0.0###;(#)
+set pattern +#,##,##0.0###;(#)
set lenient 0
+set minGroupingDigits 2
begin
parse output breaks
+123d5 123
+5347.25 5347.25
// separators in wrong place cause failure, no separators ok.
-+5,347.25 5347.25
-(5347.25) -5347.25
-(5,347.25) -5347.25
++65,347.25 65347.25
+(65347.25) -65347.25
+(65,347.25) -65347.25
// JDK does allow separators in the wrong place and parses as -5347.25
(53,47.25) fail K
-// strict requires prefix or suffix
-5,347.25 fail
+// strict requires prefix or suffix, except in C
+65,347.25 fail
+3.52E4 35200
(34.8E-3) -0.0348
(3425E-1) -342.5
// Strict doesn't allow separators in sci notation.
-(3,425) -3425
-// JDK allows separators in sci notation and parses as -342.5
-(3,425E-1) fail K
+(63,425) -63425
+(63,425E-1) -6342.5
// Both prefix and suffix needed for strict.
// JDK accepts this and parses as -342.5
(3425E-1 fail K
+3.52EE4 3.52
-+1,234,567.8901 1234567.8901
++12,34,567.8901 1234567.8901
// With strict digit separators don't have to be the right type
// JDK doesn't acknowledge space as a separator
-+1 234 567.8901 1234567.8901 K
++12 34 567.8901 1234567.8901 K
// In general the grouping separators have to match their expected
// location exactly. The only exception is when string being parsed
// have no separators at all.
-+1,234,567.8901 1234567.8901
-// JDK doesn't require separators to be in the right place
++12,345.67 12345.67
+// JDK doesn't require separators to be in the right place.
+1,23,4567.8901 fail K
++1,234,567.8901 fail K
+1234,567.8901 fail K
+1,234567.8901 fail K
+1234567.8901 1234567.8901
+// Minimum grouping is not satisfied below, but that's ok
+// because minimum grouping is optional.
++1,234.5 1234.5
// Comma after decimal means parse to a comma
-+123,456.78,9 123456.78
-// A decimal after a decimal means bail
-// JDK parses as 123456.78
-+123,456.78.9 fail K
++1,23,456.78,9 123456.78
++1,23,456.78.9 123456.78
+79 79
+79 79
+ 79 fail
// JDK parses as -1945
(1,945d1) fail K
+test parse strict scientific
+// See #13737: Old behavior should be retained in this case
+set locale en
+set pattern #E0
+set lenient 0
+begin
+parse output breaks
+123 123
+123E1 1230
+123E0 123
+123E 123
+
+test parse strict without prefix/suffix
+set locale en
+set pattern #
+set lenient 0
+begin
+parse output breaks
+12.34 12.34
+-12.34 -12.34
+// The following case passes only when setSignAlwaysShown is enabled
++12.34 fail
+$12.34 fail
+
test parse integer only
set locale en
set pattern 0.00
begin
parse output breaks
35 35
-+35 fail
++35 35 K
-35 -35
2.63 2
-39.99 -39
0 5e2 500 K
0 5.3E2 530
// See ticket 11725
-1 5e2 5 J
-1 5.3E2 5.3 JK
+1 5e2 5
+1 5.3E2 5.3 K
test parse currency fail
set pattern 0
set locale en
begin
parse output outputCurrency breaks
-// See ticket 11735
-53.45 fail USD J
+// Fixed in ticket 11735
+53.45 fail USD
test parse strange prefix
set locale en
set negativeSuffix 9N
begin
parse output breaks
-// C consumes the '9' as a digit and assumes number is negative
-// J and JDK bail
-// 6549K 654 CJK
-// C consumes the '9' as a digit and assumes number is negative
-// J and JDK bail
-// 6549N -654 CJK
+// A non-greedy parse is required to pass these cases.
+// All of the implementations being tested are greedy.
+6549K 654 CJKP
+6549N -654 CJKP
test really strange prefix
set locale en
8245 45
2845 -45
+test parse pattern with quotes
+set locale en
+set pattern '-'#y
+begin
+parse output breaks
+-45y 45
+
+test parse with locale symbols
+// The grouping separator in it_CH is an apostrophe
+set locale it_CH
+set pattern #,##0
+begin
+parse output breaks
+१३ 13
+१३.३१ 13.31
+123'456 123456
+524'11.3 52411.3
+३'११ 311
+
+test parse with European-style comma/period
+set locale pt
+set pattern #,##0
+begin
+parse output breaks
+123.456 123456
+123,456 123.456
+987,654.321 987.654
+987,654 321 987.654
+987.654,321 987654.321
+
test select
set locale sr
begin
test parse currency ISO
set pattern 0.00 \u00a4\u00a4;(#) \u00a4\u00a4
-set locale en_US
+set locale en_GB
begin
parse output outputCurrency breaks
-$53.45 53.45 USD
+53.45 fail GBP
+£53.45 53.45 GBP
+$53.45 53.45 USD C
53.45 USD 53.45 USD
-USD 53.45 53.45 USD J
-53.45USD fail USD
+53.45 GBP 53.45 GBP
+USD 53.45 53.45 USD
+53.45USD 53.45 USD
USD53.45 53.45 USD
(7.92) USD -7.92 USD
-(7.92) EUR -7.92 EUR
+(7.92) GBP -7.92 GBP
(7.926) USD -7.926 USD
-(7.926 USD) fail USD
-(USD 7.926) fail USD
-USD (7.926) fail USD
-USD (7.92) fail USD
-(7.92)USD fail USD
-USD(7.92) fail USD
+(7.926 USD) -7.926 USD
+(USD 7.926) -7.926 USD
+USD (7.926) -7.926 USD
+USD (7.92) -7.92 USD
+(7.92)USD -7.92 USD
+USD(7.92) -7.92 USD
(8) USD -8 USD
--8 USD fail USD
+-8 USD -8 USD
67 USD 67 USD
-53.45$ fail USD
-US Dollars 53.45 53.45 USD J
+53.45$ 53.45 USD C
+US Dollars 53.45 53.45 USD
53.45 US Dollars 53.45 USD
-US Dollar 53.45 53.45 USD J
+US Dollar 53.45 53.45 USD
53.45 US Dollar 53.45 USD
US Dollars53.45 53.45 USD
-53.45US Dollars fail USD
+53.45US Dollars 53.45 USD
US Dollar53.45 53.45 USD
US Dollat53.45 fail USD
-53.45US Dollar fail USD
-US Dollars (53.45) fail USD
+53.45US Dollar 53.45 USD
+US Dollars (53.45) -53.45 USD
(53.45) US Dollars -53.45 USD
-US Dollar (53.45) fail USD
+(53.45) Euros -53.45 EUR
+US Dollar (53.45) -53.45 USD
(53.45) US Dollar -53.45 USD
-US Dollars(53.45) fail USD
-(53.45)US Dollars fail USD
-US Dollar(53.45) fail USD
+US Dollars(53.45) -53.45 USD
+(53.45)US Dollars -53.45 USD
+US Dollar(53.45) -53.45 USD
US Dollat(53.45) fail USD
-(53.45)US Dollar fail USD
+(53.45)US Dollar -53.45 USD
test parse currency ISO negative
set pattern 0.00 \u00a4\u00a4;-# \u00a4\u00a4
-set locale en_US
+set locale en_GB
begin
parse output outputCurrency breaks
-$53.45 53.45 USD
+53.45 fail GBP
+£53.45 53.45 GBP
+$53.45 53.45 USD C
53.45 USD 53.45 USD
-USD 53.45 53.45 USD J
-53.45USD fail USD
+53.45 GBP 53.45 GBP
+USD 53.45 53.45 USD
+53.45USD 53.45 USD
USD53.45 53.45 USD
-7.92 USD -7.92 USD
--7.92 EUR -7.92 EUR
+-7.92 GBP -7.92 GBP
-7.926 USD -7.926 USD
-USD -7.926 fail USD
--7.92USD fail USD
-USD-7.92 fail USD
+USD -7.926 -7.926 USD
+-7.92USD -7.92 USD
+USD-7.92 -7.92 USD
-8 USD -8 USD
67 USD 67 USD
-53.45$ fail USD
-US Dollars 53.45 53.45 USD J
+53.45$ 53.45 USD C
+US Dollars 53.45 53.45 USD
53.45 US Dollars 53.45 USD
-US Dollar 53.45 53.45 USD J
+US Dollar 53.45 53.45 USD
53.45 US Dollar 53.45 USD
US Dollars53.45 53.45 USD
-53.45US Dollars fail USD
+53.45US Dollars 53.45 USD
US Dollar53.45 53.45 USD
US Dollat53.45 fail USD
-53.45US Dollar fail USD
+53.45US Dollar 53.45 USD
test parse currency long
set pattern 0.00 \u00a4\u00a4\u00a4;(#) \u00a4\u00a4\u00a4
-set locale en_US
+set locale en_GB
begin
parse output outputCurrency breaks
-$53.45 53.45 USD
+53.45 fail GBP
+£53.45 53.45 GBP
+$53.45 53.45 USD C
53.45 USD 53.45 USD
-USD 53.45 53.45 USD J
-// See ticket 11735
-53.45USD fail USD J
+53.45 GBP 53.45 GBP
+USD 53.45 53.45 USD
+53.45USD 53.45 USD
USD53.45 53.45 USD
(7.92) USD -7.92 USD
+(7.92) GBP -7.92 GBP
(7.926) USD -7.926 USD
-(7.926 USD) fail USD
-(USD 7.926) fail USD
-USD (7.926) fail USD
-USD (7.92) fail USD
-(7.92)USD fail USD
-USD(7.92) fail USD
+(7.926 USD) -7.926 USD
+(USD 7.926) -7.926 USD
+USD (7.926) -7.926 USD
+USD (7.92) -7.92 USD
+(7.92)USD -7.92 USD
+USD(7.92) -7.92 USD
(8) USD -8 USD
-// See ticket 11735
--8 USD fail USD J
+-8 USD -8 USD
67 USD 67 USD
-// See ticket 11735
-53.45$ fail USD J
-US Dollars 53.45 53.45 USD J
+53.45$ 53.45 USD C
+US Dollars 53.45 53.45 USD
53.45 US Dollars 53.45 USD
-US Dollar 53.45 53.45 USD J
+US Dollar 53.45 53.45 USD
53.45 US Dollar 53.45 USD
US Dollars53.45 53.45 USD
-// See ticket 11735
-53.45US Dollars fail USD J
+53.45US Dollars 53.45 USD
US Dollar53.45 53.45 USD
US Dollat53.45 fail USD
-// See ticket 11735
-53.45US Dollar fail USD J
+53.45US Dollar 53.45 USD
test parse currency short
set pattern 0.00 \u00a4;(#) \u00a4
-set locale en_US
+set locale en_GB
begin
parse output outputCurrency breaks
-$53.45 53.45 USD
+53.45 fail GBP
+£53.45 53.45 GBP
+$53.45 53.45 USD C
53.45 USD 53.45 USD
-USD 53.45 53.45 USD J
-53.45USD fail USD
+53.45 GBP 53.45 GBP
+USD 53.45 53.45 USD
+53.45USD 53.45 USD
USD53.45 53.45 USD
(7.92) USD -7.92 USD
+(7.92) GBP -7.92 GBP
(7.926) USD -7.926 USD
-(7.926 USD) fail USD
-(USD 7.926) fail USD
-USD (7.926) fail USD
-USD (7.92) fail USD
-(7.92)USD fail USD
-USD(7.92) fail USD
+(7.926 USD) -7.926 USD
+(USD 7.926) -7.926 USD
+USD (7.926) -7.926 USD
+USD (7.92) -7.92 USD
+(7.92)USD -7.92 USD
+USD(7.92) -7.92 USD
(8) USD -8 USD
--8 USD fail USD
+-8 USD -8 USD
67 USD 67 USD
-53.45$ fail USD
-US Dollars 53.45 53.45 USD J
+53.45$ 53.45 USD C
+US Dollars 53.45 53.45 USD
53.45 US Dollars 53.45 USD
-US Dollar 53.45 53.45 USD J
+US Dollar 53.45 53.45 USD
53.45 US Dollar 53.45 USD
US Dollars53.45 53.45 USD
-53.45US Dollars fail USD
+53.45US Dollars 53.45 USD
US Dollar53.45 53.45 USD
US Dollat53.45 fail USD
-53.45US Dollar fail USD
+53.45US Dollar 53.45 USD
test parse currency short prefix
set pattern \u00a40.00;(\u00a4#)
-set locale en_US
+set locale en_GB
begin
parse output outputCurrency breaks
-$53.45 53.45 USD
-53.45 USD fail USD
-USD 53.45 53.45 USD J
-53.45USD fail USD
+53.45 fail GBP
+£53.45 53.45 GBP
+$53.45 53.45 USD C
+53.45 USD 53.45 USD
+53.45 GBP 53.45 GBP
+USD 53.45 53.45 USD
+53.45USD 53.45 USD
USD53.45 53.45 USD
-(7.92) USD fail USD
-(7.926) USD fail USD
-(7.926 USD) fail USD
-(USD 7.926) -7.926 USD J
-USD (7.926) fail USD
-USD (7.92) fail USD
-(7.92)USD fail USD
-USD(7.92) fail USD
-(8) USD fail USD
--8 USD fail USD
-67 USD fail USD
-53.45$ fail USD
-US Dollars 53.45 53.45 USD J
+// C and P fail these because '(' is an incomplete prefix.
+(7.92) USD -7.92 USD CJP
+(7.92) GBP -7.92 GBP CJP
+(7.926) USD -7.926 USD CJP
+(7.926 USD) -7.926 USD CJP
+(USD 7.926) -7.926 USD
+USD (7.926) -7.926 USD CJP
+USD (7.92) -7.92 USD CJP
+(7.92)USD -7.92 USD CJP
+USD(7.92) -7.92 USD CJP
+(8) USD -8 USD CJP
+-8 USD -8 USD
+67 USD 67 USD
+53.45$ 53.45 USD C
+US Dollars 53.45 53.45 USD
53.45 US Dollars 53.45 USD
-US Dollar 53.45 53.45 USD J
+US Dollar 53.45 53.45 USD
53.45 US Dollar 53.45 USD
US Dollars53.45 53.45 USD
-53.45US Dollars fail USD
+53.45US Dollars 53.45 USD
US Dollar53.45 53.45 USD
-53.45US Dollar fail USD
+53.45US Dollar 53.45 USD
test format foreign currency
set locale fa_IR
+set currency IRR
begin
pattern format output breaks
\u00a4\u00a4\u00a4 0.00;\u00a4\u00a4\u00a4 # 1235 \u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5 K
set pattern \u00a4 0.00;\u00a4 -#
set locale fa_IR
begin
-parse output outputCurrency
+parse output outputCurrency breaks
\u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5 1235 IRR
IRR \u06F1\u06F2\u06F3\u06F5 1235 IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5 1235 IRR
+// P fails here because this currency name is in the Trie only, but it has the same prefix as the non-Trie currency
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5 1235 IRR CJP
IRR 1235 1235 IRR
\u0631\u06cc\u0627\u0644 1235 1235 IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235 1235 IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235 1235 IRR CJP
test parse foreign currency ISO
set pattern \u00a4\u00a4 0.00;\u00a4\u00a4 -#
set locale fa_IR
begin
-parse output outputCurrency
+parse output outputCurrency breaks
\u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5 1235 IRR
IRR \u06F1\u06F2\u06F3\u06F5 1235 IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5 1235 IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5 1235 IRR CJP
IRR 1235 1235 IRR
\u0631\u06cc\u0627\u0644 1235 1235 IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235 1235 IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235 1235 IRR CJP
test parse foreign currency full
set pattern \u00a4\u00a4\u00a4 0.00;\u00a4\u00a4\u00a4 -#
set locale fa_IR
begin
-parse output outputCurrency
+parse output outputCurrency breaks
\u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5 1235 IRR
IRR \u06F1\u06F2\u06F3\u06F5 1235 IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5 1235 IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5 1235 IRR CJP
IRR 1235 1235 IRR
\u0631\u06cc\u0627\u0644 1235 1235 IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235 1235 IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235 1235 IRR CJP
test parse currency with foreign symbols symbol english
set pattern \u00a4 0.00;\u00a4 (#)
Euro 7.82 7.82 EUR
Euros 7.82 7.82 EUR
+test parse currency without currency mode
+// Should accept a symbol associated with the currency specified by the API,
+// but should not traverse the full currency data.
+set locale en_US
+set pattern \u00a4#,##0.00
+begin
+parse currency output breaks
+$52.41 USD 52.41
+USD52.41 USD 52.41 K
+\u20ac52.41 USD fail
+EUR52.41 USD fail
+$52.41 EUR fail
+USD52.41 EUR fail
+\u20ac52.41 EUR 52.41 K
+EUR52.41 EUR 52.41
+
test parse currency ISO strict
set pattern 0.00 \u00a4\u00a4;(#) \u00a4\u00a4
set locale en_US
set lenient 0
begin
parse output outputCurrency breaks
-$53.45 53.45 USD
+$53.45 53.45 USD CJP
53.45 USD 53.45 USD
USD 53.45 fail USD
53.45USD fail USD
-USD53.45 53.45 USD
+USD53.45 53.45 USD CJP
(7.92) USD -7.92 USD
(7.92) EUR -7.92 EUR
(7.926) USD -7.926 USD
53.45 US Dollars 53.45 USD
US Dollar 53.45 fail USD
53.45 US Dollar 53.45 USD
-US Dollars53.45 53.45 USD
+US Dollars53.45 53.45 USD CJP
53.45US Dollars fail USD
-US Dollar53.45 53.45 USD
+US Dollar53.45 53.45 USD CJP
US Dollat53.45 fail USD
53.45US Dollar fail USD
US Dollars (53.45) fail USD
set maxFractionDigits 0
begin
format output breaks
--0.99 -0 JK
+-0.99 -0 K
+
+test parse decimalPatternMatchRequired
+set locale en
+set decimalPatternMatchRequired 1
+begin
+pattern parse output breaks
+// K doesn't support this feature.
+0 123 123
+0 123. fail K
+0 1.23 fail K
+0 -513 -513
+0 -513. fail K
+0 -5.13 fail K
+0.0 123 fail K
+0.0 123. 123
+0.0 1.23 1.23
+0.0 -513 fail K
+0.0 -513. -513
+0.0 -5.13 -5.13
+
+test parse minus sign
+set locale en
+set pattern #
+begin
+pattern parse output breaks
+# -123 -123
+# - 123 -123 K
+# -123 -123 K
+# - 123 -123 K
+# 123- 123
+# 123 - 123
+#;#- 123- -123
+#;#- 123 - -123 K
+
+test parse case sensitive
+set locale en
+set lenient 1
+set pattern Aa#
+begin
+parse parseCaseSensitive output breaks
+Aa1.23 1 1.23
+Aa1.23 0 1.23
+AA1.23 1 fail
+// K does not support case-insensitive parsing for prefix/suffix.
+AA1.23 0 1.23 K
+aa1.23 1 fail
+aa1.23 0 1.23 K
+Aa1.23E3 1 1230
+Aa1.23E3 0 1230
+Aa1.23e3 1 1.23
+Aa1.23e3 0 1230 K
+NaN 1 NaN K
+NaN 0 NaN K
+nan 1 fail
+nan 0 NaN K
+
+test parse infinity and scientific notation overflow
+set locale en
+set lenient 1
+begin
+parse output breaks
+NaN NaN K
+// JDK returns zero
+1E999999999999999 Inf K
+-1E999999999999999 -Inf K
+1E-99999999999999 0.0
+// Note: The test suite code doesn't properly check for 0.0 vs. -0.0
+-1E-99999999999999 -0.0
+1E2147483648 Inf K
+1E2147483647 Inf K
+// J and K get Infinity
+1E2147483646 1E+2147483646 JK
+1E-2147483649 0
+1E-2147483648 0
+// K returns zero here
+1E-2147483647 1E-2147483647 JK
+1E-2147483646 1E-2147483646 JK
+
+test format push limits
+set locale en
+set minFractionDigits 2
+set roundingMode halfDown
+begin
+maxFractionDigits format output breaks
+100 987654321987654321 987654321987654321.00
+100 987654321.987654321 987654321.987654321
+100 9999999999999.9950000000001 9999999999999.9950000000001
+2 9999999999999.9950000000001 10000000000000.00
+2 9999999.99499999 9999999.99
+// K doesn't support halfDown rounding mode?
+2 9999999.995 9999999.99 K
+2 9999999.99500001 10000000.00
+100 56565656565656565656565656565656565656565656565656565656565656 56565656565656565656565656565656565656565656565656565656565656.00
+100 454545454545454545454545454545.454545454545454545454545454545 454545454545454545454545454545.454545454545454545454545454545
+100 0.0000000000000000000123 0.0000000000000000000123
+100 -78787878787878787878787878787878 -78787878787878787878787878787878.00
+100 -8989898989898989898989.8989898989898989 -8989898989898989898989.8989898989898989
+
+test ticket 11230
+set locale en
+begin
+pattern lenient parse output breaks
+// Groups after the first group need 2 digits to be accepted.
+// JDK does not see space as grouping and parses most of these as 9.
+#,##0 1 9 9 9
+#,##0 1 9 99 999 K
+#,##0 1 9 999 9999 K
+#,##0 1 9 9 9 9
+#,##0 1 ,9 9
+#,##0 1 99,.0 99
+#,##0 1 9 9. 9
+#,##0 1 9 99. 999 K
+0 1 9 9 9
+0 1 9 99 9
+0 1 9 999 9
+0 1 9 9 9 9
+0 1 ,9 fail
+0 1 99,.0 99
+0 1 9 9. 9
+0 1 9 99. 9
+#,##0 0 9 9 fail K
+#,##0 0 9 99 fail K
+#,##0 0 9 999 9999 K
+#,##0 0 9 9 9 fail K
+#,##0 0 ,9 fail K
+#,##0 0 99,.0 fail K
+#,##0 0 9 9. fail K
+#,##0 0 9 99. fail K
+0 0 9 9 9
+0 0 9 99 9
+0 0 9 999 9
+0 0 9 9 9 9
+0 0 ,9 fail
+0 0 99,.0 99
+0 0 9 9. 9
+0 0 9 99. 9
+
+test more strict grouping parse
+set locale en
+set pattern #,##,##0
+begin
+lenient parse output breaks
+1 1,23,, 123
+0 9999, 9999
+0 1,23,, fail K
+
+test parse ignorables
+set locale ar
+// Note: Prefixes contain RLMs, as do some of the test cases.
+set pattern x ab0c df
+set negativePrefix y gh
+set negativeSuffix i jk
+begin
+parse output breaks
+x ab56c df 56
+x ab56c df 56 K
+x ab56c df 56 K
+x ab56c df 56 K
+x ab56c df 56 K
+x ab56 56 K
+x a b56 56 K
+56cdf 56 K
+56c df 56 K
+56cd f 56 K
+56cdf 56 K
+56cdf 56 K
+56c df 56 K
+56c df 56 K
+y gh56i jk -56
+y gh56i jk -56 K
+y gh56i jk -56 K
+y gh56i jk -56 K
+y gh56i jk -56 K
+y gh56 -56 K
+y g h56 -56 K
+// S stops parsing after the 'i' for these and returns -56
+// C stops before the 'i' and gets 56
+56ijk -56 K
+56i jk -56 K
+56ij k -56 K
+56ijk -56 K
+56ijk -56 K
+56i jk -56 K
+56i jk -56 K
+// S and C get 56 (accepts ' ' gs grouping); K gets null
+5 6 fail CJP
+56 5 K
+
+test parse spaces in grouping
+// This test gives the ideal behavior of these cases, which
+// none of the implementations currently support.
+// Similar to the test above for ticket #11230
+set locale en
+set pattern #,##0
+begin
+parse output breaks
+1 2 1
+1 23 123 K
+// K gets 1 here; doesn't pick up the grouping separator
+1 234 1234 K
+
+test rounding increment significant digits
+// This test is for #13111
+set locale en
+set pattern 0.1
+set useSigDigits 1
+set maxSigDigits 2
+begin
+format output breaks
+// C and J get "1"
+// P gets "1.0"
+// K gets "1.1" (??)
+0.975 0.98 CJKP
+
+test lenient parse currency match
+// This test is for #13112
+set locale en
+set pattern ¤#,##0.00
+begin
+parse output breaks
+// K gets null
+1.23!@#$%^ 1.23 K
+
+test percentage parsing multiplier
+// This test is for #13114
+set locale en
+set pattern 0%
+begin
+parse output breaks
+55% 0.55
+// K gets null
+// C and P scale by 100 even if the percent sign is not present
+55 0.55 K
+
+test trailing grouping separators in pattern
+// This test is for #13115
+set locale en
+begin
+pattern format output breaks
+$0M 123456 $123456M
+// The following patterns are rejected as malformed.
+$0,M 123456 fail
+$0,,M 123456 fail
+
+test empty negative subpattern
+// This test is for #13117
+set locale en
+begin
+pattern format output breaks
+0 -15 -15
+0; -15 -15
+// K still prepends a '-' even though the pattern says otherwise
+0;0 -15 15 K
+
+test percentage multiplier parsing
+// This test is for #13129
+set locale en
+set pattern 0%
+begin
+parse output breaks
+9223372036854775807% 92233720368547758.07 K
+
+test sign always shown
+set locale en
+set pattern 0
+set signAlwaysShown 1
+begin
+format output breaks
+// K does not support this feature
+42 +42 K
+0 +0 K
+-42 -42
+
+test parse strict with plus sign
+set locale en
+set pattern 0
+set signAlwaysShown 1
+begin
+lenient parse output breaks
+1 42 42
+1 -42 -42
+1 +42 42 K
+1 0 0
+1 +0 0 K
+0 42 fail K
+0 -42 -42
+0 +42 42 K
+0 0 fail K
+0 +0 0 K
+
+test parse with scientific-separator-affix overlap
+set locale en
+begin
+pattern lenient parse output breaks
+0E0','x 1 5E3,x 5000
+0E0','x 0 5E3,x 5000
+0E0'.'x 1 5E3.x 5000
+0E0'.'x 0 5E3.x 5000
+
+test parse() lowercase currency
+set locale en
+set pattern ¤¤0
+set currency USD
+begin
+parse output breaks
+USD123 123
+USD 123 123 K
+usd123 123 K
+usd 123 123 K
+Usd123 123 K
+Usd 123 123 K
+// US$ is not used for US dollars in en-US
+US$123 fail
+us$123 fail
+Us$123 fail
+123 US dollars 123 K
+123 US DOLLARS 123 K
+123 us dollars 123 K
+// Foreign currencies are not accepted in .parse()
+GBP123 fail
+gbp123 fail
+British pounds 123 fail
+british POUNDS 123 fail
+
+test parseCurrency() lowercase currency
+set locale en
+set pattern ¤¤0
+set currency USD
+begin
+parse output outputCurrency breaks
+USD123 123 USD
+USD 123 123 USD
+usd123 123 USD
+usd 123 123 USD
+Usd123 123 USD
+Usd 123 123 USD
+US$123 123 USD C
+us$123 fail fail
+Us$123 fail fail
+123 US dollars 123 USD
+123 US DOLLARS 123 USD
+123 us dollars 123 USD
+GBP123 123 GBP
+gbp123 123 GBP C
+British pounds 123 123 GBP
+british POUNDS 123 123 GBP
+
+test parse scientific with bidi marks
+begin
+locale parse output breaks
+en 4E\u200E+02 400 K
+en 4E+02 400 K
+he 4E\u200E+02 400 K
+he 4E+02 400 K
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+