]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/testdata/numberformattestspecification.txt
ICU-66108.tar.gz
[apple/icu.git] / icuSources / test / testdata / numberformattestspecification.txt
index c024ad87e62f3b72d288ce27505be75d3b39240d..aa4fa3c3f7ab666fcca9f6c3567b13cc88efc853 100644 (file)
@@ -1,4 +1,4 @@
-// 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.
@@ -8,31 +8,39 @@
 // 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
 
@@ -54,6 +62,75 @@ format       output
 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
@@ -74,7 +151,7 @@ pattern      format  output  breaks
 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
@@ -110,15 +187,44 @@ pattern   format  output  breaks
 // 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
@@ -129,9 +235,9 @@ pattern     format  output  breaks
 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
 
@@ -144,8 +250,8 @@ pattern     format  output  breaks
 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
 
@@ -154,25 +260,25 @@ set locale fr_FR
 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
 
@@ -182,10 +288,10 @@ set format 1234.567
 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
@@ -202,9 +308,7 @@ set pattern #,##0
 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
@@ -235,13 +339,15 @@ set pattern #E0
 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)?
@@ -257,15 +363,25 @@ minIntegerDigits  maxIntegerDigits        minFractionDigits       maxFractionDigits       output  bre
 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
@@ -300,23 +416,28 @@ test ticket 11524
 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
@@ -334,8 +455,8 @@ format      output  breaks
 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
@@ -350,18 +471,48 @@ output    useGrouping
 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
@@ -369,8 +520,10 @@ begin
 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
@@ -384,8 +537,9 @@ begin
 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
@@ -394,7 +548,7 @@ set pattern bill0
 set format 1357
 begin
 padCharacter   formatWidth     output  breaks
-*      8       bill1357        K
+*      8       bill1357
 *      9       *bill1357       K
 ^      10      ^^bill1357      K
 
@@ -403,39 +557,62 @@ set locale en_US
 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
@@ -445,12 +622,10 @@ begin
 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
 
@@ -458,11 +633,11 @@ test exponent decimalSeparatorAlwaysShown default
 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
@@ -505,9 +680,11 @@ 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
@@ -521,17 +698,19 @@ NaN       NaN     K
 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
@@ -539,36 +718,49 @@ 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
@@ -586,59 +778,55 @@ parse     output  breaks
 +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
@@ -648,75 +836,97 @@ set locale en
 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
++134 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
@@ -724,7 +934,7 @@ set parseIntegerOnly 1
 begin
 parse  output  breaks
 35     35
-+35    fail
++35    35      K
 -35    -35
 2.63   2
 -39.99 -39
@@ -738,16 +948,16 @@ parseNoExponent   parse   output  breaks
 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
@@ -775,12 +985,10 @@ set negativePrefix
 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
@@ -791,6 +999,36 @@ parse      output
 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
@@ -811,181 +1049,197 @@ NaN    0.0     other
 
 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
@@ -996,37 +1250,38 @@ test parse foreign currency symbol
 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 (#)
@@ -1058,17 +1313,33 @@ EUR 7.82        7.82    EUR
 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
@@ -1086,9 +1357,9 @@ US Dollars 53.45  fail    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
@@ -1108,5 +1379,398 @@ set minFractionDigits 0
 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 a‎b0c df 
+set negativePrefix y g‎h
+set negativeSuffix i jk 
+begin
+parse  output  breaks
+x a‎b56c df  56
+x  a‎b56c 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
+56c‎d‎f    56      K
+56cdf  56      K
+56c d‎f      56      K
+56‎c df      56      K
+y g‎h56i jk  -56
+y  g‎h56i 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
+56i‎j‎k    -56     K
+56ijk  -56     K
+56i j‎k      -56     K
+56‎i jk      -56     K
+// S and C get 56 (accepts ' ' gs grouping); K gets null
+5 6    fail    CJP
+5‎6  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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+