sc/source/filter/excel/xlstyle.cxx           |  911 ++++++++++++---------------
 sc/source/filter/inc/numberformatsbuffer.hxx |    4 
 sc/source/filter/oox/numberformatsbuffer.cxx |  600 +++++++----------
 3 files changed, 667 insertions(+), 848 deletions(-)

New commits:
commit dc77d318ca0610a41b5c64bf5e9b85a2ffd48265
Author:     Mike Kaganski <[email protected]>
AuthorDate: Mon Nov 3 22:18:45 2025 +0500
Commit:     Mike Kaganski <[email protected]>
CommitDate: Sat Nov 8 11:34:23 2025 +0100

    Simplify XclNumFmtBuffer::InsertBuiltinFormats and its structures
    
    Change-Id: Ia91ce164f03141611e5cb3658ad65dedd20beb38
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193613
    Reviewed-by: Mike Kaganski <[email protected]>
    Tested-by: Jenkins

diff --git a/sc/source/filter/excel/xlstyle.cxx 
b/sc/source/filter/excel/xlstyle.cxx
index 1a89878d65b3..65764f753a08 100644
--- a/sc/source/filter/excel/xlstyle.cxx
+++ b/sc/source/filter/excel/xlstyle.cxx
@@ -775,145 +775,121 @@ constexpr LanguageType PRV_LANGUAGE_ASIAN_PRIM = 
primary(LANGUAGE_CHINESE);
 /** Stores the number format used in Calc for an Excel built-in number format. 
*/
 struct XclBuiltInFormat
 {
-    sal_uInt16          mnXclNumFmt;    /// Excel built-in index.
-    const char*         mpFormat;       /// Format string, may be 0 (meOffset 
used then).
-    NfIndexTableOffset  meOffset;       /// SvNumberFormatter format index, if 
mpFormat==0.
-    sal_uInt16          mnXclReuseFmt;  /// Use this Excel format, if 
meOffset==PRV_NF_INDEX_REUSE.
-};
+    sal_uInt16         mnXclNumFmt = EXC_FORMAT_NOTFOUND; /// Excel built-in 
index.
+    OUString           maFormat;       /// Format string, may be 0 (meOffset 
used then).
+    NfIndexTableOffset meOffset = NF_NUMBER_STANDARD; /// SvNumberFormatter 
format index, if maFormat=="".
+    sal_uInt16         mnXclReuseFmt = 0; /// Use this Excel format, if 
meOffset==PRV_NF_INDEX_REUSE.
+
+    /** Defines a literal Excel built-in number format. */
+    XclBuiltInFormat(sal_uInt16 nXclNumFmt, const OUString& rFormat)
+        : mnXclNumFmt(nXclNumFmt)
+        , maFormat(rFormat)
+    {
+    }
+
+    /** Defines an Excel built-in number format that maps to an own built-in 
format. */
+    XclBuiltInFormat(sal_uInt16 nXclNumFmt, NfIndexTableOffset eOffset)
+        : mnXclNumFmt(nXclNumFmt)
+        , meOffset(eOffset)
+    {
+    }
 
-/** Defines a literal Excel built-in number format. */
-#define EXC_NUMFMT_STRING( nXclNumFmt, pcUtf8 ) \
-    { nXclNumFmt, pcUtf8, NF_NUMBER_STANDARD, 0 }
-
-/** Defines an Excel built-in number format that maps to an own built-in 
format. */
-#define EXC_NUMFMT_OFFSET( nXclNumFmt, eOffset ) \
-    { nXclNumFmt, nullptr, eOffset, 0 }
-
-/** Defines an Excel built-in number format that is the same as the specified. 
*/
-#define EXC_NUMFMT_REUSE( nXclNumFmt, nXclReuse ) \
-    { nXclNumFmt, nullptr, PRV_NF_INDEX_REUSE, nXclReuse }
-
-/** Terminates an Excel built-in number format table. */
-#define EXC_NUMFMT_ENDTABLE() \
-    { EXC_FORMAT_NOTFOUND, nullptr, NF_NUMBER_STANDARD, 0 }
-
-// Currency unit characters
-#define UTF8_BAHT       "฿"
-#define UTF8_EURO       "€"
-#define UTF8_POUND_UK   "£"
-#define UTF8_SHEQEL     "₪"
-#define UTF8_WON        "₩"
-#define UTF8_YEN_CS     "¥"
-#define UTF8_YEN_JP     "¥"
-
-// Japanese/Chinese date/time characters
-#define UTF8_CJ_YEAR    "年"
-#define UTF8_CJ_MON     "月"
-#define UTF8_CJ_DAY     "日"
-#define UTF8_CJ_HOUR    "時"
-#define UTF8_CJ_MIN     "分"
-#define UTF8_CJ_SEC     "秒"
-
-// Chinese Simplified date/time characters
-#define UTF8_CS_HOUR    "时"
-
-// Korean date/time characters
-#define UTF8_KO_YEAR    "년"
-#define UTF8_KO_MON     "월"
-#define UTF8_KO_DAY     "일"
-#define UTF8_KO_HOUR    "시"
-#define UTF8_KO_MIN     "분"
-#define UTF8_KO_SEC     "초"
+    /** Defines an Excel built-in number format that is the same as the 
specified. */
+    XclBuiltInFormat(sal_uInt16 nXclNumFmt, sal_uInt16 nXclReuse)
+        : mnXclNumFmt(nXclNumFmt)
+        , meOffset(PRV_NF_INDEX_REUSE)
+        , mnXclReuseFmt(nXclReuse)
+    {
+    }
+};
 
 /** Default number format table. Last parent of all other tables, used for 
unknown languages. */
 const XclBuiltInFormat spBuiltInFormats_DONTKNOW[] =
 {
-    EXC_NUMFMT_OFFSET(   0, NF_NUMBER_STANDARD ),       // General
-    EXC_NUMFMT_OFFSET(   1, NF_NUMBER_INT ),            // 0
-    EXC_NUMFMT_OFFSET(   2, NF_NUMBER_DEC2 ),           // 0.00
-    EXC_NUMFMT_OFFSET(   3, NF_NUMBER_1000INT ),        // #,##0
-    EXC_NUMFMT_OFFSET(   4, NF_NUMBER_1000DEC2 ),       // #,##0.00
+    {  0, NF_NUMBER_STANDARD   },     // General
+    {  1, NF_NUMBER_INT        },     // 0
+    {  2, NF_NUMBER_DEC2       },     // 0.00
+    {  3, NF_NUMBER_1000INT    },     // #,##0
+    {  4, NF_NUMBER_1000DEC2   },     // #,##0.00
     // 5...8 contained in file
-    EXC_NUMFMT_OFFSET(   9, NF_PERCENT_INT ),           // 0%
-    EXC_NUMFMT_OFFSET(  10, NF_PERCENT_DEC2 ),          // 0.00%
-    EXC_NUMFMT_OFFSET(  11, NF_SCIENTIFIC_000E00 ),     // 0.00E+00
-    EXC_NUMFMT_OFFSET(  12, NF_FRACTION_1D ),            // # ?/?
-    EXC_NUMFMT_OFFSET(  13, NF_FRACTION_2D ),            // # ??/??
+    {  9, NF_PERCENT_INT       },     // 0%
+    { 10, NF_PERCENT_DEC2      },     // 0.00%
+    { 11, NF_SCIENTIFIC_000E00 },     // 0.00E+00
+    { 12, NF_FRACTION_1D       },     // # ?/?
+    { 13, NF_FRACTION_2D       },     // # ??/??
 
     // 14...22 date and time formats
-    EXC_NUMFMT_OFFSET(  14, NF_DATE_SYS_DDMMYYYY ),
-    EXC_NUMFMT_OFFSET(  15, NF_DATE_SYS_DMMMYY ),
-    EXC_NUMFMT_OFFSET(  16, NF_DATE_SYS_DDMMM ),
-    EXC_NUMFMT_OFFSET(  17, NF_DATE_SYS_MMYY ),
-    EXC_NUMFMT_OFFSET(  18, NF_TIME_HHMMAMPM ),
-    EXC_NUMFMT_OFFSET(  19, NF_TIME_HHMMSSAMPM ),
-    EXC_NUMFMT_OFFSET(  20, NF_TIME_HHMM ),
-    EXC_NUMFMT_OFFSET(  21, NF_TIME_HHMMSS ),
-    EXC_NUMFMT_OFFSET(  22, NF_DATETIME_SYSTEM_SHORT_HHMM ),
+    { 14, NF_DATE_SYS_DDMMYYYY },
+    { 15, NF_DATE_SYS_DMMMYY   },
+    { 16, NF_DATE_SYS_DDMMM    },
+    { 17, NF_DATE_SYS_MMYY     },
+    { 18, NF_TIME_HHMMAMPM     },
+    { 19, NF_TIME_HHMMSSAMPM   },
+    { 20, NF_TIME_HHMM         },
+    { 21, NF_TIME_HHMMSS       },
+    { 22, NF_DATETIME_SYSTEM_SHORT_HHMM },
 
     // 23...36 international formats
-    EXC_NUMFMT_REUSE(   23, 0 ),
-    EXC_NUMFMT_REUSE(   24, 0 ),
-    EXC_NUMFMT_REUSE(   25, 0 ),
-    EXC_NUMFMT_REUSE(   26, 0 ),
-    EXC_NUMFMT_REUSE(   27, 14 ),
-    EXC_NUMFMT_REUSE(   28, 14 ),
-    EXC_NUMFMT_REUSE(   29, 14 ),
-    EXC_NUMFMT_REUSE(   30, 14 ),
-    EXC_NUMFMT_REUSE(   31, 14 ),
-    EXC_NUMFMT_REUSE(   32, 21 ),
-    EXC_NUMFMT_REUSE(   33, 21 ),
-    EXC_NUMFMT_REUSE(   34, 21 ),
-    EXC_NUMFMT_REUSE(   35, 21 ),
-    EXC_NUMFMT_REUSE(   36, 14 ),
+    { 23, 0  },
+    { 24, 0  },
+    { 25, 0  },
+    { 26, 0  },
+    { 27, 14 },
+    { 28, 14 },
+    { 29, 14 },
+    { 30, 14 },
+    { 31, 14 },
+    { 32, 21 },
+    { 33, 21 },
+    { 34, 21 },
+    { 35, 21 },
+    { 36, 14 },
 
     // 37...44 accounting formats
     // 41...44 contained in file
-    EXC_NUMFMT_STRING(  37, "#,##0;-#,##0" ),
-    EXC_NUMFMT_STRING(  38, "#,##0;[RED]-#,##0" ),
-    EXC_NUMFMT_STRING(  39, "#,##0.00;-#,##0.00" ),
-    EXC_NUMFMT_STRING(  40, "#,##0.00;[RED]-#,##0.00" ),
+    { 37, u"#,##0;-#,##0"_ustr            },
+    { 38, u"#,##0;[RED]-#,##0"_ustr       },
+    { 39, u"#,##0.00;-#,##0.00"_ustr      },
+    { 40, u"#,##0.00;[RED]-#,##0.00"_ustr },
 
     // 45...49 more special formats
-    EXC_NUMFMT_STRING(  45, "mm:ss" ),
-    EXC_NUMFMT_STRING(  46, "[h]:mm:ss" ),
-    EXC_NUMFMT_STRING(  47, "mm:ss.0" ),
-    EXC_NUMFMT_STRING(  48, "##0.0E+0" ),
-    EXC_NUMFMT_OFFSET(  49, NF_TEXT ),
+    { 45, u"mm:ss"_ustr     },
+    { 46, u"[h]:mm:ss"_ustr },
+    { 47, u"mm:ss.0"_ustr   },
+    { 48, u"##0.0E+0"_ustr  },
+    { 49, NF_TEXT           },
 
     // 50...81 international formats
-    EXC_NUMFMT_REUSE(   50, 14 ),
-    EXC_NUMFMT_REUSE(   51, 14 ),
-    EXC_NUMFMT_REUSE(   52, 14 ),
-    EXC_NUMFMT_REUSE(   53, 14 ),
-    EXC_NUMFMT_REUSE(   54, 14 ),
-    EXC_NUMFMT_REUSE(   55, 14 ),
-    EXC_NUMFMT_REUSE(   56, 14 ),
-    EXC_NUMFMT_REUSE(   57, 14 ),
-    EXC_NUMFMT_REUSE(   58, 14 ),
-    EXC_NUMFMT_REUSE(   59, 1 ),
-    EXC_NUMFMT_REUSE(   60, 2 ),
-    EXC_NUMFMT_REUSE(   61, 3 ),
-    EXC_NUMFMT_REUSE(   62, 4 ),
-    EXC_NUMFMT_REUSE(   67, 9 ),
-    EXC_NUMFMT_REUSE(   68, 10 ),
-    EXC_NUMFMT_REUSE(   69, 12 ),
-    EXC_NUMFMT_REUSE(   70, 13 ),
-    EXC_NUMFMT_REUSE(   71, 14 ),
-    EXC_NUMFMT_REUSE(   72, 14 ),
-    EXC_NUMFMT_REUSE(   73, 15 ),
-    EXC_NUMFMT_REUSE(   74, 16 ),
-    EXC_NUMFMT_REUSE(   75, 17 ),
-    EXC_NUMFMT_REUSE(   76, 20 ),
-    EXC_NUMFMT_REUSE(   77, 21 ),
-    EXC_NUMFMT_REUSE(   78, 22 ),
-    EXC_NUMFMT_REUSE(   79, 45 ),
-    EXC_NUMFMT_REUSE(   80, 46 ),
-    EXC_NUMFMT_REUSE(   81, 47 ),
+    { 50, 14 },
+    { 51, 14 },
+    { 52, 14 },
+    { 53, 14 },
+    { 54, 14 },
+    { 55, 14 },
+    { 56, 14 },
+    { 57, 14 },
+    { 58, 14 },
+    { 59, 1  },
+    { 60, 2  },
+    { 61, 3  },
+    { 62, 4  },
+    { 67, 9  },
+    { 68, 10 },
+    { 69, 12 },
+    { 70, 13 },
+    { 71, 14 },
+    { 72, 14 },
+    { 73, 15 },
+    { 74, 16 },
+    { 75, 17 },
+    { 76, 20 },
+    { 77, 21 },
+    { 78, 22 },
+    { 79, 45 },
+    { 80, 46 },
+    { 81, 47 },
 
     // 82...163 not used, must not occur in a file (Excel may crash)
-
-    EXC_NUMFMT_ENDTABLE()
 };
 
 // ENGLISH --------------------------------------------------------------------
@@ -921,90 +897,83 @@ const XclBuiltInFormat spBuiltInFormats_DONTKNOW[] =
 /** Base table for English locales. */
 const XclBuiltInFormat spBuiltInFormats_ENGLISH[] =
 {
-    EXC_NUMFMT_STRING(  15, "DD-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "DD-MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM-YY" ),
-    EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
-    EXC_NUMFMT_STRING(  22, "DD/MM/YYYY hh:mm" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"DD-MMM-YY"_ustr        },
+    { 16, u"DD-MMM"_ustr           },
+    { 17, u"MMM-YY"_ustr           },
+    { 18, u"h:mm AM/PM"_ustr       },
+    { 19, u"h:mm:ss AM/PM"_ustr    },
+    { 22, u"DD/MM/YYYY hh:mm"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_ENGLISH_UK[] =
 {
-    EXC_NUMFMT_STRING(  63, UTF8_POUND_UK "#,##0;-" UTF8_POUND_UK "#,##0" ),
-    EXC_NUMFMT_STRING(  64, UTF8_POUND_UK "#,##0;[RED]-" UTF8_POUND_UK "#,##0" 
),
-    EXC_NUMFMT_STRING(  65, UTF8_POUND_UK "#,##0.00;-" UTF8_POUND_UK 
"#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, UTF8_POUND_UK "#,##0.00;[RED]-" UTF8_POUND_UK 
"#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 63, u"£#,##0;-£#,##0"_ustr            },
+    { 64, u"£#,##0;[RED]-£#,##0"_ustr       },
+    { 65, u"£#,##0.00;-£#,##0.00"_ustr      },
+    { 66, u"£#,##0.00;[RED]-£#,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_ENGLISH_EIRE[] =
 {
-    EXC_NUMFMT_STRING(  63, UTF8_EURO "#,##0;-" UTF8_EURO "#,##0" ),
-    EXC_NUMFMT_STRING(  64, UTF8_EURO "#,##0;[RED]-" UTF8_EURO "#,##0" ),
-    EXC_NUMFMT_STRING(  65, UTF8_EURO "#,##0.00;-" UTF8_EURO "#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, UTF8_EURO "#,##0.00;[RED]-" UTF8_EURO "#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 63, u"€#,##0;-€#,##0"_ustr            },
+    { 64, u"€#,##0;[RED]-€#,##0"_ustr       },
+    { 65, u"€#,##0.00;-€#,##0.00"_ustr      },
+    { 66, u"€#,##0.00;[RED]-€#,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_ENGLISH_US[] =
 {
-    EXC_NUMFMT_STRING(  14, "M/D/YYYY" ),
-    EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "D-MMM" ),
-    EXC_NUMFMT_STRING(  20, "h:mm" ),
-    EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
-    EXC_NUMFMT_STRING(  22, "M/D/YYYY h:mm" ),
-    EXC_NUMFMT_STRING(  37, "#,##0_);(#,##0)" ),
-    EXC_NUMFMT_STRING(  38, "#,##0_);[RED](#,##0)" ),
-    EXC_NUMFMT_STRING(  39, "#,##0.00_);(#,##0.00)" ),
-    EXC_NUMFMT_STRING(  40, "#,##0.00_);[RED](#,##0.00)" ),
-    EXC_NUMFMT_STRING(  63, "$#,##0_);($#,##0)" ),
-    EXC_NUMFMT_STRING(  64, "$#,##0_);[RED]($#,##0)" ),
-    EXC_NUMFMT_STRING(  65, "$#,##0.00_);($#,##0.00)" ),
-    EXC_NUMFMT_STRING(  66, "$#,##0.00_);[RED]($#,##0.00)" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 14, u"M/D/YYYY"_ustr                     },
+    { 15, u"D-MMM-YY"_ustr                     },
+    { 16, u"D-MMM"_ustr                        },
+    { 20, u"h:mm"_ustr                         },
+    { 21, u"h:mm:ss"_ustr                      },
+    { 22, u"M/D/YYYY h:mm"_ustr                },
+    { 37, u"#,##0_);(#,##0)"_ustr              },
+    { 38, u"#,##0_);[RED](#,##0)"_ustr         },
+    { 39, u"#,##0.00_);(#,##0.00)"_ustr        },
+    { 40, u"#,##0.00_);[RED](#,##0.00)"_ustr   },
+    { 63, u"$#,##0_);($#,##0)"_ustr            },
+    { 64, u"$#,##0_);[RED]($#,##0)"_ustr       },
+    { 65, u"$#,##0.00_);($#,##0.00)"_ustr      },
+    { 66, u"$#,##0.00_);[RED]($#,##0.00)"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_ENGLISH_CAN[] =
 {
-    EXC_NUMFMT_STRING(  20, "h:mm" ),
-    EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
-    EXC_NUMFMT_STRING(  22, "DD/MM/YYYY h:mm" ),
-    EXC_NUMFMT_STRING(  63, "$#,##0;-$#,##0" ),
-    EXC_NUMFMT_STRING(  64, "$#,##0;[RED]-$#,##0" ),
-    EXC_NUMFMT_STRING(  65, "$#,##0.00;-$#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, "$#,##0.00;[RED]-$#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 20, u"h:mm"_ustr                      },
+    { 21, u"h:mm:ss"_ustr                   },
+    { 22, u"DD/MM/YYYY h:mm"_ustr           },
+    { 63, u"$#,##0;-$#,##0"_ustr            },
+    { 64, u"$#,##0;[RED]-$#,##0"_ustr       },
+    { 65, u"$#,##0.00;-$#,##0.00"_ustr      },
+    { 66, u"$#,##0.00;[RED]-$#,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_ENGLISH_AUS[] =
 {
-    EXC_NUMFMT_STRING(  14, "D/MM/YYYY" ),
-    EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "D-MMM" ),
-    EXC_NUMFMT_STRING(  20, "h:mm" ),
-    EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
-    EXC_NUMFMT_STRING(  22, "D/MM/YYYY h:mm" ),
-    EXC_NUMFMT_STRING(  63, "$#,##0;-$#,##0" ),
-    EXC_NUMFMT_STRING(  64, "$#,##0;[RED]-$#,##0" ),
-    EXC_NUMFMT_STRING(  65, "$#,##0.00;-$#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, "$#,##0.00;[RED]-$#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 14, u"D/MM/YYYY"_ustr                 },
+    { 15, u"D-MMM-YY"_ustr                  },
+    { 16, u"D-MMM"_ustr                     },
+    { 20, u"h:mm"_ustr                      },
+    { 21, u"h:mm:ss"_ustr                   },
+    { 22, u"D/MM/YYYY h:mm"_ustr            },
+    { 63, u"$#,##0;-$#,##0"_ustr            },
+    { 64, u"$#,##0;[RED]-$#,##0"_ustr       },
+    { 65, u"$#,##0.00;-$#,##0.00"_ustr      },
+    { 66, u"$#,##0.00;[RED]-$#,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_ENGLISH_SAFRICA[] =
 {
-    EXC_NUMFMT_STRING(  14, "YYYY/MM/DD" ),
-    EXC_NUMFMT_OFFSET(  18, NF_TIME_HHMMAMPM ),
-    EXC_NUMFMT_OFFSET(  19, NF_TIME_HHMMSSAMPM ),
-    EXC_NUMFMT_STRING(  22, "YYYY/MM/DD hh:mm" ),
-    EXC_NUMFMT_STRING(  63, "\R #,##0;\R -#,##0" ),
-    EXC_NUMFMT_STRING(  64, "\R #,##0;[RED]\R -#,##0" ),
-    EXC_NUMFMT_STRING(  65, "\R #,##0.00;\R -#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, "\R #,##0.00;[RED]\R -#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 14, u"YYYY/MM/DD"_ustr                      },
+    { 18, NF_TIME_HHMMAMPM                        },
+    { 19, NF_TIME_HHMMSSAMPM                      },
+    { 22, u"YYYY/MM/DD hh:mm"_ustr                },
+    { 63, u"\R #,##0;\R -#,##0"_ustr            },
+    { 64, u"\R #,##0;[RED]\R -#,##0"_ustr       },
+    { 65, u"\R #,##0.00;\R -#,##0.00"_ustr      },
+    { 66, u"\R #,##0.00;[RED]\R -#,##0.00"_ustr },
 };
 
 // FRENCH ---------------------------------------------------------------------
@@ -1012,64 +981,59 @@ const XclBuiltInFormat 
spBuiltInFormats_ENGLISH_SAFRICA[] =
 /** Base table for French locales. */
 const XclBuiltInFormat spBuiltInFormats_FRENCH[] =
 {
-    EXC_NUMFMT_STRING(  15, "DD-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "DD-MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM-YY" ),
-    EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"DD-MMM-YY"_ustr     },
+    { 16, u"DD-MMM"_ustr        },
+    { 17, u"MMM-YY"_ustr        },
+    { 18, u"h:mm AM/PM"_ustr    },
+    { 19, u"h:mm:ss AM/PM"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_FRENCH_FRANCE[] =
 {
-    EXC_NUMFMT_STRING(  22, "DD/MM/YYYY hh:mm" ),
-    EXC_NUMFMT_STRING(  37, "#,##0\ _" UTF8_EURO ";-#,##0\ _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  38, "#,##0\ _" UTF8_EURO ";[RED]-#,##0\ _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  39, "#,##0.00\ _" UTF8_EURO ";-#,##0.00\ _" UTF8_EURO 
),
-    EXC_NUMFMT_STRING(  40, "#,##0.00\ _" UTF8_EURO ";[RED]-#,##0.00\ _" 
UTF8_EURO ),
-    EXC_NUMFMT_STRING(  63, "#,##0\ " UTF8_EURO ";-#,##0\ " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  64, "#,##0\ " UTF8_EURO ";[RED]-#,##0\ " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  65, "#,##0.00\ " UTF8_EURO ";-#,##0.00\ " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  66, "#,##0.00\ " UTF8_EURO ";[RED]-#,##0.00\ " 
UTF8_EURO ),
-    EXC_NUMFMT_ENDTABLE()
+    { 22, u"DD/MM/YYYY hh:mm"_ustr                  },
+    { 37, u"#,##0\ _€;-#,##0\ _€"_ustr            },
+    { 38, u"#,##0\ _€;[RED]-#,##0\ _€"_ustr       },
+    { 39, u"#,##0.00\ _€;-#,##0.00\ _€"_ustr      },
+    { 40, u"#,##0.00\ _€;[RED]-#,##0.00\ _€"_ustr },
+    { 63, u"#,##0\ €;-#,##0\ €"_ustr              },
+    { 64, u"#,##0\ €;[RED]-#,##0\ €"_ustr         },
+    { 65, u"#,##0.00\ €;-#,##0.00\ €"_ustr        },
+    { 66, u"#,##0.00\ €;[RED]-#,##0.00\ €"_ustr   },
 };
 
 const XclBuiltInFormat spBuiltInFormats_FRENCH_CANADIAN[] =
 {
-    EXC_NUMFMT_STRING(  22, "YYYY-MM-DD hh:mm" ),
-    EXC_NUMFMT_STRING(  37, "#,##0\ _$_-;#,##0\ _$-" ),
-    EXC_NUMFMT_STRING(  38, "#,##0\ _$_-;[RED]#,##0\ _$-" ),
-    EXC_NUMFMT_STRING(  39, "#,##0.00\ _$_-;#,##0.00\ _$-" ),
-    EXC_NUMFMT_STRING(  40, "#,##0.00\ _$_-;[RED]#,##0.00\ _$-" ),
-    EXC_NUMFMT_STRING(  63, "#,##0\ $_-;#,##0\ $-" ),
-    EXC_NUMFMT_STRING(  64, "#,##0\ $_-;[RED]#,##0\ $-" ),
-    EXC_NUMFMT_STRING(  65, "#,##0.00\ $_-;#,##0.00\ $-" ),
-    EXC_NUMFMT_STRING(  66, "#,##0.00\ $_-;[RED]#,##0.00\ $-" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 22, u"YYYY-MM-DD hh:mm"_ustr                    },
+    { 37, u"#,##0\ _$_-;#,##0\ _$-"_ustr            },
+    { 38, u"#,##0\ _$_-;[RED]#,##0\ _$-"_ustr       },
+    { 39, u"#,##0.00\ _$_-;#,##0.00\ _$-"_ustr      },
+    { 40, u"#,##0.00\ _$_-;[RED]#,##0.00\ _$-"_ustr },
+    { 63, u"#,##0\ $_-;#,##0\ $-"_ustr              },
+    { 64, u"#,##0\ $_-;[RED]#,##0\ $-"_ustr         },
+    { 65, u"#,##0.00\ $_-;#,##0.00\ $-"_ustr        },
+    { 66, u"#,##0.00\ $_-;[RED]#,##0.00\ $-"_ustr   },
 };
 
 const XclBuiltInFormat spBuiltInFormats_FRENCH_SWISS[] =
 {
-    EXC_NUMFMT_STRING(  15, "DD.MMM.YY" ),
-    EXC_NUMFMT_STRING(  16, "DD.MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM.YY" ),
-    EXC_NUMFMT_STRING(  22, "DD.MM.YYYY hh:mm" ),
-    EXC_NUMFMT_STRING(  63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
-    EXC_NUMFMT_STRING(  64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
-    EXC_NUMFMT_STRING(  65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"DD.MMM.YY"_ustr                                 },
+    { 16, u"DD.MMM"_ustr                                    },
+    { 17, u"MMM.YY"_ustr                                    },
+    { 22, u"DD.MM.YYYY hh:mm"_ustr                          },
+    { 63, u"\"SFr. \"#,##0;\"SFr. \"-#,##0"_ustr            },
+    { 64, u"\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0"_ustr       },
+    { 65, u"\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00"_ustr      },
+    { 66, u"\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_FRENCH_BELGIAN[] =
 {
-    EXC_NUMFMT_STRING(  14, "D/MM/YYYY" ),
-    EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "D-MMM" ),
-    EXC_NUMFMT_STRING(  20, "h:mm" ),
-    EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
-    EXC_NUMFMT_STRING(  22, "D/MM/YYYY h:mm" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 14, u"D/MM/YYYY"_ustr      },
+    { 15, u"D-MMM-YY"_ustr       },
+    { 16, u"D-MMM"_ustr          },
+    { 20, u"h:mm"_ustr           },
+    { 21, u"h:mm:ss"_ustr        },
+    { 22, u"D/MM/YYYY h:mm"_ustr },
 };
 
 // GERMAN ---------------------------------------------------------------------
@@ -1077,148 +1041,138 @@ const XclBuiltInFormat 
spBuiltInFormats_FRENCH_BELGIAN[] =
 /** Base table for German locales. */
 const XclBuiltInFormat spBuiltInFormats_GERMAN[] =
 {
-    EXC_NUMFMT_STRING(  15, "DD. MMM YY" ),
-    EXC_NUMFMT_STRING(  16, "DD. MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM YY" ),
-    EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
-    EXC_NUMFMT_STRING(  22, "DD.MM.YYYY hh:mm" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"DD. MMM YY"_ustr       },
+    { 16, u"DD. MMM"_ustr          },
+    { 17, u"MMM YY"_ustr           },
+    { 18, u"h:mm AM/PM"_ustr       },
+    { 19, u"h:mm:ss AM/PM"_ustr    },
+    { 22, u"DD.MM.YYYY hh:mm"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_GERMAN_GERMANY[] =
 {
-    EXC_NUMFMT_STRING(  37, "#,##0 _" UTF8_EURO ";-#,##0 _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  38, "#,##0 _" UTF8_EURO ";[RED]-#,##0 _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  39, "#,##0.00 _" UTF8_EURO ";-#,##0.00 _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  40, "#,##0.00 _" UTF8_EURO ";[RED]-#,##0.00 _" 
UTF8_EURO ),
-    EXC_NUMFMT_STRING(  63, "#,##0 " UTF8_EURO ";-#,##0 " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  64, "#,##0 " UTF8_EURO ";[RED]-#,##0 " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  65, "#,##0.00 " UTF8_EURO ";-#,##0.00 " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  66, "#,##0.00 " UTF8_EURO ";[RED]-#,##0.00 " UTF8_EURO 
),
-    EXC_NUMFMT_ENDTABLE()
+    { 37, u"#,##0 _€;-#,##0 _€"_ustr            },
+    { 38, u"#,##0 _€;[RED]-#,##0 _€"_ustr       },
+    { 39, u"#,##0.00 _€;-#,##0.00 _€"_ustr      },
+    { 40, u"#,##0.00 _€;[RED]-#,##0.00 _€"_ustr },
+    { 63, u"#,##0 €;-#,##0 €"_ustr              },
+    { 64, u"#,##0 €;[RED]-#,##0 €"_ustr         },
+    { 65, u"#,##0.00 €;-#,##0.00 €"_ustr        },
+    { 66, u"#,##0.00 €;[RED]-#,##0.00 €"_ustr   },
 };
 
 const XclBuiltInFormat spBuiltInFormats_GERMAN_AUSTRIAN[] =
 {
-    EXC_NUMFMT_STRING(  15, "DD.MMM.YY" ),
-    EXC_NUMFMT_STRING(  16, "DD.MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM.YY" ),
-    EXC_NUMFMT_STRING(  63, UTF8_EURO " #,##0;-" UTF8_EURO " #,##0" ),
-    EXC_NUMFMT_STRING(  64, UTF8_EURO " #,##0;[RED]-" UTF8_EURO " #,##0" ),
-    EXC_NUMFMT_STRING(  65, UTF8_EURO " #,##0.00;-" UTF8_EURO " #,##0.00" ),
-    EXC_NUMFMT_STRING(  66, UTF8_EURO " #,##0.00;[RED]-" UTF8_EURO " #,##0.00" 
),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"DD.MMM.YY"_ustr                   },
+    { 16, u"DD.MMM"_ustr                      },
+    { 17, u"MMM.YY"_ustr                      },
+    { 63, u"€ #,##0;-€ #,##0"_ustr            },
+    { 64, u"€ #,##0;[RED]-€ #,##0"_ustr       },
+    { 65, u"€ #,##0.00;-€ #,##0.00"_ustr      },
+    { 66, u"€ #,##0.00;[RED]-€ #,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_GERMAN_SWISS[] =
 {
-    EXC_NUMFMT_STRING(  63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
-    EXC_NUMFMT_STRING(  64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
-    EXC_NUMFMT_STRING(  65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 63, u"\"SFr. \"#,##0;\"SFr. \"-#,##0"_ustr            },
+    { 64, u"\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0"_ustr       },
+    { 65, u"\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00"_ustr      },
+    { 66, u"\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_GERMAN_LUXEMBOURG[] =
 {
-    EXC_NUMFMT_STRING(  15, "DD.MMM.YY" ),
-    EXC_NUMFMT_STRING(  16, "DD.MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM.YY" ),
-    EXC_NUMFMT_STRING(  37, "#,##0 _" UTF8_EURO ";-#,##0 _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  38, "#,##0 _" UTF8_EURO ";[RED]-#,##0 _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  39, "#,##0.00 _" UTF8_EURO ";-#,##0.00 _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  40, "#,##0.00 _" UTF8_EURO ";[RED]-#,##0.00 _" 
UTF8_EURO ),
-    EXC_NUMFMT_STRING(  63, "#,##0 " UTF8_EURO ";-#,##0 " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  64, "#,##0 " UTF8_EURO ";[RED]-#,##0 " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  65, "#,##0.00 " UTF8_EURO ";-#,##0.00 " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  66, "#,##0.00 " UTF8_EURO ";[RED]-#,##0.00 " UTF8_EURO 
),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"DD.MMM.YY"_ustr                     },
+    { 16, u"DD.MMM"_ustr                        },
+    { 17, u"MMM.YY"_ustr                        },
+    { 37, u"#,##0 _€;-#,##0 _€"_ustr            },
+    { 38, u"#,##0 _€;[RED]-#,##0 _€"_ustr       },
+    { 39, u"#,##0.00 _€;-#,##0.00 _€"_ustr      },
+    { 40, u"#,##0.00 _€;[RED]-#,##0.00 _€"_ustr },
+    { 63, u"#,##0 €;-#,##0 €"_ustr              },
+    { 64, u"#,##0 €;[RED]-#,##0 €"_ustr         },
+    { 65, u"#,##0.00 €;-#,##0.00 €"_ustr        },
+    { 66, u"#,##0.00 €;[RED]-#,##0.00 €"_ustr   },
 };
 
 const XclBuiltInFormat spBuiltInFormats_GERMAN_LIECHTENSTEIN[] =
 {
-    EXC_NUMFMT_STRING(  63, "\"CHF \"#,##0;\"CHF \"-#,##0" ),
-    EXC_NUMFMT_STRING(  64, "\"CHF \"#,##0;[RED]\"CHF \"-#,##0" ),
-    EXC_NUMFMT_STRING(  65, "\"CHF \"#,##0.00;\"CHF \"-#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, "\"CHF \"#,##0.00;[RED]\"CHF \"-#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 63, u"\"CHF \"#,##0;\"CHF \"-#,##0"_ustr            },
+    { 64, u"\"CHF \"#,##0;[RED]\"CHF \"-#,##0"_ustr       },
+    { 65, u"\"CHF \"#,##0.00;\"CHF \"-#,##0.00"_ustr      },
+    { 66, u"\"CHF \"#,##0.00;[RED]\"CHF \"-#,##0.00"_ustr },
 };
 
 // ITALIAN --------------------------------------------------------------------
 
 const XclBuiltInFormat spBuiltInFormats_ITALIAN_ITALY[] =
 {
-    EXC_NUMFMT_STRING(  15, "DD-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "DD-MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM-YY" ),
-    EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
-    EXC_NUMFMT_STRING(  20, "h:mm" ),
-    EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
-    EXC_NUMFMT_STRING(  22, "DD/MM/YYYY h:mm" ),
-    EXC_NUMFMT_STRING(  63, UTF8_EURO " #,##0;-" UTF8_EURO " #,##0" ),
-    EXC_NUMFMT_STRING(  64, UTF8_EURO " #,##0;[RED]-" UTF8_EURO " #,##0" ),
-    EXC_NUMFMT_STRING(  65, UTF8_EURO " #,##0.00;-" UTF8_EURO " #,##0.00" ),
-    EXC_NUMFMT_STRING(  66, UTF8_EURO " #,##0.00;[RED]-" UTF8_EURO " #,##0.00" 
),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"DD-MMM-YY"_ustr                   },
+    { 16, u"DD-MMM"_ustr                      },
+    { 17, u"MMM-YY"_ustr                      },
+    { 18, u"h:mm AM/PM"_ustr                  },
+    { 19, u"h:mm:ss AM/PM"_ustr               },
+    { 20, u"h:mm"_ustr                        },
+    { 21, u"h:mm:ss"_ustr                     },
+    { 22, u"DD/MM/YYYY h:mm"_ustr             },
+    { 63, u"€ #,##0;-€ #,##0"_ustr            },
+    { 64, u"€ #,##0;[RED]-€ #,##0"_ustr       },
+    { 65, u"€ #,##0.00;-€ #,##0.00"_ustr      },
+    { 66, u"€ #,##0.00;[RED]-€ #,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_ITALIAN_SWISS[] =
 {
-    EXC_NUMFMT_STRING(  15, "DD.MMM.YY" ),
-    EXC_NUMFMT_STRING(  16, "DD.MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM.YY" ),
-    EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
-    EXC_NUMFMT_STRING(  22, "DD.MM.YYYY hh:mm" ),
-    EXC_NUMFMT_STRING(  63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
-    EXC_NUMFMT_STRING(  64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
-    EXC_NUMFMT_STRING(  65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"DD.MMM.YY"_ustr                                 },
+    { 16, u"DD.MMM"_ustr                                    },
+    { 17, u"MMM.YY"_ustr                                    },
+    { 18, u"h:mm AM/PM"_ustr                                },
+    { 19, u"h:mm:ss AM/PM"_ustr                             },
+    { 22, u"DD.MM.YYYY hh:mm"_ustr                          },
+    { 63, u"\"SFr. \"#,##0;\"SFr. \"-#,##0"_ustr            },
+    { 64, u"\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0"_ustr       },
+    { 65, u"\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00"_ustr      },
+    { 66, u"\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00"_ustr },
 };
 
 // SWEDISH --------------------------------------------------------------------
 
 const XclBuiltInFormat spBuiltInFormats_SWEDISH_SWEDEN[] =
 {
-    EXC_NUMFMT_STRING(  15, "DD-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "DD-MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM-YY" ),
-    EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
-    EXC_NUMFMT_STRING(  22, "YYYY-MM-DD hh:mm" ),
-    EXC_NUMFMT_STRING(  37, "#,##0 _k_r;-#,##0 _k_r" ),
-    EXC_NUMFMT_STRING(  38, "#,##0 _k_r;[RED]-#,##0 _k_r" ),
-    EXC_NUMFMT_STRING(  39, "#,##0.00 _k_r;-#,##0.00 _k_r" ),
-    EXC_NUMFMT_STRING(  40, "#,##0.00 _k_r;[RED]-#,##0.00 _k_r" ),
-    EXC_NUMFMT_STRING(  63, "#,##0 \"kr\";-#,##0 \"kr\"" ),
-    EXC_NUMFMT_STRING(  64, "#,##0 \"kr\";[RED]-#,##0 \"kr\"" ),
-    EXC_NUMFMT_STRING(  65, "#,##0.00 \"kr\";-#,##0.00 \"kr\"" ),
-    EXC_NUMFMT_STRING(  66, "#,##0.00 \"kr\";[RED]-#,##0.00 \"kr\"" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"DD-MMM-YY"_ustr                             },
+    { 16, u"DD-MMM"_ustr                                },
+    { 17, u"MMM-YY"_ustr                                },
+    { 18, u"h:mm AM/PM"_ustr                            },
+    { 19, u"h:mm:ss AM/PM"_ustr                         },
+    { 22, u"YYYY-MM-DD hh:mm"_ustr                      },
+    { 37, u"#,##0 _k_r;-#,##0 _k_r"_ustr                },
+    { 38, u"#,##0 _k_r;[RED]-#,##0 _k_r"_ustr           },
+    { 39, u"#,##0.00 _k_r;-#,##0.00 _k_r"_ustr          },
+    { 40, u"#,##0.00 _k_r;[RED]-#,##0.00 _k_r"_ustr     },
+    { 63, u"#,##0 \"kr\";-#,##0 \"kr\""_ustr            },
+    { 64, u"#,##0 \"kr\";[RED]-#,##0 \"kr\""_ustr       },
+    { 65, u"#,##0.00 \"kr\";-#,##0.00 \"kr\""_ustr      },
+    { 66, u"#,##0.00 \"kr\";[RED]-#,##0.00 \"kr\""_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_SWEDISH_FINLAND[] =
 {
-    EXC_NUMFMT_STRING(   9, "0 %" ),
-    EXC_NUMFMT_STRING(  10, "0.00 %" ),
-    EXC_NUMFMT_STRING(  15, "DD.MMM.YY" ),
-    EXC_NUMFMT_STRING(  16, "DD.MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM.YY" ),
-    EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
-    EXC_NUMFMT_STRING(  22, "D.M.YYYY hh:mm" ),
-    EXC_NUMFMT_STRING(  37, "#,##0 _" UTF8_EURO ";-#,##0 _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  38, "#,##0 _" UTF8_EURO ";[RED]-#,##0 _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  39, "#,##0.00 _" UTF8_EURO ";-#,##0.00 _" UTF8_EURO ),
-    EXC_NUMFMT_STRING(  40, "#,##0.00 _" UTF8_EURO ";[RED]-#,##0.00 _" 
UTF8_EURO ),
-    EXC_NUMFMT_STRING(  63, "#,##0 " UTF8_EURO ";-#,##0 " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  64, "#,##0 " UTF8_EURO ";[RED]-#,##0 " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  65, "#,##0.00 " UTF8_EURO ";-#,##0.00 " UTF8_EURO ),
-    EXC_NUMFMT_STRING(  66, "#,##0.00 " UTF8_EURO ";[RED]-#,##0.00 " UTF8_EURO 
),
-    EXC_NUMFMT_ENDTABLE()
+    {  9, u"0 %"_ustr                           },
+    { 10, u"0.00 %"_ustr                        },
+    { 15, u"DD.MMM.YY"_ustr                     },
+    { 16, u"DD.MMM"_ustr                        },
+    { 17, u"MMM.YY"_ustr                        },
+    { 18, u"h:mm AM/PM"_ustr                    },
+    { 19, u"h:mm:ss AM/PM"_ustr                 },
+    { 22, u"D.M.YYYY hh:mm"_ustr                },
+    { 37, u"#,##0 _€;-#,##0 _€"_ustr            },
+    { 38, u"#,##0 _€;[RED]-#,##0 _€"_ustr       },
+    { 39, u"#,##0.00 _€;-#,##0.00 _€"_ustr      },
+    { 40, u"#,##0.00 _€;[RED]-#,##0.00 _€"_ustr },
+    { 63, u"#,##0 €;-#,##0 €"_ustr              },
+    { 64, u"#,##0 €;[RED]-#,##0 €"_ustr         },
+    { 65, u"#,##0.00 €;-#,##0.00 €"_ustr        },
+    { 66, u"#,##0.00 €;[RED]-#,##0.00 €"_ustr   },
 };
 
 // ASIAN ----------------------------------------------------------------------
@@ -1226,190 +1180,178 @@ const XclBuiltInFormat 
spBuiltInFormats_SWEDISH_FINLAND[] =
 /** Base table for Asian locales. */
 const XclBuiltInFormat spBuiltInFormats_ASIAN[] =
 {
-    EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
-    EXC_NUMFMT_STRING(  20, "h:mm" ),
-    EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
-    EXC_NUMFMT_STRING(  23, "$#,##0_);($#,##0)" ),
-    EXC_NUMFMT_STRING(  24, "$#,##0_);[RED]($#,##0)" ),
-    EXC_NUMFMT_STRING(  25, "$#,##0.00_);($#,##0.00)" ),
-    EXC_NUMFMT_STRING(  26, "$#,##0.00_);[RED]($#,##0.00)" ),
-    EXC_NUMFMT_REUSE(   29, 28 ),
-    EXC_NUMFMT_REUSE(   36, 27 ),
-    EXC_NUMFMT_REUSE(   50, 27 ),
-    EXC_NUMFMT_REUSE(   51, 28 ),
-    EXC_NUMFMT_REUSE(   52, 34 ),
-    EXC_NUMFMT_REUSE(   53, 35 ),
-    EXC_NUMFMT_REUSE(   54, 28 ),
-    EXC_NUMFMT_REUSE(   55, 34 ),
-    EXC_NUMFMT_REUSE(   56, 35 ),
-    EXC_NUMFMT_REUSE(   57, 27 ),
-    EXC_NUMFMT_REUSE(   58, 28 ),
-    EXC_NUMFMT_ENDTABLE()
+    { 18, u"h:mm AM/PM"_ustr                   },
+    { 19, u"h:mm:ss AM/PM"_ustr                },
+    { 20, u"h:mm"_ustr                         },
+    { 21, u"h:mm:ss"_ustr                      },
+    { 23, u"$#,##0_);($#,##0)"_ustr            },
+    { 24, u"$#,##0_);[RED]($#,##0)"_ustr       },
+    { 25, u"$#,##0.00_);($#,##0.00)"_ustr      },
+    { 26, u"$#,##0.00_);[RED]($#,##0.00)"_ustr },
+    { 29, 28 },
+    { 36, 27 },
+    { 50, 27 },
+    { 51, 28 },
+    { 52, 34 },
+    { 53, 35 },
+    { 54, 28 },
+    { 55, 34 },
+    { 56, 35 },
+    { 57, 27 },
+    { 58, 28 },
 };
 
 const XclBuiltInFormat spBuiltInFormats_JAPANESE[] =
 {
-    EXC_NUMFMT_STRING(  14, "YYYY/M/D" ),
-    EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "D-MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM-YY" ),
-    EXC_NUMFMT_STRING(  22, "YYYY/M/D h:mm" ),
-    EXC_NUMFMT_STRING(  27, "[$-0411]GE.M.D" ),
-    EXC_NUMFMT_STRING(  28, "[$-0411]GGGE" UTF8_CJ_YEAR "M" UTF8_CJ_MON "D" 
UTF8_CJ_DAY ),
-    EXC_NUMFMT_STRING(  30, "[$-0411]M/D/YY" ),
-    EXC_NUMFMT_STRING(  31, "[$-0411]YYYY" UTF8_CJ_YEAR "M" UTF8_CJ_MON "D" 
UTF8_CJ_DAY ),
-    EXC_NUMFMT_STRING(  32, "[$-0411]h" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN ),
-    EXC_NUMFMT_STRING(  33, "[$-0411]h" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN "ss" 
UTF8_CJ_SEC ),
-    EXC_NUMFMT_STRING(  34, "[$-0411]YYYY" UTF8_CJ_YEAR "M" UTF8_CJ_MON ),
-    EXC_NUMFMT_STRING(  35, "[$-0411]M" UTF8_CJ_MON "D" UTF8_CJ_DAY ),
-    EXC_NUMFMT_STRING(  63, UTF8_YEN_JP "#,##0;-" UTF8_YEN_JP "#,##0" ),
-    EXC_NUMFMT_STRING(  64, UTF8_YEN_JP "#,##0;[RED]-" UTF8_YEN_JP "#,##0" ),
-    EXC_NUMFMT_STRING(  65, UTF8_YEN_JP "#,##0.00;-" UTF8_YEN_JP "#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, UTF8_YEN_JP "#,##0.00;[RED]-" UTF8_YEN_JP 
"#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 14, u"YYYY/M/D"_ustr                  },
+    { 15, u"D-MMM-YY"_ustr                  },
+    { 16, u"D-MMM"_ustr                     },
+    { 17, u"MMM-YY"_ustr                    },
+    { 22, u"YYYY/M/D h:mm"_ustr             },
+    { 27, u"[$-0411]GE.M.D"_ustr            },
+    { 28, u"[$-0411]GGGE年M月D日"_ustr       },
+    { 30, u"[$-0411]M/D/YY"_ustr            },
+    { 31, u"[$-0411]YYYY年M月D日"_ustr       },
+    { 32, u"[$-0411]h時mm分"_ustr            },
+    { 33, u"[$-0411]h時mm分ss秒"_ustr        },
+    { 34, u"[$-0411]YYYY年M月"_ustr          },
+    { 35, u"[$-0411]M月D日"_ustr             },
+    { 63, u"¥#,##0;-¥#,##0"_ustr            },
+    { 64, u"¥#,##0;[RED]-¥#,##0"_ustr       },
+    { 65, u"¥#,##0.00;-¥#,##0.00"_ustr      },
+    { 66, u"¥#,##0.00;[RED]-¥#,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_KOREAN[] =
 {
-    EXC_NUMFMT_STRING(  14, "YYYY-MM-DD" ),
-    EXC_NUMFMT_STRING(  15, "DD-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "DD-MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM-YY" ),
-    EXC_NUMFMT_STRING(  22, "YYYY-MM-DD h:mm" ),
-    EXC_NUMFMT_STRING(  27, "[$-0412]YYYY" UTF8_CJ_YEAR " MM" UTF8_CJ_MON " 
DD" UTF8_CJ_DAY ),
-    EXC_NUMFMT_STRING(  28, "[$-0412]MM-DD" ),
-    EXC_NUMFMT_STRING(  30, "[$-0412]MM-DD-YY" ),
-    EXC_NUMFMT_STRING(  31, "[$-0412]YYYY" UTF8_KO_YEAR " MM" UTF8_KO_MON " 
DD" UTF8_KO_DAY ),
-    EXC_NUMFMT_STRING(  32, "[$-0412]h" UTF8_KO_HOUR " mm" UTF8_KO_MIN ),
-    EXC_NUMFMT_STRING(  33, "[$-0412]h" UTF8_KO_HOUR " mm" UTF8_KO_MIN " ss" 
UTF8_KO_SEC ),
-    EXC_NUMFMT_STRING(  34, "[$-0412]YYYY\"/\"MM\"/\"DD" ),
-    EXC_NUMFMT_STRING(  35, "[$-0412]YYYY-MM-DD" ),
-    EXC_NUMFMT_STRING(  63, UTF8_WON "#,##0;-" UTF8_WON "#,##0" ),
-    EXC_NUMFMT_STRING(  64, UTF8_WON "#,##0;[RED]-" UTF8_WON "#,##0" ),
-    EXC_NUMFMT_STRING(  65, UTF8_WON "#,##0.00;-" UTF8_WON "#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, UTF8_WON "#,##0.00;[RED]-" UTF8_WON "#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 14, u"YYYY-MM-DD"_ustr                 },
+    { 15, u"DD-MMM-YY"_ustr                  },
+    { 16, u"DD-MMM"_ustr                     },
+    { 17, u"MMM-YY"_ustr                     },
+    { 22, u"YYYY-MM-DD h:mm"_ustr            },
+    { 27, u"[$-0412]YYYY年 MM月 DD日"_ustr    },
+    { 28, u"[$-0412]MM-DD"_ustr              },
+    { 30, u"[$-0412]MM-DD-YY"_ustr           },
+    { 31, u"[$-0412]YYYY년 MM월 DD일"_ustr    },
+    { 32, u"[$-0412]h시 mm분"_ustr            },
+    { 33, u"[$-0412]h시 mm분 ss초"_ustr       },
+    { 34, u"[$-0412]YYYY\"/\"MM\"/\"DD"_ustr },
+    { 35, u"[$-0412]YYYY-MM-DD"_ustr         },
+    { 63, u"₩#,##0;-₩#,##0"_ustr            },
+    { 64, u"₩#,##0;[RED]-₩#,##0"_ustr       },
+    { 65, u"₩#,##0.00;-₩#,##0.00"_ustr      },
+    { 66, u"₩#,##0.00;[RED]-₩#,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_CHINESE_SIMPLIFIED[] =
 {
-    EXC_NUMFMT_STRING(  14, "YYYY-M-D" ),
-    EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "D-MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM-YY" ),
-    EXC_NUMFMT_STRING(  22, "YYYY-M-D h:mm" ),
-    EXC_NUMFMT_STRING(  27, "[$-0804]YYYY" UTF8_CJ_YEAR "M" UTF8_CJ_MON ),
-    EXC_NUMFMT_STRING(  28, "[$-0804]M" UTF8_CJ_MON "D" UTF8_CJ_DAY ),
-    EXC_NUMFMT_STRING(  30, "[$-0804]M-D-YY" ),
-    EXC_NUMFMT_STRING(  31, "[$-0804]YYYY" UTF8_CJ_YEAR "M" UTF8_CJ_MON "D" 
UTF8_CJ_DAY ),
-    EXC_NUMFMT_STRING(  32, "[$-0804]h" UTF8_CS_HOUR "mm" UTF8_CJ_MIN ),
-    EXC_NUMFMT_STRING(  33, "[$-0804]h" UTF8_CS_HOUR "mm" UTF8_CJ_MIN "ss" 
UTF8_CJ_SEC ),
-    EXC_NUMFMT_STRING(  34, "[$-0804]AM/PMh" UTF8_CS_HOUR "mm" UTF8_CJ_MIN ),
-    EXC_NUMFMT_STRING(  35, "[$-0804]AM/PMh" UTF8_CS_HOUR "mm" UTF8_CJ_MIN 
"ss" UTF8_CJ_SEC ),
-    EXC_NUMFMT_REUSE(   52, 27 ),
-    EXC_NUMFMT_REUSE(   53, 28 ),
-    EXC_NUMFMT_STRING(  63, UTF8_YEN_CS "#,##0;-" UTF8_YEN_CS "#,##0" ),
-    EXC_NUMFMT_STRING(  64, UTF8_YEN_CS "#,##0;[RED]-" UTF8_YEN_CS "#,##0" ),
-    EXC_NUMFMT_STRING(  65, UTF8_YEN_CS "#,##0.00;-" UTF8_YEN_CS "#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, UTF8_YEN_CS "#,##0.00;[RED]-" UTF8_YEN_CS 
"#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 14, u"YYYY-M-D"_ustr                   },
+    { 15, u"D-MMM-YY"_ustr                   },
+    { 16, u"D-MMM"_ustr                      },
+    { 17, u"MMM-YY"_ustr                     },
+    { 22, u"YYYY-M-D h:mm"_ustr              },
+    { 27, u"[$-0804]YYYY年M月"_ustr           },
+    { 28, u"[$-0804]M月D日"_ustr              },
+    { 30, u"[$-0804]M-D-YY"_ustr             },
+    { 31, u"[$-0804]YYYY年M月D日"_ustr        },
+    { 32, u"[$-0804]h时mm分"_ustr             },
+    { 33, u"[$-0804]h时mm分ss秒"_ustr         },
+    { 34, u"[$-0804]AM/PMh时mm分"_ustr        },
+    { 35, u"[$-0804]AM/PMh时mm分ss秒"_ustr    },
+    { 52, 27                                 },
+    { 53, 28                                 },
+    { 63, u"¥#,##0;-¥#,##0"_ustr            },
+    { 64, u"¥#,##0;[RED]-¥#,##0"_ustr       },
+    { 65, u"¥#,##0.00;-¥#,##0.00"_ustr      },
+    { 66, u"¥#,##0.00;[RED]-¥#,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_CHINESE_TRADITIONAL[] =
 {
-    EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "D-MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM-YY" ),
-    EXC_NUMFMT_STRING(  18, "hh:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "hh:mm:ss AM/PM" ),
-    EXC_NUMFMT_OFFSET(  20, NF_TIME_HHMM ),
-    EXC_NUMFMT_OFFSET(  21, NF_TIME_HHMMSS ),
-    EXC_NUMFMT_STRING(  22, "YYYY/M/D hh:mm" ),
-    EXC_NUMFMT_STRING(  23, "US$#,##0_);(US$#,##0)" ),
-    EXC_NUMFMT_STRING(  24, "US$#,##0_);[RED](US$#,##0)" ),
-    EXC_NUMFMT_STRING(  25, "US$#,##0.00_);(US$#,##0.00)" ),
-    EXC_NUMFMT_STRING(  26, "US$#,##0.00_);[RED](US$#,##0.00)" ),
-    EXC_NUMFMT_STRING(  27, "[$-0404]E/M/D" ),
-    EXC_NUMFMT_STRING(  28, "[$-0404]E" UTF8_CJ_YEAR "M" UTF8_CJ_MON "D" 
UTF8_CJ_DAY ),
-    EXC_NUMFMT_STRING(  30, "[$-0404]M/D/YY" ),
-    EXC_NUMFMT_STRING(  31, "[$-0404]YYYY" UTF8_CJ_YEAR "M" UTF8_CJ_MON "D" 
UTF8_CJ_DAY ),
-    EXC_NUMFMT_STRING(  32, "[$-0404]hh" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN ),
-    EXC_NUMFMT_STRING(  33, "[$-0404]hh" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN "ss" 
UTF8_CJ_SEC ),
-    EXC_NUMFMT_STRING(  34, "[$-0404]AM/PMhh" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN ),
-    EXC_NUMFMT_STRING(  35, "[$-0404]AM/PMhh" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN 
"ss" UTF8_CJ_SEC ),
-    EXC_NUMFMT_STRING(  63, "$#,##0;-$#,##0" ),
-    EXC_NUMFMT_STRING(  64, "$#,##0;[RED]-$#,##0" ),
-    EXC_NUMFMT_STRING(  65, "$#,##0.00;-$#,##0.00" ),
-    EXC_NUMFMT_STRING(  66, "$#,##0.00;[RED]-$#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"D-MMM-YY"_ustr                         },
+    { 16, u"D-MMM"_ustr                            },
+    { 17, u"MMM-YY"_ustr                           },
+    { 18, u"hh:mm AM/PM"_ustr                      },
+    { 19, u"hh:mm:ss AM/PM"_ustr                   },
+    { 20, NF_TIME_HHMM                             },
+    { 21, NF_TIME_HHMMSS                           },
+    { 22, u"YYYY/M/D hh:mm"_ustr                   },
+    { 23, u"US$#,##0_);(US$#,##0)"_ustr            },
+    { 24, u"US$#,##0_);[RED](US$#,##0)"_ustr       },
+    { 25, u"US$#,##0.00_);(US$#,##0.00)"_ustr      },
+    { 26, u"US$#,##0.00_);[RED](US$#,##0.00)"_ustr },
+    { 27, u"[$-0404]E/M/D"_ustr                    },
+    { 28, u"[$-0404]E年M月D日"_ustr                 },
+    { 30, u"[$-0404]M/D/YY"_ustr                   },
+    { 31, u"[$-0404]YYYY年M月D日"_ustr              },
+    { 32, u"[$-0404]hh時mm分"_ustr                  },
+    { 33, u"[$-0404]hh時mm分ss秒"_ustr              },
+    { 34, u"[$-0404]AM/PMhh時mm分"_ustr             },
+    { 35, u"[$-0404]AM/PMhh時mm分ss秒"_ustr         },
+    { 63, u"$#,##0;-$#,##0"_ustr                   },
+    { 64, u"$#,##0;[RED]-$#,##0"_ustr              },
+    { 65, u"$#,##0.00;-$#,##0.00"_ustr             },
+    { 66, u"$#,##0.00;[RED]-$#,##0.00"_ustr        },
 };
 
 // OTHER ----------------------------------------------------------------------
 
 const XclBuiltInFormat spBuiltInFormats_HEBREW[] =
 {
-    EXC_NUMFMT_STRING(  15, "DD-MMMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "DD-MMMM" ),
-    EXC_NUMFMT_STRING(  17, "MMMM-YY" ),
-    EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
-    EXC_NUMFMT_STRING(  63, UTF8_SHEQEL " #,##0;" UTF8_SHEQEL " -#,##0" ),
-    EXC_NUMFMT_STRING(  64, UTF8_SHEQEL " #,##0;[RED]" UTF8_SHEQEL " -#,##0" ),
-    EXC_NUMFMT_STRING(  65, UTF8_SHEQEL " #,##0.00;" UTF8_SHEQEL " -#,##0.00" 
),
-    EXC_NUMFMT_STRING(  66, UTF8_SHEQEL " #,##0.00;[RED]" UTF8_SHEQEL " 
-#,##0.00" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 15, u"DD-MMMM-YY"_ustr                  },
+    { 16, u"DD-MMMM"_ustr                     },
+    { 17, u"MMMM-YY"_ustr                     },
+    { 18, u"h:mm AM/PM"_ustr                  },
+    { 19, u"h:mm:ss AM/PM"_ustr               },
+    { 63, u"₪ #,##0;₪ -#,##0"_ustr            },
+    { 64, u"₪ #,##0;[RED]₪ -#,##0"_ustr       },
+    { 65, u"₪ #,##0.00;₪ -#,##0.00"_ustr      },
+    { 66, u"₪ #,##0.00;[RED]₪ -#,##0.00"_ustr },
 };
 
 const XclBuiltInFormat spBuiltInFormats_THAI[] =
 {
-    EXC_NUMFMT_STRING(  14, "D/M/YYYY" ),
-    EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
-    EXC_NUMFMT_STRING(  16, "D-MMM" ),
-    EXC_NUMFMT_STRING(  17, "MMM-YY" ),
-    EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
-    EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
-    EXC_NUMFMT_STRING(  22, "D/M/YYYY h:mm" ),
-    EXC_NUMFMT_STRING(  59, "t0" ),
-    EXC_NUMFMT_STRING(  60, "t0.00" ),
-    EXC_NUMFMT_STRING(  61, "t#,##0" ),
-    EXC_NUMFMT_STRING(  62, "t#,##0.00" ),
-    EXC_NUMFMT_STRING(  63, "t" UTF8_BAHT "#,##0_);t(" UTF8_BAHT "#,##0)" ),
-    EXC_NUMFMT_STRING(  64, "t" UTF8_BAHT "#,##0_);[RED]t(" UTF8_BAHT "#,##0)" 
),
-    EXC_NUMFMT_STRING(  65, "t" UTF8_BAHT "#,##0.00_);t(" UTF8_BAHT 
"#,##0.00)" ),
-    EXC_NUMFMT_STRING(  66, "t" UTF8_BAHT "#,##0.00_);[RED]t(" UTF8_BAHT 
"#,##0.00)" ),
-    EXC_NUMFMT_STRING(  67, "t0%" ),
-    EXC_NUMFMT_STRING(  68, "t0.00%" ),
-    EXC_NUMFMT_STRING(  69, "t# ?/?" ),
-    EXC_NUMFMT_STRING(  70, "t# ?\?/?\?" ),
-    EXC_NUMFMT_STRING(  71, "tD/M/EE" ),
-    EXC_NUMFMT_STRING(  72, "tD-MMM-E" ),
-    EXC_NUMFMT_STRING(  73, "tD-MMM" ),
-    EXC_NUMFMT_STRING(  74, "tMMM-E" ),
-    EXC_NUMFMT_STRING(  75, "th:mm" ),
-    EXC_NUMFMT_STRING(  76, "th:mm:ss" ),
-    EXC_NUMFMT_STRING(  77, "tD/M/EE h:mm" ),
-    EXC_NUMFMT_STRING(  78, "tmm:ss" ),
-    EXC_NUMFMT_STRING(  79, "t[h]:mm:ss" ),
-    EXC_NUMFMT_STRING(  80, "tmm:ss.0" ),
-    EXC_NUMFMT_STRING(  81, "D/M/E" ),
-    EXC_NUMFMT_ENDTABLE()
+    { 14, u"D/M/YYYY"_ustr                       },
+    { 15, u"D-MMM-YY"_ustr                       },
+    { 16, u"D-MMM"_ustr                          },
+    { 17, u"MMM-YY"_ustr                         },
+    { 18, u"h:mm AM/PM"_ustr                     },
+    { 19, u"h:mm:ss AM/PM"_ustr                  },
+    { 22, u"D/M/YYYY h:mm"_ustr                  },
+    { 59, u"t0"_ustr                             },
+    { 60, u"t0.00"_ustr                          },
+    { 61, u"t#,##0"_ustr                         },
+    { 62, u"t#,##0.00"_ustr                      },
+    { 63, u"t฿#,##0_);t(฿#,##0)"_ustr            },
+    { 64, u"t฿#,##0_);[RED]t(฿#,##0)"_ustr       },
+    { 65, u"t฿#,##0.00_);t(฿#,##0.00)"_ustr      },
+    { 66, u"t฿#,##0.00_);[RED]t(฿#,##0.00)"_ustr },
+    { 67, u"t0%"_ustr                            },
+    { 68, u"t0.00%"_ustr                         },
+    { 69, u"t# ?/?"_ustr                         },
+    { 70, u"t# ?\?/?\?"_ustr                     },
+    { 71, u"tD/M/EE"_ustr                        },
+    { 72, u"tD-MMM-E"_ustr                       },
+    { 73, u"tD-MMM"_ustr                         },
+    { 74, u"tMMM-E"_ustr                         },
+    { 75, u"th:mm"_ustr                          },
+    { 76, u"th:mm:ss"_ustr                       },
+    { 77, u"tD/M/EE h:mm"_ustr                   },
+    { 78, u"tmm:ss"_ustr                         },
+    { 79, u"t[h]:mm:ss"_ustr                     },
+    { 80, u"tmm:ss.0"_ustr                       },
+    { 81, u"D/M/E"_ustr                          },
 };
 
-#undef EXC_NUMFMT_ENDTABLE
-#undef EXC_NUMFMT_REUSE
-#undef EXC_NUMFMT_OFFSET
-#undef EXC_NUMFMT_STRING
-
 /** Specifies a number format table for a specific language. */
 struct XclBuiltInFormatTable
 {
     LanguageType        meLanguage;         /// The language of this table.
     LanguageType        meParentLang;       /// The language of the parent 
table.
-    const XclBuiltInFormat* mpFormats;      /// The number format table.
+    std::span<const XclBuiltInFormat> maFormats; /// The number format table.
 };
 
-const XclBuiltInFormatTable spBuiltInFormatTables[] =
+constexpr XclBuiltInFormatTable spBuiltInFormatTables[] =
 {   //  language                        parent language             format 
table
     {   LANGUAGE_DONTKNOW,              LANGUAGE_NONE,              
spBuiltInFormats_DONTKNOW               },
 
@@ -1420,15 +1362,15 @@ const XclBuiltInFormatTable spBuiltInFormatTables[] =
     {   LANGUAGE_ENGLISH_CAN,           LANGUAGE_ENGLISH,           
spBuiltInFormats_ENGLISH_CAN            },
     {   LANGUAGE_ENGLISH_AUS,           LANGUAGE_ENGLISH,           
spBuiltInFormats_ENGLISH_AUS            },
     {   LANGUAGE_ENGLISH_SAFRICA,       LANGUAGE_ENGLISH,           
spBuiltInFormats_ENGLISH_SAFRICA        },
-    {   LANGUAGE_ENGLISH_NZ,            LANGUAGE_ENGLISH_AUS,       nullptr    
                                   },
+    {   LANGUAGE_ENGLISH_NZ,            LANGUAGE_ENGLISH_AUS,       {}         
                             },
 
     {   PRV_LANGUAGE_FRENCH_PRIM,       LANGUAGE_DONTKNOW,          
spBuiltInFormats_FRENCH                 },
     {   LANGUAGE_FRENCH,                PRV_LANGUAGE_FRENCH_PRIM,   
spBuiltInFormats_FRENCH_FRANCE          },
     {   LANGUAGE_FRENCH_CANADIAN,       PRV_LANGUAGE_FRENCH_PRIM,   
spBuiltInFormats_FRENCH_CANADIAN        },
     {   LANGUAGE_FRENCH_SWISS,          PRV_LANGUAGE_FRENCH_PRIM,   
spBuiltInFormats_FRENCH_SWISS           },
     {   LANGUAGE_FRENCH_BELGIAN,        LANGUAGE_FRENCH,            
spBuiltInFormats_FRENCH_BELGIAN         },
-    {   LANGUAGE_FRENCH_LUXEMBOURG,     LANGUAGE_FRENCH,            nullptr    
                                   },
-    {   LANGUAGE_FRENCH_MONACO,         LANGUAGE_FRENCH,            nullptr    
                                   },
+    {   LANGUAGE_FRENCH_LUXEMBOURG,     LANGUAGE_FRENCH,            {}         
                             },
+    {   LANGUAGE_FRENCH_MONACO,         LANGUAGE_FRENCH,            {}         
                             },
 
     {   PRV_LANGUAGE_GERMAN_PRIM,       LANGUAGE_DONTKNOW,          
spBuiltInFormats_GERMAN                 },
     {   LANGUAGE_GERMAN,                PRV_LANGUAGE_GERMAN_PRIM,   
spBuiltInFormats_GERMAN_GERMANY         },
@@ -1509,22 +1451,19 @@ void XclNumFmtBuffer::InsertBuiltinFormats()
     {
         // put LANGUAGE_SYSTEM for all entries in default table
         LanguageType eLang = ((*aVIt)->meLanguage == LANGUAGE_DONTKNOW) ? 
LANGUAGE_SYSTEM : meSysLang;
-        for( const XclBuiltInFormat* pBuiltIn = (*aVIt)->mpFormats; pBuiltIn 
&& (pBuiltIn->mnXclNumFmt != EXC_FORMAT_NOTFOUND); ++pBuiltIn )
+        for (const XclBuiltInFormat& rBuiltIn : (*aVIt)->maFormats)
         {
-            XclNumFmt& rNumFmt = maFmtMap[ pBuiltIn->mnXclNumFmt ];
+            XclNumFmt& rNumFmt = maFmtMap[rBuiltIn.mnXclNumFmt];
 
-            rNumFmt.meOffset = pBuiltIn->meOffset;
+            rNumFmt.meOffset = rBuiltIn.meOffset;
             rNumFmt.meLanguage = eLang;
 
-            if( pBuiltIn->mpFormat )
-                rNumFmt.maFormat = OUString( pBuiltIn->mpFormat, 
strlen(pBuiltIn->mpFormat), RTL_TEXTENCODING_UTF8 );
-            else
-                rNumFmt.maFormat.clear();
+            rNumFmt.maFormat = rBuiltIn.maFormat;
 
-            if( pBuiltIn->meOffset == PRV_NF_INDEX_REUSE )
-                aReuseMap[ pBuiltIn->mnXclNumFmt ] = pBuiltIn->mnXclReuseFmt;
+            if (rBuiltIn.meOffset == PRV_NF_INDEX_REUSE)
+                aReuseMap[rBuiltIn.mnXclNumFmt] = rBuiltIn.mnXclReuseFmt;
             else
-                aReuseMap.erase( pBuiltIn->mnXclNumFmt );
+                aReuseMap.erase(rBuiltIn.mnXclNumFmt);
         }
     }
 
commit 5a76d9366680dabbc607ac520e741ef8c1c96528
Author:     Mike Kaganski <[email protected]>
AuthorDate: Mon Nov 3 23:49:42 2025 +0500
Commit:     Mike Kaganski <[email protected]>
CommitDate: Sat Nov 8 11:34:15 2025 +0100

    Simplify NumberFormatsBuffer::insertBuiltinFormats and its structures
    
    Change-Id: Ifcab65c1046a9f7f8895c8fb93f8a4e43c6128d2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193614
    Reviewed-by: Mike Kaganski <[email protected]>
    Tested-by: Jenkins

diff --git a/sc/source/filter/inc/numberformatsbuffer.hxx 
b/sc/source/filter/inc/numberformatsbuffer.hxx
index bbd0d4fff20f..7f135af95f86 100644
--- a/sc/source/filter/inc/numberformatsbuffer.hxx
+++ b/sc/source/filter/inc/numberformatsbuffer.hxx
@@ -60,6 +60,10 @@ public:
 
     /** Sets the passed format code. */
     void                setFormatCode( std::u16string_view aFmtCode );
+    /** Sets the passed format code. */
+    void                setFormatCode(
+                            const css::lang::Locale& rLocale,
+                            const OUString& rcFmtCode );
     /** Sets the passed format code, encoded in UTF-8. */
     void                setFormatCode(
                             const css::lang::Locale& rLocale,
diff --git a/sc/source/filter/oox/numberformatsbuffer.cxx 
b/sc/source/filter/oox/numberformatsbuffer.cxx
index 4200a24d3782..93f07b659ea1 100644
--- a/sc/source/filter/oox/numberformatsbuffer.cxx
+++ b/sc/source/filter/oox/numberformatsbuffer.cxx
@@ -60,26 +60,22 @@ namespace {
 struct BuiltinFormat
 {
     sal_Int32           mnNumFmtId;         /// Built-in number format index.
-    const char*         mpcFmtCode;         /// Format string, UTF-8, may be 0 
(mnPredefId is used then).
+    OUString            macFmtCode;         /// Format string, may be empty 
(mnPredefId is used then).
     sal_Int16           mnPredefId;         /// Predefined format index, if 
mpcFmtCode is 0.
     sal_Int32           mnReuseId;          /// Use this format, if mpcFmtCode 
is 0 and mnPredefId is -1.
 };
 
 /** Defines a literal built-in number format. */
 #define NUMFMT_STRING( INDEX, FORMATCODE ) \
-    { INDEX, FORMATCODE, -1, -1 }
+    { INDEX, u"" FORMATCODE ""_ustr, -1, -1 }
 
 /** Defines a built-in number format that maps to an own predefined format. */
 #define NUMFMT_PREDEF( INDEX, PREDEFINED ) \
-    { INDEX, nullptr, css::i18n::NumberFormatIndex::PREDEFINED, -1 }
+    { INDEX, {}, css::i18n::NumberFormatIndex::PREDEFINED, -1 }
 
 /** Defines a built-in number format that is the same as the specified in 
nReuseId. */
 #define NUMFMT_REUSE( INDEX, REUSED_INDEX ) \
-    { INDEX, nullptr, -1, REUSED_INDEX }
-
-/** Terminates a built-in number format table. */
-#define NUMFMT_ENDTABLE() \
-    { -1, nullptr, -1, -1 }
+    { INDEX, {}, -1, REUSED_INDEX }
 
 /** Defines builtin date and time formats 14...22.
     @param SYSTEMDATE  Complete short system date (for formats 14 and 22).
@@ -359,82 +355,82 @@ struct BuiltinFormat
     NUMFMT_ACCOUNTING_OPEN_NUMBER_SYMBOL_CLOSE( 41, SYMBOL, BLINDS, SPACE )
 
 // currency unit characters
-#define UTF8_BAHT           "฿"
-#define UTF8_COLON          "₡"
-#define UTF8_CURR_AR_AE     "د.إ."
-#define UTF8_CURR_AR_BH     "د.ب."
-#define UTF8_CURR_AR_DZ     "د.ج."
-#define UTF8_CURR_AR_EG     "ج.م."
-#define UTF8_CURR_AR_IQ     "د.ع."
-#define UTF8_CURR_AR_JO     "د.ا."
-#define UTF8_CURR_AR_KW     "د.ك."
-#define UTF8_CURR_AR_LB     "ل.ل."
-#define UTF8_CURR_AR_LY     "د.ل."
-#define UTF8_CURR_AR_MA     "د.م."
-#define UTF8_CURR_AR_OM     "ر.ع."
-#define UTF8_CURR_AR_QA     "ر.ق."
-#define UTF8_CURR_AR_SA     "ر.س."
-#define UTF8_CURR_AR_SY     "ل.س."
-#define UTF8_CURR_AR_TN     "د.ت."
-#define UTF8_CURR_AR_YE     "ر.ي."
-#define UTF8_CURR_BN_IN     "টা"
-#define UTF8_CURR_FA_IR     "ريال"
-#define UTF8_CURR_GU_IN     "રૂ"
-#define UTF8_CURR_HI_IN     "रु"
-#define UTF8_CURR_KN_IN     "ರೂ"
-#define UTF8_CURR_ML_IN     "ക"
-#define UTF8_CURR_PA_IN     "ਰੁ"
-#define UTF8_CURR_TA_IN     "ரூ"
-#define UTF8_CURR_TE_IN     "రూ"
-#define UTF8_DONG           "₫"
-#define UTF8_EURO           "€"
-#define UTF8_POUND_GB       "£"
-#define UTF8_RUFIYAA        "ރ"
-#define UTF8_SHEQEL         "₪"
-#define UTF8_TUGRUG         "₮"
-#define UTF8_WON            "₩"
-#define UTF8_YEN_CN         "¥"
-#define UTF8_YEN_JP         "¥"
+#define UTF8_BAHT           "฿"
+#define UTF8_COLON          "₡"
+#define UTF8_CURR_AR_AE     "د.إ."
+#define UTF8_CURR_AR_BH     "د.ب."
+#define UTF8_CURR_AR_DZ     "د.ج."
+#define UTF8_CURR_AR_EG     "ج.م."
+#define UTF8_CURR_AR_IQ     "د.ع."
+#define UTF8_CURR_AR_JO     "د.ا."
+#define UTF8_CURR_AR_KW     "د.ك."
+#define UTF8_CURR_AR_LB     "ل.ل."
+#define UTF8_CURR_AR_LY     "د.ل."
+#define UTF8_CURR_AR_MA     "د.م."
+#define UTF8_CURR_AR_OM     "ر.ع."
+#define UTF8_CURR_AR_QA     "ر.ق."
+#define UTF8_CURR_AR_SA     "ر.س."
+#define UTF8_CURR_AR_SY     "ل.س."
+#define UTF8_CURR_AR_TN     "د.ت."
+#define UTF8_CURR_AR_YE     "ر.ي."
+#define UTF8_CURR_BN_IN     "টা"
+#define UTF8_CURR_FA_IR     "ريال"
+#define UTF8_CURR_GU_IN     "રૂ"
+#define UTF8_CURR_HI_IN     "रु"
+#define UTF8_CURR_KN_IN     "ರೂ"
+#define UTF8_CURR_ML_IN     "ക"
+#define UTF8_CURR_PA_IN     "ਰੁ"
+#define UTF8_CURR_TA_IN     "ரூ"
+#define UTF8_CURR_TE_IN     "రూ"
+#define UTF8_DONG           "₫"
+#define UTF8_EURO           "€"
+#define UTF8_POUND_GB       "£"
+#define UTF8_RUFIYAA        "ރ"
+#define UTF8_SHEQEL         "₪"
+#define UTF8_TUGRUG         "₮"
+#define UTF8_WON            "₩"
+#define UTF8_YEN_CN         "¥"
+#define UTF8_YEN_JP         "¥"
 
 // Unicode characters for currency units
-#define UTF8_CCARON_LC      "č"
-#define UTF8_LSTROKE_LC     "ł"
+#define UTF8_CCARON_LC      "č"
+#define UTF8_LSTROKE_LC     "ł"
 // Armenian
-#define UTF8_HY_DA_LC       "դ"
-#define UTF8_HY_REH_LC      "ր"
+#define UTF8_HY_DA_LC       "դ"
+#define UTF8_HY_REH_LC      "ր"
 // Cyrillic
-#define UTF8_CYR_G_LC       "г"
-#define UTF8_CYR_L_LC       "л"
-#define UTF8_CYR_M_LC       "м"
-#define UTF8_CYR_N_LC       "н"
-#define UTF8_CYR_O_LC       "о"
-#define UTF8_CYR_R_LC       "р"
-#define UTF8_CYR_S_LC       "с"
-#define UTF8_CYR_W_LC       "в"
+#define UTF8_CYR_G_LC       "г"
+#define UTF8_CYR_L_LC       "л"
+#define UTF8_CYR_M_LC       "м"
+#define UTF8_CYR_N_LC       "н"
+#define UTF8_CYR_O_LC       "о"
+#define UTF8_CYR_R_LC       "р"
+#define UTF8_CYR_S_LC       "с"
+#define UTF8_CYR_W_LC       "в"
 
 // Japanese/Chinese date/time characters
-#define UTF8_CJ_YEAR        "年"
-#define UTF8_CJ_MON         "月"
-#define UTF8_CJ_DAY         "日"
-#define UTF8_CJ_HOUR        "時"
-#define UTF8_CJ_MIN         "分"
-#define UTF8_CJ_SEC         "秒"
+#define UTF8_CJ_YEAR        "年"
+#define UTF8_CJ_MON         "月"
+#define UTF8_CJ_DAY         "日"
+#define UTF8_CJ_HOUR        "時"
+#define UTF8_CJ_MIN         "分"
+#define UTF8_CJ_SEC         "秒"
 
 // Chinese Simplified date/time characters
-#define UTF8_CS_YEAR        "年"
-#define UTF8_CS_MON         "月"
-#define UTF8_CS_DAY         "日"
-#define UTF8_CS_HOUR        "时"
-#define UTF8_CS_MIN         "分"
-#define UTF8_CS_SEC         "秒"
+#define UTF8_CS_YEAR        "年"
+#define UTF8_CS_MON         "月"
+#define UTF8_CS_DAY         "日"
+#define UTF8_CS_HOUR        "时"
+#define UTF8_CS_MIN         "分"
+#define UTF8_CS_SEC         "秒"
 
 // Korean date/time characters
-#define UTF8_KO_YEAR        "년"
-#define UTF8_KO_MON         "월"
-#define UTF8_KO_DAY         "일"
-#define UTF8_KO_HOUR        "시"
-#define UTF8_KO_MIN         "분"
-#define UTF8_KO_SEC         "초"
+#define UTF8_KO_YEAR        "년"
+#define UTF8_KO_MON         "월"
+#define UTF8_KO_DAY         "일"
+#define UTF8_KO_HOUR        "시"
+#define UTF8_KO_MIN         "분"
+#define UTF8_KO_SEC         "초"
 
 /** Default number format table. Last parent of all other tables, used for 
unknown locales. */
 const BuiltinFormat spBuiltinFormats_BASE[] =
@@ -528,8 +524,6 @@ const BuiltinFormat spBuiltinFormats_BASE[] =
     NUMFMT_REUSE(   81, 47 ),
 
     // 82...163 not used, must not occur in a file (Excel may crash)
-
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, U.A.E. */
@@ -537,7 +531,6 @@ const BuiltinFormat spBuiltinFormats_ar_AE[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_AE "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Bahrain. */
@@ -545,7 +538,6 @@ const BuiltinFormat spBuiltinFormats_ar_BH[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_BH "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Algeria. */
@@ -553,7 +545,6 @@ const BuiltinFormat spBuiltinFormats_ar_DZ[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_DZ "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Egypt. */
@@ -561,7 +552,6 @@ const BuiltinFormat spBuiltinFormats_ar_EG[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_EG "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Iraq. */
@@ -569,7 +559,6 @@ const BuiltinFormat spBuiltinFormats_ar_IQ[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_IQ "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Jordan. */
@@ -577,7 +566,6 @@ const BuiltinFormat spBuiltinFormats_ar_JO[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_JO "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Kuwait. */
@@ -585,7 +573,6 @@ const BuiltinFormat spBuiltinFormats_ar_KW[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_KW "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Lebanon. */
@@ -593,7 +580,6 @@ const BuiltinFormat spBuiltinFormats_ar_LB[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_LB "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Libya. */
@@ -601,7 +587,6 @@ const BuiltinFormat spBuiltinFormats_ar_LY[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_LY "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Morocco. */
@@ -609,7 +594,6 @@ const BuiltinFormat spBuiltinFormats_ar_MA[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_MA "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Oman. */
@@ -617,7 +601,6 @@ const BuiltinFormat spBuiltinFormats_ar_OM[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_OM "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Qatar. */
@@ -625,7 +608,6 @@ const BuiltinFormat spBuiltinFormats_ar_QA[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_QA "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Saudi Arabia. */
@@ -633,7 +615,6 @@ const BuiltinFormat spBuiltinFormats_ar_SA[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_SA "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Syria. */
@@ -641,7 +622,6 @@ const BuiltinFormat spBuiltinFormats_ar_SY[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_SY "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Tunisia. */
@@ -649,7 +629,6 @@ const BuiltinFormat spBuiltinFormats_ar_TN[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_TN "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Arabic, Yemen. */
@@ -657,7 +636,6 @@ const BuiltinFormat spBuiltinFormats_ar_YE[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_YE "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Belarusian, Belarus. */
@@ -666,7 +644,6 @@ const BuiltinFormat spBuiltinFormats_be_BY[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_CYR_R_LC ".\"", "_" 
UTF8_CYR_R_LC "_.", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Bulgarian, Bulgaria. */
@@ -675,7 +652,6 @@ const BuiltinFormat spBuiltinFormats_bg_BG[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD.M.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_CYR_L_LC UTF8_CYR_W_LC 
"\"", "_" UTF8_CYR_L_LC "_" UTF8_CYR_W_LC, "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Bengali, India. */
@@ -683,7 +659,6 @@ const BuiltinFormat spBuiltinFormats_bn_IN[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_BN_IN "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Czech, Czech Republic. */
@@ -692,7 +667,6 @@ const BuiltinFormat spBuiltinFormats_cs_CZ[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"K" UTF8_CCARON_LC "\"", "_K_" 
UTF8_CCARON_LC, "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Danish, Denmark. */
@@ -700,7 +674,6 @@ const BuiltinFormat spBuiltinFormats_da_DK[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"kr\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** German, Austria. */
@@ -708,7 +681,6 @@ const BuiltinFormat spBuiltinFormats_de_AT[] =
 {
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** German, Switzerland. */
@@ -716,7 +688,6 @@ const BuiltinFormat spBuiltinFormats_de_CH[] =
 {
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ". ", "MMM", " ", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"SFr.\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** German, Germany. */
@@ -724,7 +695,6 @@ const BuiltinFormat spBuiltinFormats_de_DE[] =
 {
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ". ", "MMM", " ", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** German, Liechtenstein. */
@@ -732,7 +702,6 @@ const BuiltinFormat spBuiltinFormats_de_LI[] =
 {
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ". ", "MMM", " ", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"CHF\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** German, Luxembourg. */
@@ -740,7 +709,6 @@ const BuiltinFormat spBuiltinFormats_de_LU[] =
 {
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Divehi, Maldives. */
@@ -748,7 +716,6 @@ const BuiltinFormat spBuiltinFormats_div_MV[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ),
     NUMFMT_ALLCURRENCIES_NUMBER_SYMBOL_MINUS( "\"" UTF8_RUFIYAA ".\"", "_" 
UTF8_RUFIYAA "_.", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Greek, Greece. */
@@ -756,7 +723,6 @@ const BuiltinFormat spBuiltinFormats_el_GR[] =
 {
     NUMFMT_ALLDATETIMES( "D/M/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, Australia. */
@@ -764,7 +730,6 @@ const BuiltinFormat spBuiltinFormats_en_AU[] =
 {
     NUMFMT_ALLDATETIMES( "D/MM/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, Belize. */
@@ -772,7 +737,6 @@ const BuiltinFormat spBuiltinFormats_en_BZ[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"BZ$\"", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, Canada. */
@@ -780,7 +744,6 @@ const BuiltinFormat spBuiltinFormats_en_CA[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, Caribbean. */
@@ -788,7 +751,6 @@ const BuiltinFormat spBuiltinFormats_en_CB[] =
 {
     NUMFMT_ALLDATETIMES( "MM/DD/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, United Kingdom. */
@@ -796,7 +758,6 @@ const BuiltinFormat spBuiltinFormats_en_GB[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_POUND_GB, "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, Ireland. */
@@ -804,7 +765,6 @@ const BuiltinFormat spBuiltinFormats_en_IE[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_EURO, "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, Jamaica. */
@@ -812,7 +772,6 @@ const BuiltinFormat spBuiltinFormats_en_JM[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "\"J$\"", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, New Zealand. */
@@ -820,7 +779,6 @@ const BuiltinFormat spBuiltinFormats_en_NZ[] =
 {
     NUMFMT_ALLDATETIMES( "D/MM/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, Philippines. */
@@ -828,7 +786,6 @@ const BuiltinFormat spBuiltinFormats_en_PH[] =
 {
     NUMFMT_ALLDATETIMES( "M/D/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"Php\"", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, Trinidad and Tobago. */
@@ -836,7 +793,6 @@ const BuiltinFormat spBuiltinFormats_en_TT[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"TT$\"", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, USA. */
@@ -844,7 +800,6 @@ const BuiltinFormat spBuiltinFormats_en_US[] =
 {
     NUMFMT_ALLDATETIMES( "M/D/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, South Africa. */
@@ -852,7 +807,6 @@ const BuiltinFormat spBuiltinFormats_en_ZA[] =
 {
     NUMFMT_ALLDATETIMES( "YYYY/MM/DD", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\R", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** English, Zimbabwe. */
@@ -860,7 +814,6 @@ const BuiltinFormat spBuiltinFormats_en_ZW[] =
 {
     NUMFMT_ALLDATETIMES( "M/D/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"Z$\"", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Argentina. */
@@ -868,7 +821,6 @@ const BuiltinFormat spBuiltinFormats_es_AR[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "$", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Bolivia. */
@@ -877,7 +829,6 @@ const BuiltinFormat spBuiltinFormats_es_BO[] =
     // slashes must be quoted to prevent conversion to minus
     NUMFMT_ALLDATETIMES( "DD\/MM\/YYYY", "DD", "-", "MMM", "-", "YY", "hh", 
"hh" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"$b\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Chile. */
@@ -885,7 +836,6 @@ const BuiltinFormat spBuiltinFormats_es_CL[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Colombia. */
@@ -893,7 +843,6 @@ const BuiltinFormat spBuiltinFormats_es_CO[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Costa Rica. */
@@ -901,7 +850,6 @@ const BuiltinFormat spBuiltinFormats_es_CR[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( UTF8_COLON, "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Dominican Republic. */
@@ -909,7 +857,6 @@ const BuiltinFormat spBuiltinFormats_es_DO[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"RD$\"", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Ecuador. */
@@ -917,7 +864,6 @@ const BuiltinFormat spBuiltinFormats_es_EC[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Spain. */
@@ -925,7 +871,6 @@ const BuiltinFormat spBuiltinFormats_es_ES[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Guatemala. */
@@ -933,7 +878,6 @@ const BuiltinFormat spBuiltinFormats_es_GT[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\Q", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Honduras. */
@@ -942,7 +886,6 @@ const BuiltinFormat spBuiltinFormats_es_HN[] =
     // slashes must be quoted to prevent conversion to minus
     NUMFMT_ALLDATETIMES( "DD\/MM\/YYYY", "DD", "-", "MMM", "-", "YY", "hh", 
"hh" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"L.\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Mexico. */
@@ -950,7 +893,6 @@ const BuiltinFormat spBuiltinFormats_es_MX[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Nicaragua. */
@@ -959,7 +901,6 @@ const BuiltinFormat spBuiltinFormats_es_NI[] =
     // slashes must be quoted to prevent conversion to minus
     NUMFMT_ALLDATETIMES( "DD\/MM\/YYYY", "DD", "-", "MMM", "-", "YY", "hh", 
"hh" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"C$\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Panama. */
@@ -967,7 +908,6 @@ const BuiltinFormat spBuiltinFormats_es_PA[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"B/.\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Peru. */
@@ -975,7 +915,6 @@ const BuiltinFormat spBuiltinFormats_es_PE[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"S/.\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Puerto Rico. */
@@ -984,7 +923,6 @@ const BuiltinFormat spBuiltinFormats_es_PR[] =
     // slashes must be quoted to prevent conversion to minus
     NUMFMT_ALLDATETIMES( "DD\/MM\/YYYY", "DD", "-", "MMM", "-", "YY", "hh", 
"hh" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Paraguay. */
@@ -992,7 +930,6 @@ const BuiltinFormat spBuiltinFormats_es_PY[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"Gs\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, El Salvador. */
@@ -1001,7 +938,6 @@ const BuiltinFormat spBuiltinFormats_es_SV[] =
     // slashes must be quoted to prevent conversion to minus
     NUMFMT_ALLDATETIMES( "DD\/MM\/YYYY", "DD", "-", "MMM", "-", "YY", "hh", 
"hh" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Uruguay. */
@@ -1009,7 +945,6 @@ const BuiltinFormat spBuiltinFormats_es_UY[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"$U\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Spanish, Venezuela. */
@@ -1017,7 +952,6 @@ const BuiltinFormat spBuiltinFormats_es_VE[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "Bs", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Estonian, Estonia. */
@@ -1026,7 +960,6 @@ const BuiltinFormat spBuiltinFormats_et_EE[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "D.MM.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"kr\"", "_k_r", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Farsi, Iran. */
@@ -1034,7 +967,6 @@ const BuiltinFormat spBuiltinFormats_fa_IR[] =
 {
     NUMFMT_ALLDATETIMES( "YYYY/MM/DD", "DD", "-", "MMM", "-", "YY", "hh", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_FA_IR "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Finnish, Finland. */
@@ -1045,7 +977,6 @@ const BuiltinFormat spBuiltinFormats_fi_FI[] =
     NUMFMT_STRING( 10, "0.00\ %" ),
     NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Faroese, Faroe Islands. */
@@ -1053,7 +984,6 @@ const BuiltinFormat spBuiltinFormats_fo_FO[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"kr\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** French, Belgium. */
@@ -1061,7 +991,6 @@ const BuiltinFormat spBuiltinFormats_fr_BE[] =
 {
     NUMFMT_ALLDATETIMES( "D/MM/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** French, Canada. */
@@ -1070,7 +999,6 @@ const BuiltinFormat spBuiltinFormats_fr_CA[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "YYYY-MM-DD", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_OPEN_NUMBER_SYMBOL_CLOSE( "$", "_$", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** French, Switzerland. */
@@ -1078,7 +1006,6 @@ const BuiltinFormat spBuiltinFormats_fr_CH[] =
 {
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"SFr.\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** French, France. */
@@ -1087,7 +1014,6 @@ const BuiltinFormat spBuiltinFormats_fr_FR[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** French, Luxembourg. */
@@ -1096,7 +1022,6 @@ const BuiltinFormat spBuiltinFormats_fr_LU[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** French, Monaco. */
@@ -1105,7 +1030,6 @@ const BuiltinFormat spBuiltinFormats_fr_MC[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Galizian, Spain. */
@@ -1113,7 +1037,6 @@ const BuiltinFormat spBuiltinFormats_gl_ES[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Gujarati, India. */
@@ -1121,7 +1044,6 @@ const BuiltinFormat spBuiltinFormats_gu_IN[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_GU_IN "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Hebrew, Israel. */
@@ -1129,7 +1051,6 @@ const BuiltinFormat spBuiltinFormats_he_IL[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( UTF8_SHEQEL, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Hindi, India. */
@@ -1137,7 +1058,6 @@ const BuiltinFormat spBuiltinFormats_hi_IN[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_HI_IN "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Croatian, Bosnia and Herzegowina. */
@@ -1145,7 +1065,6 @@ const BuiltinFormat spBuiltinFormats_hr_BA[] =
 {
     NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"KM\"", "_K_M", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Croatian, Croatia. */
@@ -1153,7 +1072,6 @@ const BuiltinFormat spBuiltinFormats_hr_HR[] =
 {
     NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"kn\"", "_k_n", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Hungarian, Hungary. */
@@ -1163,7 +1081,6 @@ const BuiltinFormat spBuiltinFormats_hu_HU[] =
     // MMM is rendered differently in Calc and Excel (see #i41488#)
     NUMFMT_ALLDATETIMES( "YYYY.MM.DD", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"Ft\"", "_F_t", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Armenian, Armenia. */
@@ -1171,7 +1088,6 @@ const BuiltinFormat spBuiltinFormats_hy_AM[] =
 {
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_HY_DA_LC 
UTF8_HY_REH_LC ".\"", "_" UTF8_HY_DA_LC "_" UTF8_HY_REH_LC "_.", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Indonesian, Indonesia. */
@@ -1179,7 +1095,6 @@ const BuiltinFormat spBuiltinFormats_id_ID[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"Rp\"", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Icelandic, Iceland. */
@@ -1187,7 +1102,6 @@ const BuiltinFormat spBuiltinFormats_is_IS[] =
 {
     NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "hh" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"kr.\"", "_k_r_.", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Italian, Switzerland. */
@@ -1195,7 +1109,6 @@ const BuiltinFormat spBuiltinFormats_it_CH[] =
 {
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"SFr.\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Italian, Italy. */
@@ -1203,7 +1116,6 @@ const BuiltinFormat spBuiltinFormats_it_IT[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Georgian, Georgia. */
@@ -1212,7 +1124,6 @@ const BuiltinFormat spBuiltinFormats_ka_GE[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"Lari\"", "_L_a_r_i", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Kazakh, Kazakhstan. */
@@ -1221,7 +1132,6 @@ const BuiltinFormat spBuiltinFormats_kk_KZ[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "\T", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Kannada, India. */
@@ -1229,7 +1139,6 @@ const BuiltinFormat spBuiltinFormats_kn_IN[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_KN_IN "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Kyrgyz, Kyrgyzstan. */
@@ -1238,7 +1147,6 @@ const BuiltinFormat spBuiltinFormats_ky_KG[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD.MM.YY", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_CYR_S_LC UTF8_CYR_O_LC 
UTF8_CYR_M_LC "\"", "_" UTF8_CYR_S_LC "_" UTF8_CYR_O_LC "_" UTF8_CYR_M_LC, "\ " 
),
-    NUMFMT_ENDTABLE()
 };
 
 /** Lithuanian, Lithuania. */
@@ -1246,7 +1154,6 @@ const BuiltinFormat spBuiltinFormats_lt_LT[] =
 {
     NUMFMT_ALLDATETIMES( "YYYY.MM.DD", "DD", ".", "MMM", ".", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"Lt\"", "_L_t", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Latvian, Latvia. */
@@ -1255,7 +1162,6 @@ const BuiltinFormat spBuiltinFormats_lv_LV[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "YYYY.MM.DD", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "\"Ls\"", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Malayalam, India. */
@@ -1263,7 +1169,6 @@ const BuiltinFormat spBuiltinFormats_ml_IN[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_ML_IN "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Mongolian, Mongolia. */
@@ -1271,7 +1176,6 @@ const BuiltinFormat spBuiltinFormats_mn_MN[] =
 {
     NUMFMT_ALLDATETIMES( "YY.MM.DD", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_TUGRUG, "_" UTF8_TUGRUG, "" 
),
-    NUMFMT_ENDTABLE()
 };
 
 /** Malay, Brunei Darussalam. */
@@ -1279,7 +1183,6 @@ const BuiltinFormat spBuiltinFormats_ms_BN[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Malay, Malaysia. */
@@ -1287,7 +1190,6 @@ const BuiltinFormat spBuiltinFormats_ms_MY[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\R", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Maltese, Malta. */
@@ -1295,7 +1197,6 @@ const BuiltinFormat spBuiltinFormats_mt_MT[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "\"Lm\"", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Dutch, Belgium. */
@@ -1304,7 +1205,6 @@ const BuiltinFormat spBuiltinFormats_nl_BE[] =
     // slashes must be quoted to prevent conversion to minus
     NUMFMT_ALLDATETIMES( "D\/MM\/YYYY", "D", "\/", "MMM", "\/", "YY", "h", "h" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Dutch, Netherlands. */
@@ -1312,7 +1212,6 @@ const BuiltinFormat spBuiltinFormats_nl_NL[] =
 {
     NUMFMT_ALLDATETIMES( "D-M-YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Norwegian (Bokmal and Nynorsk), Norway. */
@@ -1321,7 +1220,6 @@ const BuiltinFormat spBuiltinFormats_no_NO[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"kr\"", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Punjabi, India. */
@@ -1329,7 +1227,6 @@ const BuiltinFormat spBuiltinFormats_pa_IN[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_PA_IN "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Polish, Poland. */
@@ -1339,7 +1236,6 @@ const BuiltinFormat spBuiltinFormats_pl_PL[] =
     // MMM is rendered differently in Calc and Excel (see #i72300#)
     NUMFMT_ALLDATETIMES( "YYYY-MM-DD", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"z" UTF8_LSTROKE_LC "\"", 
"_z_" UTF8_LSTROKE_LC, "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Portuguese, Brazil. */
@@ -1347,7 +1243,6 @@ const BuiltinFormat spBuiltinFormats_pt_BR[] =
 {
     NUMFMT_ALLDATETIMES( "D/M/YYYY", "D", "/", "MMM", "/", "YY", "h", "hh" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"R$\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Portuguese, Portugal. */
@@ -1355,7 +1250,6 @@ const BuiltinFormat spBuiltinFormats_pt_PT[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Romanian, Romania. */
@@ -1364,7 +1258,6 @@ const BuiltinFormat spBuiltinFormats_ro_RO[] =
     // space character is group separator, literal spaces must be quoted (but 
see #i75367#)
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"lei\"", "_l_e_i", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Russian, Russian Federation. */
@@ -1373,7 +1266,6 @@ const BuiltinFormat spBuiltinFormats_ru_RU[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_CYR_R_LC ".\"", "_" 
UTF8_CYR_R_LC "_.", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Slovak, Slovakia. */
@@ -1382,7 +1274,6 @@ const BuiltinFormat spBuiltinFormats_sk_SK[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"Sk\"", "_S_k", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Slovenian, Slovenia. */
@@ -1390,7 +1281,6 @@ const BuiltinFormat spBuiltinFormats_sl_SI[] =
 {
     NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"SIT\"", "_S_I_T", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Swedish, Finland. */
@@ -1401,7 +1291,6 @@ const BuiltinFormat spBuiltinFormats_sv_FI[] =
     NUMFMT_STRING( 10, "0.00\ %" ),
     NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "hh" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Swedish, Sweden. */
@@ -1410,7 +1299,6 @@ const BuiltinFormat spBuiltinFormats_sv_SE[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "YYYY-MM-DD", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"kr\"", "_k_r", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Swahili, Tanzania. */
@@ -1418,7 +1306,6 @@ const BuiltinFormat spBuiltinFormats_sw_TZ[] =
 {
     NUMFMT_ALLDATETIMES( "M/D/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\S", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Tamil, India. */
@@ -1426,7 +1313,6 @@ const BuiltinFormat spBuiltinFormats_ta_IN[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_TA_IN "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Telugu, India. */
@@ -1434,7 +1320,6 @@ const BuiltinFormat spBuiltinFormats_te_IN[] =
 {
     NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_TE_IN "\"", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Thai, Thailand. */
@@ -1462,7 +1347,6 @@ const BuiltinFormat spBuiltinFormats_th_TH[] =
     NUMFMT_STRING( 79, "t[h]:mm:ss" ),
     NUMFMT_STRING( 80, "tmm:ss.0" ),
     NUMFMT_STRING( 81, "D/M/E" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Turkish, Turkey. */
@@ -1470,7 +1354,6 @@ const BuiltinFormat spBuiltinFormats_tr_TR[] =
 {
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" 
),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"TL\"", "_T_L", " " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Tatar, Russian Federation. */
@@ -1479,7 +1362,6 @@ const BuiltinFormat spBuiltinFormats_tt_RU[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_CYR_R_LC ".\"", "_" 
UTF8_CYR_R_LC "_.", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Ukrainian, Ukraine. */
@@ -1488,7 +1370,6 @@ const BuiltinFormat spBuiltinFormats_uk_UA[] =
     // space character is group separator, literal spaces must be quoted
     NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_CYR_G_LC UTF8_CYR_R_LC 
UTF8_CYR_N_LC ".\"", "_" UTF8_CYR_G_LC "_" UTF8_CYR_R_LC "_" UTF8_CYR_N_LC 
"_.", "\ " ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Urdu, Pakistan. */
@@ -1496,7 +1377,6 @@ const BuiltinFormat spBuiltinFormats_ur_PK[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"Rs\"", "" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Vietnamese, Viet Nam. */
@@ -1504,7 +1384,6 @@ const BuiltinFormat spBuiltinFormats_vi_VN[] =
 {
     NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ),
     NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_DONG, "_" UTF8_DONG, " " ),
-    NUMFMT_ENDTABLE()
 };
 
 // CJK ------------------------------------------------------------------------
@@ -1523,7 +1402,6 @@ const BuiltinFormat spBuiltinFormats_CJK[] =
     NUMFMT_REUSE( 56, 35 ),
     NUMFMT_REUSE( 57, 27 ),
     NUMFMT_REUSE( 58, 28 ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Japanese, Japan. */
@@ -1539,7 +1417,6 @@ const BuiltinFormat spBuiltinFormats_ja_JP[] =
     NUMFMT_TIME_CJK( 32, "h", UTF8_CJ_HOUR, UTF8_CJ_MIN, UTF8_CJ_SEC ),
     NUMFMT_STRING( 34, "YYYY\"" UTF8_CJ_YEAR "\"MM\"" UTF8_CJ_MON "\"" ),
     NUMFMT_STRING( 35, "MM\"" UTF8_CJ_MON "\"DD\"" UTF8_CJ_DAY "\"" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Korean, South Korea. */
@@ -1556,7 +1433,6 @@ const BuiltinFormat spBuiltinFormats_ko_KR[] =
     // slashes must be quoted to prevent conversion to minus
     NUMFMT_STRING( 34, "YYYY\/MM\/DD" ),
     NUMFMT_REUSE( 35, 14 ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Chinese, China. */
@@ -1572,7 +1448,6 @@ const BuiltinFormat spBuiltinFormats_zh_CN[] =
     NUMFMT_STRING( 31, "YYYY\"" UTF8_CS_YEAR "\"M\"" UTF8_CS_MON "\"D\"" 
UTF8_CS_DAY "\"" ),
     NUMFMT_REUSE( 52, 27 ),
     NUMFMT_REUSE( 53, 28 ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Chinese, Hong Kong. */
@@ -1586,7 +1461,6 @@ const BuiltinFormat spBuiltinFormats_zh_HK[] =
     NUMFMT_STRING( 28, "[$-404]D\"" UTF8_CJ_DAY "\"M\"" UTF8_CJ_MON "\"E\"" 
UTF8_CJ_YEAR "\"" ),
     NUMFMT_STRING( 30, "M/D/YY" ),
     NUMFMT_STRING( 31, "D\"" UTF8_CJ_DAY "\"M\"" UTF8_CJ_MON "\"YYYY\"" 
UTF8_CJ_YEAR "\"" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Chinese, Macau. */
@@ -1600,7 +1474,6 @@ const BuiltinFormat spBuiltinFormats_zh_MO[] =
     NUMFMT_STRING( 28, "[$-404]D\"" UTF8_CJ_DAY "\"M\"" UTF8_CJ_MON "\"E\"" 
UTF8_CJ_YEAR "\"" ),
     NUMFMT_STRING( 30, "M/D/YY" ),
     NUMFMT_STRING( 31, "D\"" UTF8_CJ_DAY "\"M\"" UTF8_CJ_MON "\"YYYY\"" 
UTF8_CJ_YEAR "\"" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Chinese, Singapore. */
@@ -1614,7 +1487,6 @@ const BuiltinFormat spBuiltinFormats_zh_SG[] =
     NUMFMT_STRING( 28, "M\"" UTF8_CS_MON "\"D\"" UTF8_CS_DAY "\"" ),
     NUMFMT_STRING( 30, "M/D/YY" ),
     NUMFMT_STRING( 31, "D\"" UTF8_CS_DAY "\"M\"" UTF8_CS_MON "\"YYYY\"" 
UTF8_CS_YEAR "\"" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Chinese, Taiwan. */
@@ -1628,164 +1500,163 @@ const BuiltinFormat spBuiltinFormats_zh_TW[] =
     NUMFMT_STRING( 28, "[$-404]E\"" UTF8_CJ_YEAR "\"M\"" UTF8_CJ_MON "\"D\"" 
UTF8_CJ_DAY "\"" ),
     NUMFMT_STRING( 30, "M/D/YY" ),
     NUMFMT_STRING( 31, "YYYY\"" UTF8_CJ_YEAR "\"M\"" UTF8_CJ_MON "\"D\"" 
UTF8_CJ_DAY "\"" ),
-    NUMFMT_ENDTABLE()
 };
 
 /** Specifies a built-in number format table for a specific locale. */
 struct BuiltinFormatTable
 {
-    const char*          mpcLocale;          /// The locale for this table.
-    const char*          mpcParent;          /// The locale of the parent 
table.
-    const BuiltinFormat* mpFormats;         /// The number format table (may 
be 0, if equal to parent).
+    OUString                       macLocale; /// The locale for this table.
+    OUString                       macParent; /// The locale of the parent 
table.
+    std::span<const BuiltinFormat> maFormats; /// The number format table (may 
be 0, if equal to parent).
 };
 
-const BuiltinFormatTable spBuiltinFormatTables[] =
+constexpr BuiltinFormatTable spBuiltinFormatTables[] =
 { //  locale    parent      format table
-    { "*",      "",         spBuiltinFormats_BASE   },  // Base table
-    { "af-ZA",  "*",        spBuiltinFormats_en_ZA  },  // Afrikaans, South 
Africa
-    { "ar-AE",  "*",        spBuiltinFormats_ar_AE  },  // Arabic, U.A.E.
-    { "ar-BH",  "*",        spBuiltinFormats_ar_BH  },  // Arabic, Bahrain
-    { "ar-DZ",  "*",        spBuiltinFormats_ar_DZ  },  // Arabic, Algeria
-    { "ar-EG",  "*",        spBuiltinFormats_ar_EG  },  // Arabic, Egypt
-    { "ar-IQ",  "*",        spBuiltinFormats_ar_IQ  },  // Arabic, Iraq
-    { "ar-JO",  "*",        spBuiltinFormats_ar_JO  },  // Arabic, Jordan
-    { "ar-KW",  "*",        spBuiltinFormats_ar_KW  },  // Arabic, Kuwait
-    { "ar-LB",  "*",        spBuiltinFormats_ar_LB  },  // Arabic, Lebanon
-e 
... etc. - the rest is truncated

Reply via email to