1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #include "oox/xls/numberformatsbuffer.hxx" 25 26 #include <com/sun/star/container/XNameAccess.hpp> 27 #include <com/sun/star/i18n/NumberFormatIndex.hpp> 28 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 29 #include <com/sun/star/util/XNumberFormatTypes.hpp> 30 #include <com/sun/star/util/XNumberFormats.hpp> 31 #include <com/sun/star/util/XNumberFormatsSupplier.hpp> 32 #include <rtl/strbuf.hxx> 33 #include <rtl/string.hxx> 34 #include <osl/thread.h> 35 #include <rtl/ustrbuf.hxx> 36 #include "oox/core/filterbase.hxx" 37 #include "oox/helper/attributelist.hxx" 38 #include "oox/helper/propertymap.hxx" 39 #include "oox/xls/biffinputstream.hxx" 40 41 namespace oox { 42 namespace xls { 43 44 // ============================================================================ 45 46 using namespace ::com::sun::star::container; 47 using namespace ::com::sun::star::lang; 48 using namespace ::com::sun::star::uno; 49 using namespace ::com::sun::star::util; 50 51 using ::rtl::OString; 52 using ::rtl::OStringBuffer; 53 using ::rtl::OStringToOUString; 54 using ::rtl::OUString; 55 using ::rtl::OUStringBuffer; 56 57 // ============================================================================ 58 59 namespace { 60 61 /** Stores the number format used in Calc for an Excel built-in number format. */ 62 struct BuiltinFormat 63 { 64 sal_Int32 mnNumFmtId; /// Built-in number format index. 65 const sal_Char* mpcFmtCode; /// Format string, UTF-8, may be 0 (mnPredefId is used then). 66 sal_Int16 mnPredefId; /// Predefined format index, if mpcFmtCode is 0. 67 sal_Int32 mnReuseId; /// Use this format, if mpcFmtCode is 0 and mnPredefId is -1. 68 }; 69 70 /** Defines a literal built-in number format. */ 71 #define NUMFMT_STRING( INDEX, FORMATCODE ) \ 72 { INDEX, FORMATCODE, -1, -1 } 73 74 /** Defines a built-in number format that maps to an own predefined format. */ 75 #define NUMFMT_PREDEF( INDEX, PREDEFINED ) \ 76 { INDEX, 0, ::com::sun::star::i18n::NumberFormatIndex::PREDEFINED, -1 } 77 78 /** Defines a built-in number format that is the same as the specified in nReuseId. */ 79 #define NUMFMT_REUSE( INDEX, REUSED_INDEX ) \ 80 { INDEX, 0, -1, REUSED_INDEX } 81 82 /** Terminates a built-in number format table. */ 83 #define NUMFMT_ENDTABLE() \ 84 { -1, 0, -1, -1 } 85 86 /** Defines builtin date and time formats 14...22. 87 @param SYSTEMDATE Complete short system date (for formats 14 and 22). 88 @param DAY Day format (for formats 15 and 16). 89 @param DAYSEP Separator between day and month (for formats 15 and 16). 90 @param MONTH Month format (for formats 15...17). 91 @param MONTHSEP Separator between month and year (for formats 15 and 17). 92 @param YEAR Year format (for formats 15 and 17). 93 @param HOUR12 Hour format for 12-hour AM/PM formats (formats 18 and 19). 94 @param HOUR24 Hour format for 24-hour formats (formats 20...22). */ 95 #define NUMFMT_ALLDATETIMES( SYSTEMDATE, DAY, DAYSEP, MONTH, MONTHSEP, YEAR, HOUR12, HOUR24 ) \ 96 NUMFMT_STRING( 14, SYSTEMDATE ), \ 97 NUMFMT_STRING( 15, DAY DAYSEP MONTH MONTHSEP YEAR ), \ 98 NUMFMT_STRING( 16, DAY DAYSEP MONTH ), \ 99 NUMFMT_STRING( 17, MONTH MONTHSEP YEAR ), \ 100 NUMFMT_STRING( 18, HOUR12 ":mm AM/PM" ), \ 101 NUMFMT_STRING( 19, HOUR12 ":mm:ss AM/PM" ), \ 102 NUMFMT_STRING( 20, HOUR24 ":mm" ), \ 103 NUMFMT_STRING( 21, HOUR24 ":mm:ss" ), \ 104 NUMFMT_STRING( 22, SYSTEMDATE " " HOUR24 ":mm" ) 105 106 /** Defines builtin time formats INDEX and INDEX+1 for CJK locales. 107 @param INDEX First number format index. 108 @param HOURFORMAT Hour format. 109 @param HOUR Hour symbol. 110 @param MINUTE Minute symbol. 111 @param SECOND Second symbol. */ 112 #define NUMFMT_TIME_CJK( INDEX, HOURFORMAT, HOUR, MINUTE, SECOND ) \ 113 NUMFMT_STRING( INDEX + 0, HOURFORMAT "\"" HOUR "\"mm\"" MINUTE "\"" ), \ 114 NUMFMT_STRING( INDEX + 1, HOURFORMAT "\"" HOUR "\"mm\"" MINUTE "\"ss\"" SECOND "\"" ) 115 116 /** Defines builtin time formats 32...35 for CJK locales. 117 @param HOUR12 Hour format for 12-hour AM/PM formats (formats 34 and 35). 118 @param HOUR24 Hour format for 24-hour formats (formats 32 and 33). 119 @param HOUR Hour symbol. 120 @param MINUTE Minute symbol. 121 @param SECOND Second symbol. */ 122 #define NUMFMT_ALLTIMES_CJK( HOUR12, HOUR24, HOUR, MINUTE, SECOND ) \ 123 NUMFMT_TIME_CJK( 32, HOUR24, HOUR, MINUTE, SECOND ), \ 124 NUMFMT_TIME_CJK( 34, "AM/PM" HOUR12, HOUR, MINUTE, SECOND ) 125 126 /** Defines builtin currency formats INDEX...INDEX+3 in the following format: 127 "symbol, [minus], number". 128 @param INDEX First number format index. 129 @param SYMBOL Currency symbol. 130 @param SPACE Space character(s) between currency symbol and number. 131 @param MODIF Leading modifier for each portion (e.g. "t" for Thai formats). */ 132 #define NUMFMT_CURRENCY_SYMBOL_MINUS_NUMBER( INDEX, SYMBOL, SPACE, MODIF ) \ 133 NUMFMT_STRING( INDEX + 0, MODIF SYMBOL SPACE "#,##0;" MODIF SYMBOL SPACE "-#,##0" ), \ 134 NUMFMT_STRING( INDEX + 1, MODIF SYMBOL SPACE "#,##0;" "[RED]" MODIF SYMBOL SPACE "-#,##0" ), \ 135 NUMFMT_STRING( INDEX + 2, MODIF SYMBOL SPACE "#,##0.00;" MODIF SYMBOL SPACE "-#,##0.00" ), \ 136 NUMFMT_STRING( INDEX + 3, MODIF SYMBOL SPACE "#,##0.00;" "[RED]" MODIF SYMBOL SPACE "-#,##0.00" ) 137 138 /** Defines builtin accounting formats INDEX...INDEX+3 in the following format: 139 "symbol, [minus], number". 140 @param INDEX First number format index. 141 @param SYMBOL Currency symbol. 142 @param SPACE Space character(s) between currency symbol and number. */ 143 #define NUMFMT_ACCOUNTING_SYMBOL_MINUS_NUMBER( INDEX, SYMBOL, SPACE ) \ 144 NUMFMT_STRING( INDEX + 0, "_ " "* #,##0_ ;" "_ " "* -#,##0_ ;" "_ " "* \"-\"_ ;" "_ @_ " ), \ 145 NUMFMT_STRING( INDEX + 1, "_ " SYMBOL SPACE "* #,##0_ ;" "_ " SYMBOL SPACE "* -#,##0_ ;" "_ " SYMBOL SPACE "* \"-\"_ ;" "_ @_ " ), \ 146 NUMFMT_STRING( INDEX + 2, "_ " "* #,##0.00_ ;" "_ " "* -#,##0.00_ ;" "_ " "* \"-\"?\?_ ;" "_ @_ " ), \ 147 NUMFMT_STRING( INDEX + 3, "_ " SYMBOL SPACE "* #,##0.00_ ;" "_ " SYMBOL SPACE "* -#,##0.00_ ;" "_ " SYMBOL SPACE "* \"-\"?\?_ ;" "_ @_ " ) 148 149 /** Defines builtin currency formats 5...8 (with currency symbol), 37...40 150 (blind currency symbol), and 41...44 (accounting), in the following format: 151 "symbol, [minus], number". 152 @param SYMBOL Currency symbol. 153 @param SPACE Space character(s) between currency symbol and number. */ 154 #define NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( SYMBOL, SPACE ) \ 155 NUMFMT_CURRENCY_SYMBOL_MINUS_NUMBER( 5, SYMBOL, SPACE, "" ), \ 156 NUMFMT_CURRENCY_SYMBOL_MINUS_NUMBER( 37, "", "", "" ), \ 157 NUMFMT_ACCOUNTING_SYMBOL_MINUS_NUMBER( 41, SYMBOL, SPACE ) 158 159 /** Defines builtin currency formats INDEX...INDEX+3 in the following format: 160 "symbol, number, [minus]". 161 @param INDEX First number format index. 162 @param SYMBOL Currency symbol. 163 @param SPACE Space character(s) between currency symbol and number. 164 @param MODIF Leading modifier for each portion (e.g. "t" for Thai formats). */ 165 #define NUMFMT_CURRENCY_SYMBOL_NUMBER_MINUS( INDEX, SYMBOL, SPACE, MODIF ) \ 166 NUMFMT_STRING( INDEX + 0, MODIF SYMBOL SPACE "#,##0_-;" MODIF SYMBOL SPACE "#,##0-" ), \ 167 NUMFMT_STRING( INDEX + 1, MODIF SYMBOL SPACE "#,##0_-;" "[RED]" MODIF SYMBOL SPACE "#,##0-" ), \ 168 NUMFMT_STRING( INDEX + 2, MODIF SYMBOL SPACE "#,##0.00_-;" MODIF SYMBOL SPACE "#,##0.00-" ), \ 169 NUMFMT_STRING( INDEX + 3, MODIF SYMBOL SPACE "#,##0.00_-;" "[RED]" MODIF SYMBOL SPACE "#,##0.00-" ) 170 171 /** Defines builtin accounting formats INDEX...INDEX+3 in the following format: 172 "symbol, number, [minus]". 173 @param INDEX First number format index. 174 @param SYMBOL Currency symbol. 175 @param SPACE Space character(s) between currency symbol and number. */ 176 #define NUMFMT_ACCOUNTING_SYMBOL_NUMBER_MINUS( INDEX, SYMBOL, SPACE ) \ 177 NUMFMT_STRING( INDEX + 0, "_-" "* #,##0_-;" "_-" "* #,##0-;" "_-" "* \"-\"_-;" "_-@_-" ), \ 178 NUMFMT_STRING( INDEX + 1, "_-" SYMBOL SPACE "* #,##0_-;" "_-" SYMBOL SPACE "* #,##0-;" "_-" SYMBOL SPACE "* \"-\"_-;" "_-@_-" ), \ 179 NUMFMT_STRING( INDEX + 2, "_-" "* #,##0.00_-;" "_-" "* #,##0.00-;" "_-" "* \"-\"?\?_-;" "_-@_-" ), \ 180 NUMFMT_STRING( INDEX + 3, "_-" SYMBOL SPACE "* #,##0.00_-;" "_-" SYMBOL SPACE "* #,##0.00-;" "_-" SYMBOL SPACE "* \"-\"?\?_-;" "_-@_-" ) 181 182 /** Defines builtin currency formats 5...8 (with currency symbol), 37...40 183 (blind currency symbol), and 41...44 (accounting), in the following format: 184 "symbol, number, [minus]". 185 @param SYMBOL Currency symbol. 186 @param SPACE Space character(s) between currency symbol and number. */ 187 #define NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( SYMBOL, SPACE ) \ 188 NUMFMT_CURRENCY_SYMBOL_NUMBER_MINUS( 5, SYMBOL, SPACE, "" ), \ 189 NUMFMT_CURRENCY_SYMBOL_NUMBER_MINUS( 37, "", "", "" ), \ 190 NUMFMT_ACCOUNTING_SYMBOL_NUMBER_MINUS( 41, SYMBOL, SPACE ) 191 192 /** Defines builtin currency formats INDEX...INDEX+3 in the following format: 193 "number, symbol, [minus]". 194 @param INDEX First number format index. 195 @param SYMBOL Currency symbol. 196 @param SPACE Space character(s) between number and currency symbol. 197 @param MODIF Leading modifier for each portion (e.g. "t" for Thai formats). */ 198 #define NUMFMT_CURRENCY_NUMBER_SYMBOL_MINUS( INDEX, SYMBOL, SPACE, MODIF ) \ 199 NUMFMT_STRING( INDEX + 0, MODIF "#,##0" SPACE SYMBOL "_-;" MODIF "#,##0" SPACE SYMBOL "-" ), \ 200 NUMFMT_STRING( INDEX + 1, MODIF "#,##0" SPACE SYMBOL "_-;" "[RED]" MODIF "#,##0" SPACE SYMBOL "-" ), \ 201 NUMFMT_STRING( INDEX + 2, MODIF "#,##0.00" SPACE SYMBOL "_-;" MODIF "#,##0.00" SPACE SYMBOL "-" ), \ 202 NUMFMT_STRING( INDEX + 3, MODIF "#,##0.00" SPACE SYMBOL "_-;" "[RED]" MODIF "#,##0.00" SPACE SYMBOL "-" ) 203 204 /** Defines builtin accounting formats INDEX...INDEX+3 in the following format: 205 "number, symbol, [minus]". 206 @param INDEX First number format index. 207 @param SYMBOL Currency symbol. 208 @param BLINDS Blind currency symbol. 209 @param SPACE Space character(s) between number and currency symbol. */ 210 #define NUMFMT_ACCOUNTING_NUMBER_SYMBOL_MINUS( INDEX, SYMBOL, BLINDS, SPACE ) \ 211 NUMFMT_STRING( INDEX + 0, "_-* #,##0" SPACE BLINDS "_-;_-* #,##0" SPACE BLINDS "-;_-* \"-\"" SPACE BLINDS "_-;_-@_-" ), \ 212 NUMFMT_STRING( INDEX + 1, "_-* #,##0" SPACE SYMBOL "_-;_-* #,##0" SPACE SYMBOL "-;_-* \"-\"" SPACE SYMBOL "_-;_-@_-" ), \ 213 NUMFMT_STRING( INDEX + 2, "_-* #,##0.00" SPACE BLINDS "_-;_-* #,##0.00" SPACE BLINDS "-;_-* \"-\"?\?" SPACE BLINDS "_-;_-@_-" ), \ 214 NUMFMT_STRING( INDEX + 3, "_-* #,##0.00" SPACE SYMBOL "_-;_-* #,##0.00" SPACE SYMBOL "-;_-* \"-\"?\?" SPACE SYMBOL "_-;_-@_-" ) 215 216 /** Defines builtin currency formats 5...8 (with currency symbol), 37...40 217 (blind currency symbol), and 41...44 (accounting), in the following format: 218 "number, symbol, [minus]". 219 @param SYMBOL Currency symbol. 220 @param BLINDS Blind currency symbol. 221 @param SPACE Space character(s) between number and currency symbol. */ 222 #define NUMFMT_ALLCURRENCIES_NUMBER_SYMBOL_MINUS( SYMBOL, BLINDS, SPACE ) \ 223 NUMFMT_CURRENCY_NUMBER_SYMBOL_MINUS( 5, SYMBOL, SPACE, "" ), \ 224 NUMFMT_CURRENCY_NUMBER_SYMBOL_MINUS( 37, BLINDS, SPACE, "" ), \ 225 NUMFMT_ACCOUNTING_NUMBER_SYMBOL_MINUS( 41, SYMBOL, BLINDS, SPACE ) 226 227 /** Defines builtin currency formats INDEX...INDEX+3 in the following format: 228 "[minus], symbol, number". 229 @param INDEX First number format index. 230 @param SYMBOL Currency symbol. 231 @param SPACE Space character(s) between currency symbol and number. 232 @param MODIF Leading modifier for each portion (e.g. "t" for Thai formats). */ 233 #define NUMFMT_CURRENCY_MINUS_SYMBOL_NUMBER( INDEX, SYMBOL, SPACE, MODIF ) \ 234 NUMFMT_STRING( INDEX + 0, MODIF SYMBOL SPACE "#,##0;" MODIF "-" SYMBOL SPACE "#,##0" ), \ 235 NUMFMT_STRING( INDEX + 1, MODIF SYMBOL SPACE "#,##0;" "[RED]" MODIF "-" SYMBOL SPACE "#,##0" ), \ 236 NUMFMT_STRING( INDEX + 2, MODIF SYMBOL SPACE "#,##0.00;" MODIF "-" SYMBOL SPACE "#,##0.00" ), \ 237 NUMFMT_STRING( INDEX + 3, MODIF SYMBOL SPACE "#,##0.00;" "[RED]" MODIF "-" SYMBOL SPACE "#,##0.00" ) 238 239 /** Defines builtin accounting formats INDEX...INDEX+3 in the following order: 240 "[minus], symbol, number". 241 @param INDEX First number format index. 242 @param SYMBOL Currency symbol. 243 @param SPACE Space character(s) between currency symbol and number. */ 244 #define NUMFMT_ACCOUNTING_MINUS_SYMBOL_NUMBER( INDEX, SYMBOL, SPACE ) \ 245 NUMFMT_STRING( INDEX + 0, "_-" "* #,##0_-;" "-" "* #,##0_-;" "_-" "* \"-\"_-;" "_-@_-" ), \ 246 NUMFMT_STRING( INDEX + 1, "_-" SYMBOL SPACE "* #,##0_-;" "-" SYMBOL SPACE "* #,##0_-;" "_-" SYMBOL SPACE "* \"-\"_-;" "_-@_-" ), \ 247 NUMFMT_STRING( INDEX + 2, "_-" "* #,##0.00_-;" "-" "* #,##0.00_-;" "_-" "* \"-\"?\?_-;" "_-@_-" ), \ 248 NUMFMT_STRING( INDEX + 3, "_-" SYMBOL SPACE "* #,##0.00_-;" "-" SYMBOL SPACE "* #,##0.00_-;" "_-" SYMBOL SPACE "* \"-\"?\?_-;" "_-@_-" ) 249 250 /** Defines builtin currency formats 5...8 (with currency symbol), 37...40 251 (blind currency symbol), and 41...44 (accounting), in the following order: 252 "[minus], symbol, number". 253 @param SYMBOL Currency symbol. 254 @param SPACE Space character(s) between currency symbol and number. */ 255 #define NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( SYMBOL, SPACE ) \ 256 NUMFMT_CURRENCY_MINUS_SYMBOL_NUMBER( 5, SYMBOL, SPACE, "" ), \ 257 NUMFMT_CURRENCY_MINUS_SYMBOL_NUMBER( 37, "", "", "" ), \ 258 NUMFMT_ACCOUNTING_MINUS_SYMBOL_NUMBER( 41, SYMBOL, SPACE ) 259 260 /** Defines builtin currency formats INDEX...INDEX+3 in the following format: 261 "[minus], number, symbol". 262 @param INDEX First number format index. 263 @param SYMBOL Currency symbol. 264 @param SPACE Space character(s) between number and currency symbol. 265 @param MODIF Leading modifier for each portion (e.g. "t" for Thai formats). */ 266 #define NUMFMT_CURRENCY_MINUS_NUMBER_SYMBOL( INDEX, SYMBOL, SPACE, MODIF ) \ 267 NUMFMT_STRING( INDEX + 0, MODIF "#,##0" SPACE SYMBOL ";" MODIF "-#,##0" SPACE SYMBOL ), \ 268 NUMFMT_STRING( INDEX + 1, MODIF "#,##0" SPACE SYMBOL ";" "[RED]" MODIF "-#,##0" SPACE SYMBOL ), \ 269 NUMFMT_STRING( INDEX + 2, MODIF "#,##0.00" SPACE SYMBOL ";" MODIF "-#,##0.00" SPACE SYMBOL ), \ 270 NUMFMT_STRING( INDEX + 3, MODIF "#,##0.00" SPACE SYMBOL ";" "[RED]" MODIF "-#,##0.00" SPACE SYMBOL ) 271 272 /** Defines builtin accounting formats INDEX...INDEX+3 in the following format: 273 "[minus], number, symbol". 274 @param INDEX First number format index. 275 @param SYMBOL Currency symbol. 276 @param BLINDS Blind currency symbol. 277 @param SPACE Space character(s) between number and currency symbol. */ 278 #define NUMFMT_ACCOUNTING_MINUS_NUMBER_SYMBOL( INDEX, SYMBOL, BLINDS, SPACE ) \ 279 NUMFMT_STRING( INDEX + 0, "_-* #,##0" SPACE BLINDS "_-;-* #,##0" SPACE BLINDS "_-;_-* \"-\"" SPACE BLINDS "_-;_-@_-" ), \ 280 NUMFMT_STRING( INDEX + 1, "_-* #,##0" SPACE SYMBOL "_-;-* #,##0" SPACE SYMBOL "_-;_-* \"-\"" SPACE SYMBOL "_-;_-@_-" ), \ 281 NUMFMT_STRING( INDEX + 2, "_-* #,##0.00" SPACE BLINDS "_-;-* #,##0.00" SPACE BLINDS "_-;_-* \"-\"?\?" SPACE BLINDS "_-;_-@_-" ), \ 282 NUMFMT_STRING( INDEX + 3, "_-* #,##0.00" SPACE SYMBOL "_-;-* #,##0.00" SPACE SYMBOL "_-;_-* \"-\"?\?" SPACE SYMBOL "_-;_-@_-" ) 283 284 /** Defines builtin currency formats 5...8 (with currency symbol), 37...40 285 (blind currency symbol), and 41...44 (accounting), in the following format: 286 "[minus], number, symbol". 287 @param SYMBOL Currency symbol. 288 @param BLINDS Blind currency symbol. 289 @param SPACE Space character(s) between number and currency symbol. */ 290 #define NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( SYMBOL, BLINDS, SPACE ) \ 291 NUMFMT_CURRENCY_MINUS_NUMBER_SYMBOL( 5, SYMBOL, SPACE, "" ), \ 292 NUMFMT_CURRENCY_MINUS_NUMBER_SYMBOL( 37, BLINDS, SPACE, "" ), \ 293 NUMFMT_ACCOUNTING_MINUS_NUMBER_SYMBOL( 41, SYMBOL, BLINDS, SPACE ) 294 295 /** Defines builtin currency formats INDEX...INDEX+3 in the following format: 296 "[opening parenthesis], symbol, number, [closing parenthesis].". 297 @param INDEX First number format index. 298 @param SYMBOL Currency symbol. 299 @param SPACE Space character(s) between currency symbol and number. 300 @param MODIF Leading modifier for each portion (e.g. "t" for Thai formats). */ 301 #define NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( INDEX, SYMBOL, SPACE, MODIF ) \ 302 NUMFMT_STRING( INDEX + 0, MODIF SYMBOL SPACE "#,##0_);" MODIF "(" SYMBOL SPACE "#,##0)" ), \ 303 NUMFMT_STRING( INDEX + 1, MODIF SYMBOL SPACE "#,##0_);" "[RED]" MODIF "(" SYMBOL SPACE "#,##0)" ), \ 304 NUMFMT_STRING( INDEX + 2, MODIF SYMBOL SPACE "#,##0.00_);" MODIF "(" SYMBOL SPACE "#,##0.00)" ), \ 305 NUMFMT_STRING( INDEX + 3, MODIF SYMBOL SPACE "#,##0.00_);" "[RED]" MODIF "(" SYMBOL SPACE "#,##0.00)" ) 306 307 /** Defines builtin accounting formats INDEX...INDEX+3 in the following format: 308 "[opening parenthesis], symbol, number, [closing parenthesis].". 309 @param INDEX First number format index. 310 @param SYMBOL Currency symbol. 311 @param SPACE Space character(s) between currency symbol and number. */ 312 #define NUMFMT_ACCOUNTING_OPEN_SYMBOL_NUMBER_CLOSE( INDEX, SYMBOL, SPACE ) \ 313 NUMFMT_STRING( INDEX + 0, "_(" "* #,##0_);" "_(" "* (#,##0);" "_(" "* \"-\"_);" "_(@_)" ), \ 314 NUMFMT_STRING( INDEX + 1, "_(" SYMBOL SPACE "* #,##0_);" "_(" SYMBOL SPACE "* (#,##0);" "_(" SYMBOL SPACE "* \"-\"_);" "_(@_)" ), \ 315 NUMFMT_STRING( INDEX + 2, "_(" "* #,##0.00_);" "_(" "* (#,##0.00);" "_(" "* \"-\"?\?_);" "_(@_)" ), \ 316 NUMFMT_STRING( INDEX + 3, "_(" SYMBOL SPACE "* #,##0.00_);" "_(" SYMBOL SPACE "* (#,##0.00);" "_(" SYMBOL SPACE "* \"-\"?\?_);" "_(@_)" ) 317 318 /** Defines builtin currency formats 5...8 (with currency symbol), 37...40 319 (blind currency symbol), and 41...44 (accounting), in the following format: 320 "[opening parenthesis], symbol, number, [closing parenthesis].". 321 @param SYMBOL Currency symbol. 322 @param SPACE Space character(s) between currency symbol and number. */ 323 #define NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( SYMBOL, SPACE ) \ 324 NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( 5, SYMBOL, SPACE, "" ), \ 325 NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( 37, "", "", "" ), \ 326 NUMFMT_ACCOUNTING_OPEN_SYMBOL_NUMBER_CLOSE( 41, SYMBOL, SPACE ) 327 328 /** Defines builtin currency formats INDEX...INDEX+3 in the following format: 329 "[opening parenthesis], number, symbol, [closing parenthesis].". 330 @param INDEX First number format index. 331 @param SYMBOL Currency symbol. 332 @param SPACE Space character(s) between number and currency symbol. 333 @param MODIF Leading modifier for each portion (e.g. "t" for Thai formats). */ 334 #define NUMFMT_CURRENCY_OPEN_NUMBER_SYMBOL_CLOSE( INDEX, SYMBOL, SPACE, MODIF ) \ 335 NUMFMT_STRING( INDEX + 0, MODIF "#,##0" SPACE SYMBOL "_);" MODIF "(#,##0" SPACE SYMBOL ")" ), \ 336 NUMFMT_STRING( INDEX + 1, MODIF "#,##0" SPACE SYMBOL "_);" "[RED]" MODIF "(#,##0" SPACE SYMBOL ")" ), \ 337 NUMFMT_STRING( INDEX + 2, MODIF "#,##0.00" SPACE SYMBOL "_);" MODIF "(#,##0.00" SPACE SYMBOL ")" ), \ 338 NUMFMT_STRING( INDEX + 3, MODIF "#,##0.00" SPACE SYMBOL "_);" "[RED]" MODIF "(#,##0.00" SPACE SYMBOL ")" ) 339 340 /** Defines builtin accounting formats INDEX...INDEX+3 in the following format: 341 "[opening parenthesis], number, symbol, [closing parenthesis].". 342 @param INDEX First number format index. 343 @param SYMBOL Currency symbol. 344 @param BLINDS Blind currency symbol. 345 @param SPACE Space character(s) between number and currency symbol. */ 346 #define NUMFMT_ACCOUNTING_OPEN_NUMBER_SYMBOL_CLOSE( INDEX, SYMBOL, BLINDS, SPACE ) \ 347 NUMFMT_STRING( INDEX + 0, "_ * #,##0_)" SPACE BLINDS "_ ;_ * (#,##0)" SPACE BLINDS "_ ;_ * \"-\"_)" SPACE BLINDS "_ ;_ @_ " ), \ 348 NUMFMT_STRING( INDEX + 1, "_ * #,##0_)" SPACE SYMBOL "_ ;_ * (#,##0)" SPACE SYMBOL "_ ;_ * \"-\"_)" SPACE SYMBOL "_ ;_ @_ " ), \ 349 NUMFMT_STRING( INDEX + 2, "_ * #,##0.00_)" SPACE BLINDS "_ ;_ * (#,##0.00)" SPACE BLINDS "_ ;_ * \"-\"?\?_)" SPACE BLINDS "_ ;_ @_ " ), \ 350 NUMFMT_STRING( INDEX + 3, "_ * #,##0.00_)" SPACE SYMBOL "_ ;_ * (#,##0.00)" SPACE SYMBOL "_ ;_ * \"-\"?\?_)" SPACE SYMBOL "_ ;_ @_ " ) 351 352 /** Defines builtin currency formats 5...8 (with currency symbol), 37...40 353 (blind currency symbol), and 41...44 (accounting), in the following format: 354 "[opening parenthesis], number, symbol, [closing parenthesis].". 355 @param SYMBOL Currency symbol. 356 @param BLINDS Blind currency symbol. 357 @param SPACE Space character(s) between number and currency symbol. */ 358 #define NUMFMT_ALLCURRENCIES_OPEN_NUMBER_SYMBOL_CLOSE( SYMBOL, BLINDS, SPACE ) \ 359 NUMFMT_CURRENCY_OPEN_NUMBER_SYMBOL_CLOSE( 5, SYMBOL, SPACE, "" ), \ 360 NUMFMT_CURRENCY_OPEN_NUMBER_SYMBOL_CLOSE( 37, BLINDS, SPACE, "" ), \ 361 NUMFMT_ACCOUNTING_OPEN_NUMBER_SYMBOL_CLOSE( 41, SYMBOL, BLINDS, SPACE ) 362 363 // currency unit characters 364 #define UTF8_BAHT "\340\270\277" 365 #define UTF8_COLON "\342\202\241" 366 #define UTF8_CURR_AR_AE "\330\257.\330\245." 367 #define UTF8_CURR_AR_BH "\330\257.\330\250." 368 #define UTF8_CURR_AR_DZ "\330\257.\330\254." 369 #define UTF8_CURR_AR_EG "\330\254.\331\205." 370 #define UTF8_CURR_AR_IQ "\330\257.\330\271." 371 #define UTF8_CURR_AR_JO "\330\257.\330\247." 372 #define UTF8_CURR_AR_KW "\330\257.\331\203." 373 #define UTF8_CURR_AR_LB "\331\204.\331\204." 374 #define UTF8_CURR_AR_LY "\330\257.\331\204." 375 #define UTF8_CURR_AR_MA "\330\257.\331\205." 376 #define UTF8_CURR_AR_OM "\330\261.\330\271." 377 #define UTF8_CURR_AR_QA "\330\261.\331\202." 378 #define UTF8_CURR_AR_SA "\330\261.\330\263." 379 #define UTF8_CURR_AR_SY "\331\204.\330\263." 380 #define UTF8_CURR_AR_TN "\330\257.\330\252." 381 #define UTF8_CURR_AR_YE "\330\261.\331\212." 382 #define UTF8_CURR_BN_IN "\340\246\237\340\246\276" 383 #define UTF8_CURR_FA_IR "\330\261\331\212\330\247\331\204" 384 #define UTF8_CURR_GU_IN "\340\252\260\340\253\202" 385 #define UTF8_CURR_HI_IN "\340\244\260\340\245\201" 386 #define UTF8_CURR_KN_IN "\340\262\260\340\263\202" 387 #define UTF8_CURR_ML_IN "\340\264\225" 388 #define UTF8_CURR_PA_IN "\340\250\260\340\251\201" 389 #define UTF8_CURR_TA_IN "\340\256\260\340\257\202" 390 #define UTF8_CURR_TE_IN "\340\260\260\340\261\202" 391 #define UTF8_DONG "\342\202\253" 392 #define UTF8_EURO "\342\202\254" 393 #define UTF8_POUND_GB "\302\243" 394 #define UTF8_RUFIYAA "\336\203" 395 #define UTF8_SHEQEL "\342\202\252" 396 #define UTF8_TUGRUG "\342\202\256" 397 #define UTF8_WON "\342\202\251" 398 #define UTF8_YEN_CN "\357\277\245" 399 #define UTF8_YEN_JP "\302\245" 400 401 // Unicode characters for currency units 402 #define UTF8_CCARON_LC "\304\215" 403 #define UTF8_LSTROKE_LC "\305\202" 404 // Armenian 405 #define UTF8_HY_DA_LC "\325\244" 406 #define UTF8_HY_REH_LC "\326\200" 407 // Cyrillic 408 #define UTF8_CYR_G_LC "\320\263" 409 #define UTF8_CYR_L_LC "\320\273" 410 #define UTF8_CYR_M_LC "\320\274" 411 #define UTF8_CYR_N_LC "\320\275" 412 #define UTF8_CYR_O_LC "\320\276" 413 #define UTF8_CYR_R_LC "\321\200" 414 #define UTF8_CYR_S_LC "\321\201" 415 #define UTF8_CYR_W_LC "\320\262" 416 417 // Japanese/Chinese date/time characters 418 #define UTF8_CJ_YEAR "\345\271\264" 419 #define UTF8_CJ_MON "\346\234\210" 420 #define UTF8_CJ_DAY "\346\227\245" 421 #define UTF8_CJ_HOUR "\346\231\202" 422 #define UTF8_CJ_MIN "\345\210\206" 423 #define UTF8_CJ_SEC "\347\247\222" 424 425 // Chinese Simplified date/time characters 426 #define UTF8_CS_YEAR "\345\271\264" 427 #define UTF8_CS_MON "\346\234\210" 428 #define UTF8_CS_DAY "\346\227\245" 429 #define UTF8_CS_HOUR "\346\227\266" 430 #define UTF8_CS_MIN "\345\210\206" 431 #define UTF8_CS_SEC "\347\247\222" 432 433 // Korean date/time characters 434 #define UTF8_KO_YEAR "\353\205\204" 435 #define UTF8_KO_MON "\354\233\224" 436 #define UTF8_KO_DAY "\354\235\274" 437 #define UTF8_KO_HOUR "\354\213\234" 438 #define UTF8_KO_MIN "\353\266\204" 439 #define UTF8_KO_SEC "\354\264\210" 440 441 // ---------------------------------------------------------------------------- 442 443 /** Default number format table. Last parent of all other tables, used for unknown locales. */ 444 static const BuiltinFormat spBuiltinFormats_BASE[] = 445 { 446 // 0..13 numeric and currency formats 447 NUMFMT_PREDEF( 0, NUMBER_STANDARD ), // General 448 NUMFMT_PREDEF( 1, NUMBER_INT ), // 0 449 NUMFMT_PREDEF( 2, NUMBER_DEC2 ), // 0.00 450 NUMFMT_PREDEF( 3, NUMBER_1000INT ), // #,##0 451 NUMFMT_PREDEF( 4, NUMBER_1000DEC2 ), // #,##0.00 452 NUMFMT_PREDEF( 5, CURRENCY_1000INT ), // #,##0[symbol] 453 NUMFMT_PREDEF( 6, CURRENCY_1000INT_RED ), // #,##0[symbol];[RED]-#,##0[symbol] 454 NUMFMT_PREDEF( 7, CURRENCY_1000DEC2 ), // #,##0.00[symbol] 455 NUMFMT_PREDEF( 8, CURRENCY_1000DEC2_RED ), // #,##0.00[symbol];[RED]-#,##0.00[symbol] 456 NUMFMT_PREDEF( 9, PERCENT_INT ), // 0% 457 NUMFMT_PREDEF( 10, PERCENT_DEC2 ), // 0.00% 458 NUMFMT_PREDEF( 11, SCIENTIFIC_000E00 ), // 0.00E+00 459 NUMFMT_PREDEF( 12, FRACTION_1 ), // # ?/? 460 NUMFMT_PREDEF( 13, FRACTION_2 ), // # ??/?? 461 462 // 14...22 date and time formats 463 NUMFMT_PREDEF( 14, DATE_SYS_DDMMYYYY ), 464 NUMFMT_PREDEF( 15, DATE_SYS_DMMMYY ), 465 NUMFMT_PREDEF( 16, DATE_SYS_DDMMM ), 466 NUMFMT_PREDEF( 17, DATE_SYS_MMYY ), 467 NUMFMT_PREDEF( 18, TIME_HHMMAMPM ), 468 NUMFMT_PREDEF( 19, TIME_HHMMSSAMPM ), 469 NUMFMT_PREDEF( 20, TIME_HHMM ), 470 NUMFMT_PREDEF( 21, TIME_HHMMSS ), 471 NUMFMT_PREDEF( 22, DATETIME_SYSTEM_SHORT_HHMM ), 472 473 // 23...36 international formats 474 NUMFMT_REUSE( 23, 0 ), 475 NUMFMT_REUSE( 24, 0 ), 476 NUMFMT_REUSE( 25, 0 ), 477 NUMFMT_REUSE( 26, 0 ), 478 NUMFMT_REUSE( 27, 14 ), 479 NUMFMT_REUSE( 28, 14 ), 480 NUMFMT_REUSE( 29, 14 ), 481 NUMFMT_REUSE( 30, 14 ), 482 NUMFMT_REUSE( 31, 14 ), 483 NUMFMT_REUSE( 32, 21 ), 484 NUMFMT_REUSE( 33, 21 ), 485 NUMFMT_REUSE( 34, 21 ), 486 NUMFMT_REUSE( 35, 21 ), 487 NUMFMT_REUSE( 36, 14 ), 488 489 // 37...44 accounting formats, defaults without currency symbol here 490 NUMFMT_CURRENCY_MINUS_SYMBOL_NUMBER( 37, "", "", "" ), 491 NUMFMT_ACCOUNTING_MINUS_SYMBOL_NUMBER( 41, "", "" ), 492 493 // 45...49 more special formats 494 NUMFMT_STRING( 45, "mm:ss" ), 495 NUMFMT_STRING( 46, "[h]:mm:ss" ), 496 NUMFMT_STRING( 47, "mm:ss.0" ), 497 NUMFMT_STRING( 48, "##0.0E+0" ), 498 NUMFMT_PREDEF( 49, TEXT ), 499 500 // 50...81 international formats 501 NUMFMT_REUSE( 50, 14 ), 502 NUMFMT_REUSE( 51, 14 ), 503 NUMFMT_REUSE( 52, 14 ), 504 NUMFMT_REUSE( 53, 14 ), 505 NUMFMT_REUSE( 54, 14 ), 506 NUMFMT_REUSE( 55, 14 ), 507 NUMFMT_REUSE( 56, 14 ), 508 NUMFMT_REUSE( 57, 14 ), 509 NUMFMT_REUSE( 58, 14 ), 510 NUMFMT_REUSE( 59, 1 ), 511 NUMFMT_REUSE( 60, 2 ), 512 NUMFMT_REUSE( 61, 3 ), 513 NUMFMT_REUSE( 62, 4 ), 514 NUMFMT_REUSE( 63, 5 ), 515 NUMFMT_REUSE( 64, 6 ), 516 NUMFMT_REUSE( 65, 7 ), 517 NUMFMT_REUSE( 66, 8 ), 518 NUMFMT_REUSE( 67, 9 ), 519 NUMFMT_REUSE( 68, 10 ), 520 NUMFMT_REUSE( 69, 12 ), 521 NUMFMT_REUSE( 70, 13 ), 522 NUMFMT_REUSE( 71, 14 ), 523 NUMFMT_REUSE( 72, 14 ), 524 NUMFMT_REUSE( 73, 15 ), 525 NUMFMT_REUSE( 74, 16 ), 526 NUMFMT_REUSE( 75, 17 ), 527 NUMFMT_REUSE( 76, 20 ), 528 NUMFMT_REUSE( 77, 21 ), 529 NUMFMT_REUSE( 78, 22 ), 530 NUMFMT_REUSE( 79, 45 ), 531 NUMFMT_REUSE( 80, 46 ), 532 NUMFMT_REUSE( 81, 47 ), 533 534 // 82...163 not used, must not occur in a file (Excel may crash) 535 536 NUMFMT_ENDTABLE() 537 }; 538 539 // ---------------------------------------------------------------------------- 540 541 /** Arabic, U.A.E. */ 542 static const BuiltinFormat spBuiltinFormats_ar_AE[] = 543 { 544 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 545 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_AE "\"", " " ), 546 NUMFMT_ENDTABLE() 547 }; 548 549 /** Arabic, Bahrain. */ 550 static const BuiltinFormat spBuiltinFormats_ar_BH[] = 551 { 552 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 553 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_BH "\"", " " ), 554 NUMFMT_ENDTABLE() 555 }; 556 557 /** Arabic, Algeria. */ 558 static const BuiltinFormat spBuiltinFormats_ar_DZ[] = 559 { 560 NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 561 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_DZ "\"", " " ), 562 NUMFMT_ENDTABLE() 563 }; 564 565 /** Arabic, Egypt. */ 566 static const BuiltinFormat spBuiltinFormats_ar_EG[] = 567 { 568 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 569 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_EG "\"", " " ), 570 NUMFMT_ENDTABLE() 571 }; 572 573 /** Arabic, Iraq. */ 574 static const BuiltinFormat spBuiltinFormats_ar_IQ[] = 575 { 576 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 577 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_IQ "\"", " " ), 578 NUMFMT_ENDTABLE() 579 }; 580 581 /** Arabic, Jordan. */ 582 static const BuiltinFormat spBuiltinFormats_ar_JO[] = 583 { 584 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 585 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_JO "\"", " " ), 586 NUMFMT_ENDTABLE() 587 }; 588 589 /** Arabic, Kuwait. */ 590 static const BuiltinFormat spBuiltinFormats_ar_KW[] = 591 { 592 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 593 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_KW "\"", " " ), 594 NUMFMT_ENDTABLE() 595 }; 596 597 /** Arabic, Lebanon. */ 598 static const BuiltinFormat spBuiltinFormats_ar_LB[] = 599 { 600 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 601 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_LB "\"", " " ), 602 NUMFMT_ENDTABLE() 603 }; 604 605 /** Arabic, Libya. */ 606 static const BuiltinFormat spBuiltinFormats_ar_LY[] = 607 { 608 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 609 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_LY "\"", " " ), 610 NUMFMT_ENDTABLE() 611 }; 612 613 /** Arabic, Morocco. */ 614 static const BuiltinFormat spBuiltinFormats_ar_MA[] = 615 { 616 NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 617 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_MA "\"", " " ), 618 NUMFMT_ENDTABLE() 619 }; 620 621 /** Arabic, Oman. */ 622 static const BuiltinFormat spBuiltinFormats_ar_OM[] = 623 { 624 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 625 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_OM "\"", " " ), 626 NUMFMT_ENDTABLE() 627 }; 628 629 /** Arabic, Qatar. */ 630 static const BuiltinFormat spBuiltinFormats_ar_QA[] = 631 { 632 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 633 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_QA "\"", " " ), 634 NUMFMT_ENDTABLE() 635 }; 636 637 /** Arabic, Saudi Arabia. */ 638 static const BuiltinFormat spBuiltinFormats_ar_SA[] = 639 { 640 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 641 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_SA "\"", " " ), 642 NUMFMT_ENDTABLE() 643 }; 644 645 /** Arabic, Syria. */ 646 static const BuiltinFormat spBuiltinFormats_ar_SY[] = 647 { 648 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 649 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_SY "\"", " " ), 650 NUMFMT_ENDTABLE() 651 }; 652 653 /** Arabic, Tunisia. */ 654 static const BuiltinFormat spBuiltinFormats_ar_TN[] = 655 { 656 NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 657 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_TN "\"", " " ), 658 NUMFMT_ENDTABLE() 659 }; 660 661 /** Arabic, Yemen. */ 662 static const BuiltinFormat spBuiltinFormats_ar_YE[] = 663 { 664 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 665 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_AR_YE "\"", " " ), 666 NUMFMT_ENDTABLE() 667 }; 668 669 /** Belarusian, Belarus. */ 670 static const BuiltinFormat spBuiltinFormats_be_BY[] = 671 { 672 // space character is group separator, literal spaces must be quoted 673 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ), 674 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_CYR_R_LC ".\"", "_" UTF8_CYR_R_LC "_.", "\\ " ), 675 NUMFMT_ENDTABLE() 676 }; 677 678 /** Bulgarian, Bulgaria. */ 679 static const BuiltinFormat spBuiltinFormats_bg_BG[] = 680 { 681 // space character is group separator, literal spaces must be quoted 682 NUMFMT_ALLDATETIMES( "DD.M.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" ), 683 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_CYR_L_LC UTF8_CYR_W_LC "\"", "_" UTF8_CYR_L_LC "_" UTF8_CYR_W_LC, "\\ " ), 684 NUMFMT_ENDTABLE() 685 }; 686 687 /** Bengali, India. */ 688 static const BuiltinFormat spBuiltinFormats_bn_IN[] = 689 { 690 NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 691 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_BN_IN "\"", " " ), 692 NUMFMT_ENDTABLE() 693 }; 694 695 /** Czech, Czech Republic. */ 696 static const BuiltinFormat spBuiltinFormats_cs_CZ[] = 697 { 698 // space character is group separator, literal spaces must be quoted 699 NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ), 700 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"K" UTF8_CCARON_LC "\"", "_K_" UTF8_CCARON_LC, "\\ " ), 701 NUMFMT_ENDTABLE() 702 }; 703 704 /** Danish, Denmark. */ 705 static const BuiltinFormat spBuiltinFormats_da_DK[] = 706 { 707 NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 708 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"kr\"", " " ), 709 NUMFMT_ENDTABLE() 710 }; 711 712 /** German, Austria. */ 713 static const BuiltinFormat spBuiltinFormats_de_AT[] = 714 { 715 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" ), 716 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_EURO, " " ), 717 NUMFMT_ENDTABLE() 718 }; 719 720 /** German, Switzerland. */ 721 static const BuiltinFormat spBuiltinFormats_de_CH[] = 722 { 723 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ". ", "MMM", " ", "YY", "h", "hh" ), 724 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"SFr.\"", " " ), 725 NUMFMT_ENDTABLE() 726 }; 727 728 /** German, Germany. */ 729 static const BuiltinFormat spBuiltinFormats_de_DE[] = 730 { 731 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ". ", "MMM", " ", "YY", "h", "hh" ), 732 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ), 733 NUMFMT_ENDTABLE() 734 }; 735 736 /** German, Liechtenstein. */ 737 static const BuiltinFormat spBuiltinFormats_de_LI[] = 738 { 739 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ". ", "MMM", " ", "YY", "h", "hh" ), 740 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"CHF\"", " " ), 741 NUMFMT_ENDTABLE() 742 }; 743 744 /** German, Luxembourg. */ 745 static const BuiltinFormat spBuiltinFormats_de_LU[] = 746 { 747 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" ), 748 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ), 749 NUMFMT_ENDTABLE() 750 }; 751 752 /** Divehi, Maldives. */ 753 static const BuiltinFormat spBuiltinFormats_div_MV[] = 754 { 755 NUMFMT_ALLDATETIMES( "DD/MM/YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 756 NUMFMT_ALLCURRENCIES_NUMBER_SYMBOL_MINUS( "\"" UTF8_RUFIYAA ".\"", "_" UTF8_RUFIYAA "_.", " " ), 757 NUMFMT_ENDTABLE() 758 }; 759 760 /** Greek, Greece. */ 761 static const BuiltinFormat spBuiltinFormats_el_GR[] = 762 { 763 NUMFMT_ALLDATETIMES( "D/M/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 764 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ), 765 NUMFMT_ENDTABLE() 766 }; 767 768 /** English, Australia. */ 769 static const BuiltinFormat spBuiltinFormats_en_AU[] = 770 { 771 NUMFMT_ALLDATETIMES( "D/MM/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 772 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ), 773 NUMFMT_ENDTABLE() 774 }; 775 776 /** English, Belize. */ 777 static const BuiltinFormat spBuiltinFormats_en_BZ[] = 778 { 779 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 780 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"BZ$\"", "" ), 781 NUMFMT_ENDTABLE() 782 }; 783 784 /** English, Canada. */ 785 static const BuiltinFormat spBuiltinFormats_en_CA[] = 786 { 787 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 788 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ), 789 NUMFMT_ENDTABLE() 790 }; 791 792 /** English, Caribbean. */ 793 static const BuiltinFormat spBuiltinFormats_en_CB[] = 794 { 795 NUMFMT_ALLDATETIMES( "MM/DD/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 796 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ), 797 NUMFMT_ENDTABLE() 798 }; 799 800 /** English, United Kingdom. */ 801 static const BuiltinFormat spBuiltinFormats_en_GB[] = 802 { 803 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 804 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_POUND_GB, "" ), 805 NUMFMT_ENDTABLE() 806 }; 807 808 /** English, Ireland. */ 809 static const BuiltinFormat spBuiltinFormats_en_IE[] = 810 { 811 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 812 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_EURO, "" ), 813 NUMFMT_ENDTABLE() 814 }; 815 816 /** English, Jamaica. */ 817 static const BuiltinFormat spBuiltinFormats_en_JM[] = 818 { 819 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 820 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "\"J$\"", "" ), 821 NUMFMT_ENDTABLE() 822 }; 823 824 /** English, New Zealand. */ 825 static const BuiltinFormat spBuiltinFormats_en_NZ[] = 826 { 827 NUMFMT_ALLDATETIMES( "D/MM/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 828 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ), 829 NUMFMT_ENDTABLE() 830 }; 831 832 /** English, Philippines. */ 833 static const BuiltinFormat spBuiltinFormats_en_PH[] = 834 { 835 NUMFMT_ALLDATETIMES( "M/D/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 836 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"Php\"", "" ), 837 NUMFMT_ENDTABLE() 838 }; 839 840 /** English, Trinidad and Tobago. */ 841 static const BuiltinFormat spBuiltinFormats_en_TT[] = 842 { 843 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 844 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"TT$\"", "" ), 845 NUMFMT_ENDTABLE() 846 }; 847 848 /** English, USA. */ 849 static const BuiltinFormat spBuiltinFormats_en_US[] = 850 { 851 NUMFMT_ALLDATETIMES( "M/D/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 852 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", "" ), 853 NUMFMT_ENDTABLE() 854 }; 855 856 /** English, South Africa. */ 857 static const BuiltinFormat spBuiltinFormats_en_ZA[] = 858 { 859 NUMFMT_ALLDATETIMES( "YYYY/MM/DD", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 860 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\\R", " " ), 861 NUMFMT_ENDTABLE() 862 }; 863 864 /** English, Zimbabwe. */ 865 static const BuiltinFormat spBuiltinFormats_en_ZW[] = 866 { 867 NUMFMT_ALLDATETIMES( "M/D/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 868 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"Z$\"", "" ), 869 NUMFMT_ENDTABLE() 870 }; 871 872 /** Spanish, Argentina. */ 873 static const BuiltinFormat spBuiltinFormats_es_AR[] = 874 { 875 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 876 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "$", " " ), 877 NUMFMT_ENDTABLE() 878 }; 879 880 /** Spanish, Bolivia. */ 881 static const BuiltinFormat spBuiltinFormats_es_BO[] = 882 { 883 // slashes must be quoted to prevent conversion to minus 884 NUMFMT_ALLDATETIMES( "DD\\/MM\\/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 885 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"$b\"", " " ), 886 NUMFMT_ENDTABLE() 887 }; 888 889 /** Spanish, Chile. */ 890 static const BuiltinFormat spBuiltinFormats_es_CL[] = 891 { 892 NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 893 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", " " ), 894 NUMFMT_ENDTABLE() 895 }; 896 897 /** Spanish, Colombia. */ 898 static const BuiltinFormat spBuiltinFormats_es_CO[] = 899 { 900 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 901 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", " " ), 902 NUMFMT_ENDTABLE() 903 }; 904 905 /** Spanish, Costa Rica. */ 906 static const BuiltinFormat spBuiltinFormats_es_CR[] = 907 { 908 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 909 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( UTF8_COLON, "" ), 910 NUMFMT_ENDTABLE() 911 }; 912 913 /** Spanish, Dominican Republic. */ 914 static const BuiltinFormat spBuiltinFormats_es_DO[] = 915 { 916 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 917 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"RD$\"", "" ), 918 NUMFMT_ENDTABLE() 919 }; 920 921 /** Spanish, Ecuador. */ 922 static const BuiltinFormat spBuiltinFormats_es_EC[] = 923 { 924 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 925 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", " " ), 926 NUMFMT_ENDTABLE() 927 }; 928 929 /** Spanish, Spain. */ 930 static const BuiltinFormat spBuiltinFormats_es_ES[] = 931 { 932 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 933 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ), 934 NUMFMT_ENDTABLE() 935 }; 936 937 /** Spanish, Guatemala. */ 938 static const BuiltinFormat spBuiltinFormats_es_GT[] = 939 { 940 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 941 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\\Q", "" ), 942 NUMFMT_ENDTABLE() 943 }; 944 945 /** Spanish, Honduras. */ 946 static const BuiltinFormat spBuiltinFormats_es_HN[] = 947 { 948 // slashes must be quoted to prevent conversion to minus 949 NUMFMT_ALLDATETIMES( "DD\\/MM\\/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 950 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"L.\"", " " ), 951 NUMFMT_ENDTABLE() 952 }; 953 954 /** Spanish, Mexico. */ 955 static const BuiltinFormat spBuiltinFormats_es_MX[] = 956 { 957 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 958 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ), 959 NUMFMT_ENDTABLE() 960 }; 961 962 /** Spanish, Nicaragua. */ 963 static const BuiltinFormat spBuiltinFormats_es_NI[] = 964 { 965 // slashes must be quoted to prevent conversion to minus 966 NUMFMT_ALLDATETIMES( "DD\\/MM\\/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 967 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"C$\"", " " ), 968 NUMFMT_ENDTABLE() 969 }; 970 971 /** Spanish, Panama. */ 972 static const BuiltinFormat spBuiltinFormats_es_PA[] = 973 { 974 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 975 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"B/.\"", " " ), 976 NUMFMT_ENDTABLE() 977 }; 978 979 /** Spanish, Peru. */ 980 static const BuiltinFormat spBuiltinFormats_es_PE[] = 981 { 982 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 983 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"S/.\"", " " ), 984 NUMFMT_ENDTABLE() 985 }; 986 987 /** Spanish, Puerto Rico. */ 988 static const BuiltinFormat spBuiltinFormats_es_PR[] = 989 { 990 // slashes must be quoted to prevent conversion to minus 991 NUMFMT_ALLDATETIMES( "DD\\/MM\\/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 992 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", " " ), 993 NUMFMT_ENDTABLE() 994 }; 995 996 /** Spanish, Paraguay. */ 997 static const BuiltinFormat spBuiltinFormats_es_PY[] = 998 { 999 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 1000 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"Gs\"", " " ), 1001 NUMFMT_ENDTABLE() 1002 }; 1003 1004 /** Spanish, El Salvador. */ 1005 static const BuiltinFormat spBuiltinFormats_es_SV[] = 1006 { 1007 // slashes must be quoted to prevent conversion to minus 1008 NUMFMT_ALLDATETIMES( "DD\\/MM\\/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 1009 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", "" ), 1010 NUMFMT_ENDTABLE() 1011 }; 1012 1013 /** Spanish, Uruguay. */ 1014 static const BuiltinFormat spBuiltinFormats_es_UY[] = 1015 { 1016 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 1017 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"$U\"", " " ), 1018 NUMFMT_ENDTABLE() 1019 }; 1020 1021 /** Spanish, Venezuela. */ 1022 static const BuiltinFormat spBuiltinFormats_es_VE[] = 1023 { 1024 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 1025 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "Bs", " " ), 1026 NUMFMT_ENDTABLE() 1027 }; 1028 1029 /** Estonian, Estonia. */ 1030 static const BuiltinFormat spBuiltinFormats_et_EE[] = 1031 { 1032 // space character is group separator, literal spaces must be quoted 1033 NUMFMT_ALLDATETIMES( "D.MM.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ), 1034 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"kr\"", "_k_r", "\\ " ), 1035 NUMFMT_ENDTABLE() 1036 }; 1037 1038 /** Farsi, Iran. */ 1039 static const BuiltinFormat spBuiltinFormats_fa_IR[] = 1040 { 1041 NUMFMT_ALLDATETIMES( "YYYY/MM/DD", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 1042 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"" UTF8_CURR_FA_IR "\"", " " ), 1043 NUMFMT_ENDTABLE() 1044 }; 1045 1046 /** Finnish, Finland. */ 1047 static const BuiltinFormat spBuiltinFormats_fi_FI[] = 1048 { 1049 // space character is group separator, literal spaces must be quoted 1050 NUMFMT_STRING( 9, "0\\ %" ), 1051 NUMFMT_STRING( 10, "0.00\\ %" ), 1052 NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ), 1053 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, "\\ " ), 1054 NUMFMT_ENDTABLE() 1055 }; 1056 1057 /** Faroese, Faroe Islands. */ 1058 static const BuiltinFormat spBuiltinFormats_fo_FO[] = 1059 { 1060 NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1061 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"kr\"", " " ), 1062 NUMFMT_ENDTABLE() 1063 }; 1064 1065 /** French, Belgium. */ 1066 static const BuiltinFormat spBuiltinFormats_fr_BE[] = 1067 { 1068 NUMFMT_ALLDATETIMES( "D/MM/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 1069 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ), 1070 NUMFMT_ENDTABLE() 1071 }; 1072 1073 /** French, Canada. */ 1074 static const BuiltinFormat spBuiltinFormats_fr_CA[] = 1075 { 1076 // space character is group separator, literal spaces must be quoted 1077 NUMFMT_ALLDATETIMES( "YYYY-MM-DD", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1078 NUMFMT_ALLCURRENCIES_OPEN_NUMBER_SYMBOL_CLOSE( "$", "_$", "\\ " ), 1079 NUMFMT_ENDTABLE() 1080 }; 1081 1082 /** French, Switzerland. */ 1083 static const BuiltinFormat spBuiltinFormats_fr_CH[] = 1084 { 1085 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" ), 1086 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"SFr.\"", " " ), 1087 NUMFMT_ENDTABLE() 1088 }; 1089 1090 /** French, France. */ 1091 static const BuiltinFormat spBuiltinFormats_fr_FR[] = 1092 { 1093 // space character is group separator, literal spaces must be quoted 1094 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1095 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, "\\ " ), 1096 NUMFMT_ENDTABLE() 1097 }; 1098 1099 /** French, Luxembourg. */ 1100 static const BuiltinFormat spBuiltinFormats_fr_LU[] = 1101 { 1102 // space character is group separator, literal spaces must be quoted 1103 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1104 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, "\\ " ), 1105 NUMFMT_ENDTABLE() 1106 }; 1107 1108 /** French, Monaco. */ 1109 static const BuiltinFormat spBuiltinFormats_fr_MC[] = 1110 { 1111 // space character is group separator, literal spaces must be quoted 1112 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1113 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, "\\ " ), 1114 NUMFMT_ENDTABLE() 1115 }; 1116 1117 /** Galizian, Spain. */ 1118 static const BuiltinFormat spBuiltinFormats_gl_ES[] = 1119 { 1120 NUMFMT_ALLDATETIMES( "DD/MM/YY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 1121 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_EURO, " " ), 1122 NUMFMT_ENDTABLE() 1123 }; 1124 1125 /** Gujarati, India. */ 1126 static const BuiltinFormat spBuiltinFormats_gu_IN[] = 1127 { 1128 NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1129 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_GU_IN "\"", " " ), 1130 NUMFMT_ENDTABLE() 1131 }; 1132 1133 /** Hebrew, Israel. */ 1134 static const BuiltinFormat spBuiltinFormats_he_IL[] = 1135 { 1136 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1137 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( UTF8_SHEQEL, " " ), 1138 NUMFMT_ENDTABLE() 1139 }; 1140 1141 /** Hindi, India. */ 1142 static const BuiltinFormat spBuiltinFormats_hi_IN[] = 1143 { 1144 NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1145 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_HI_IN "\"", " " ), 1146 NUMFMT_ENDTABLE() 1147 }; 1148 1149 /** Croatian, Bosnia and Herzegowina. */ 1150 static const BuiltinFormat spBuiltinFormats_hr_BA[] = 1151 { 1152 NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ), 1153 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"KM\"", "_K_M", " " ), 1154 NUMFMT_ENDTABLE() 1155 }; 1156 1157 /** Croatian, Croatia. */ 1158 static const BuiltinFormat spBuiltinFormats_hr_HR[] = 1159 { 1160 NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ), 1161 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"kn\"", "_k_n", " " ), 1162 NUMFMT_ENDTABLE() 1163 }; 1164 1165 /** Hungarian, Hungary. */ 1166 static const BuiltinFormat spBuiltinFormats_hu_HU[] = 1167 { 1168 // space character is group separator, literal spaces must be quoted 1169 // MMM is rendered differently in Calc and Excel (see #i41488#) 1170 NUMFMT_ALLDATETIMES( "YYYY.MM.DD", "DD", ".", "MMM", ".", "YY", "h", "h" ), 1171 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"Ft\"", "_F_t", "\\ " ), 1172 NUMFMT_ENDTABLE() 1173 }; 1174 1175 /** Armenian, Armenia. */ 1176 static const BuiltinFormat spBuiltinFormats_hy_AM[] = 1177 { 1178 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ), 1179 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_HY_DA_LC UTF8_HY_REH_LC ".\"", "_" UTF8_HY_DA_LC "_" UTF8_HY_REH_LC "_.", " " ), 1180 NUMFMT_ENDTABLE() 1181 }; 1182 1183 /** Indonesian, Indonesia. */ 1184 static const BuiltinFormat spBuiltinFormats_id_ID[] = 1185 { 1186 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 1187 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"Rp\"", "" ), 1188 NUMFMT_ENDTABLE() 1189 }; 1190 1191 /** Icelandic, Iceland. */ 1192 static const BuiltinFormat spBuiltinFormats_is_IS[] = 1193 { 1194 NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "hh" ), 1195 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"kr.\"", "_k_r_.", " " ), 1196 NUMFMT_ENDTABLE() 1197 }; 1198 1199 /** Italian, Switzerland. */ 1200 static const BuiltinFormat spBuiltinFormats_it_CH[] = 1201 { 1202 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" ), 1203 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"SFr.\"", " " ), 1204 NUMFMT_ENDTABLE() 1205 }; 1206 1207 /** Italian, Italy. */ 1208 static const BuiltinFormat spBuiltinFormats_it_IT[] = 1209 { 1210 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 1211 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_EURO, " " ), 1212 NUMFMT_ENDTABLE() 1213 }; 1214 1215 /** Georgian, Georgia. */ 1216 static const BuiltinFormat spBuiltinFormats_ka_GE[] = 1217 { 1218 // space character is group separator, literal spaces must be quoted 1219 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ), 1220 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"Lari\"", "_L_a_r_i", "\\ " ), 1221 NUMFMT_ENDTABLE() 1222 }; 1223 1224 /** Kazakh, Kazakhstan. */ 1225 static const BuiltinFormat spBuiltinFormats_kk_KZ[] = 1226 { 1227 // space character is group separator, literal spaces must be quoted 1228 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ), 1229 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "\\T", "" ), 1230 NUMFMT_ENDTABLE() 1231 }; 1232 1233 /** Kannada, India. */ 1234 static const BuiltinFormat spBuiltinFormats_kn_IN[] = 1235 { 1236 NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1237 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_KN_IN "\"", " " ), 1238 NUMFMT_ENDTABLE() 1239 }; 1240 1241 /** Kyrgyz, Kyrgyzstan. */ 1242 static const BuiltinFormat spBuiltinFormats_ky_KG[] = 1243 { 1244 // space character is group separator, literal spaces must be quoted 1245 NUMFMT_ALLDATETIMES( "DD.MM.YY", "DD", ".", "MMM", ".", "YY", "h", "h" ), 1246 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, "\\ " ), 1247 NUMFMT_ENDTABLE() 1248 }; 1249 1250 /** Lithuanian, Lithuania. */ 1251 static const BuiltinFormat spBuiltinFormats_lt_LT[] = 1252 { 1253 NUMFMT_ALLDATETIMES( "YYYY.MM.DD", "DD", ".", "MMM", ".", "YY", "h", "hh" ), 1254 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"Lt\"", "_L_t", " " ), 1255 NUMFMT_ENDTABLE() 1256 }; 1257 1258 /** Latvian, Latvia. */ 1259 static const BuiltinFormat spBuiltinFormats_lv_LV[] = 1260 { 1261 // space character is group separator, literal spaces must be quoted 1262 NUMFMT_ALLDATETIMES( "YYYY.MM.DD", "DD", ".", "MMM", ".", "YY", "h", "h" ), 1263 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "\"Ls\"", "\\ " ), 1264 NUMFMT_ENDTABLE() 1265 }; 1266 1267 /** Malayalam, India. */ 1268 static const BuiltinFormat spBuiltinFormats_ml_IN[] = 1269 { 1270 NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1271 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_ML_IN "\"", " " ), 1272 NUMFMT_ENDTABLE() 1273 }; 1274 1275 /** Mongolian, Mongolia. */ 1276 static const BuiltinFormat spBuiltinFormats_mn_MN[] = 1277 { 1278 NUMFMT_ALLDATETIMES( "YY.MM.DD", "DD", ".", "MMM", ".", "YY", "h", "h" ), 1279 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_TUGRUG, "_" UTF8_TUGRUG, "" ), 1280 NUMFMT_ENDTABLE() 1281 }; 1282 1283 /** Malay, Brunei Darussalam. */ 1284 static const BuiltinFormat spBuiltinFormats_ms_BN[] = 1285 { 1286 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 1287 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", "" ), 1288 NUMFMT_ENDTABLE() 1289 }; 1290 1291 /** Malay, Malaysia. */ 1292 static const BuiltinFormat spBuiltinFormats_ms_MY[] = 1293 { 1294 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 1295 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\\R", "" ), 1296 NUMFMT_ENDTABLE() 1297 }; 1298 1299 /** Maltese, Malta. */ 1300 static const BuiltinFormat spBuiltinFormats_mt_MT[] = 1301 { 1302 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1303 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "\"Lm\"", "" ), 1304 NUMFMT_ENDTABLE() 1305 }; 1306 1307 /** Dutch, Belgium. */ 1308 static const BuiltinFormat spBuiltinFormats_nl_BE[] = 1309 { 1310 // slashes must be quoted to prevent conversion to minus 1311 NUMFMT_ALLDATETIMES( "D\\/MM\\/YYYY", "D", "\\/", "MMM", "\\/", "YY", "h", "h" ), 1312 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ), 1313 NUMFMT_ENDTABLE() 1314 }; 1315 1316 /** Dutch, Netherlands. */ 1317 static const BuiltinFormat spBuiltinFormats_nl_NL[] = 1318 { 1319 NUMFMT_ALLDATETIMES( "D-M-YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 1320 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( UTF8_EURO, " " ), 1321 NUMFMT_ENDTABLE() 1322 }; 1323 1324 /** Norwegian (Bokmal and Nynorsk), Norway. */ 1325 static const BuiltinFormat spBuiltinFormats_no_NO[] = 1326 { 1327 // space character is group separator, literal spaces must be quoted 1328 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" ), 1329 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"kr\"", "\\ " ), 1330 NUMFMT_ENDTABLE() 1331 }; 1332 1333 /** Punjabi, India. */ 1334 static const BuiltinFormat spBuiltinFormats_pa_IN[] = 1335 { 1336 NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "hh", "hh" ), 1337 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_PA_IN "\"", " " ), 1338 NUMFMT_ENDTABLE() 1339 }; 1340 1341 /** Polish, Poland. */ 1342 static const BuiltinFormat spBuiltinFormats_pl_PL[] = 1343 { 1344 // space character is group separator, literal spaces must be quoted 1345 // MMM is rendered differently in Calc and Excel (see #i72300#) 1346 NUMFMT_ALLDATETIMES( "YYYY-MM-DD", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1347 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"z" UTF8_LSTROKE_LC "\"", "_z_" UTF8_LSTROKE_LC, "\\ " ), 1348 NUMFMT_ENDTABLE() 1349 }; 1350 1351 /** Portugese, Brazil. */ 1352 static const BuiltinFormat spBuiltinFormats_pt_BR[] = 1353 { 1354 NUMFMT_ALLDATETIMES( "D/M/YYYY", "D", "/", "MMM", "/", "YY", "h", "hh" ), 1355 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"R$\"", " " ), 1356 NUMFMT_ENDTABLE() 1357 }; 1358 1359 /** Portugese, Portugal. */ 1360 static const BuiltinFormat spBuiltinFormats_pt_PT[] = 1361 { 1362 NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 1363 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, " " ), 1364 NUMFMT_ENDTABLE() 1365 }; 1366 1367 /** Romanian, Romania. */ 1368 static const BuiltinFormat spBuiltinFormats_ro_RO[] = 1369 { 1370 // space character is group separator, literal spaces must be quoted (but see #i75367#) 1371 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" ), 1372 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"lei\"", "_l_e_i", "\\ " ), 1373 NUMFMT_ENDTABLE() 1374 }; 1375 1376 /** Russian, Russian Federation. */ 1377 static const BuiltinFormat spBuiltinFormats_ru_RU[] = 1378 { 1379 // space character is group separator, literal spaces must be quoted 1380 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ), 1381 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_CYR_R_LC ".\"", "_" UTF8_CYR_R_LC "_.", "" ), 1382 NUMFMT_ENDTABLE() 1383 }; 1384 1385 /** Slovak, Slovakia. */ 1386 static const BuiltinFormat spBuiltinFormats_sk_SK[] = 1387 { 1388 // space character is group separator, literal spaces must be quoted 1389 NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ), 1390 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"Sk\"", "_S_k", "\\ " ), 1391 NUMFMT_ENDTABLE() 1392 }; 1393 1394 /** Slovenian, Slovenia. */ 1395 static const BuiltinFormat spBuiltinFormats_sl_SI[] = 1396 { 1397 NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "h" ), 1398 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"SIT\"", "_S_I_T", " " ), 1399 NUMFMT_ENDTABLE() 1400 }; 1401 1402 /** Swedish, Finland. */ 1403 static const BuiltinFormat spBuiltinFormats_sv_FI[] = 1404 { 1405 // space character is group separator, literal spaces must be quoted 1406 NUMFMT_STRING( 9, "0\\ %" ), 1407 NUMFMT_STRING( 10, "0.00\\ %" ), 1408 NUMFMT_ALLDATETIMES( "D.M.YYYY", "D", ".", "MMM", ".", "YY", "h", "hh" ), 1409 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_EURO, "_" UTF8_EURO, "\\ " ), 1410 NUMFMT_ENDTABLE() 1411 }; 1412 1413 /** Swedish, Sweden. */ 1414 static const BuiltinFormat spBuiltinFormats_sv_SE[] = 1415 { 1416 // space character is group separator, literal spaces must be quoted 1417 NUMFMT_ALLDATETIMES( "YYYY-MM-DD", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1418 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"kr\"", "_k_r", "\\ " ), 1419 NUMFMT_ENDTABLE() 1420 }; 1421 1422 /** Swahili, Tanzania. */ 1423 static const BuiltinFormat spBuiltinFormats_sw_TZ[] = 1424 { 1425 NUMFMT_ALLDATETIMES( "M/D/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 1426 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\\S", "" ), 1427 NUMFMT_ENDTABLE() 1428 }; 1429 1430 /** Tamil, India. */ 1431 static const BuiltinFormat spBuiltinFormats_ta_IN[] = 1432 { 1433 NUMFMT_ALLDATETIMES( "DD-MM-YYYY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1434 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_TA_IN "\"", " " ), 1435 NUMFMT_ENDTABLE() 1436 }; 1437 1438 /** Telugu, India. */ 1439 static const BuiltinFormat spBuiltinFormats_te_IN[] = 1440 { 1441 NUMFMT_ALLDATETIMES( "DD-MM-YY", "DD", "-", "MMM", "-", "YY", "h", "hh" ), 1442 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( "\"" UTF8_CURR_TE_IN "\"", " " ), 1443 NUMFMT_ENDTABLE() 1444 }; 1445 1446 /** Thai, Thailand. */ 1447 static const BuiltinFormat spBuiltinFormats_th_TH[] = 1448 { 1449 NUMFMT_ALLDATETIMES( "D/M/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 1450 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_BAHT, "" ), 1451 NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( 63, UTF8_BAHT, "", "t" ), 1452 NUMFMT_STRING( 59, "t0" ), 1453 NUMFMT_STRING( 60, "t0.00" ), 1454 NUMFMT_STRING( 61, "t#,##0" ), 1455 NUMFMT_STRING( 62, "t#,##0.00" ), 1456 NUMFMT_STRING( 67, "t0%" ), 1457 NUMFMT_STRING( 68, "t0.00%" ), 1458 NUMFMT_STRING( 69, "t# ?/?" ), 1459 NUMFMT_STRING( 70, "t# ?\?/?\?" ), 1460 NUMFMT_STRING( 71, "tD/M/EE" ), 1461 NUMFMT_STRING( 72, "tD-MMM-E" ), 1462 NUMFMT_STRING( 73, "tD-MMM" ), 1463 NUMFMT_STRING( 74, "tMMM-E" ), 1464 NUMFMT_STRING( 75, "th:mm" ), 1465 NUMFMT_STRING( 76, "th:mm:ss" ), 1466 NUMFMT_STRING( 77, "tD/M/EE h:mm" ), 1467 NUMFMT_STRING( 78, "tmm:ss" ), 1468 NUMFMT_STRING( 79, "t[h]:mm:ss" ), 1469 NUMFMT_STRING( 80, "tmm:ss.0" ), 1470 NUMFMT_STRING( 81, "D/M/E" ), 1471 NUMFMT_ENDTABLE() 1472 }; 1473 1474 /** Turkish, Turkey. */ 1475 static const BuiltinFormat spBuiltinFormats_tr_TR[] = 1476 { 1477 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "hh" ), 1478 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"TL\"", "_T_L", " " ), 1479 NUMFMT_ENDTABLE() 1480 }; 1481 1482 /** Tatar, Russian Federation. */ 1483 static const BuiltinFormat spBuiltinFormats_tt_RU[] = 1484 { 1485 // space character is group separator, literal spaces must be quoted 1486 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ), 1487 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( "\"" UTF8_CYR_R_LC ".\"", "_" UTF8_CYR_R_LC "_.", "\\ " ), 1488 NUMFMT_ENDTABLE() 1489 }; 1490 1491 /** Ukrainian, Ukraine. */ 1492 static const BuiltinFormat spBuiltinFormats_uk_UA[] = 1493 { 1494 // space character is group separator, literal spaces must be quoted 1495 NUMFMT_ALLDATETIMES( "DD.MM.YYYY", "DD", ".", "MMM", ".", "YY", "h", "h" ), 1496 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 "_.", "\\ " ), 1497 NUMFMT_ENDTABLE() 1498 }; 1499 1500 /** Urdu, Pakistan. */ 1501 static const BuiltinFormat spBuiltinFormats_ur_PK[] = 1502 { 1503 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 1504 NUMFMT_ALLCURRENCIES_SYMBOL_NUMBER_MINUS( "\"Rs\"", "" ), 1505 NUMFMT_ENDTABLE() 1506 }; 1507 1508 /** Vietnamese, Viet Nam. */ 1509 static const BuiltinFormat spBuiltinFormats_vi_VN[] = 1510 { 1511 NUMFMT_ALLDATETIMES( "DD/MM/YYYY", "DD", "-", "MMM", "-", "YY", "h", "h" ), 1512 NUMFMT_ALLCURRENCIES_MINUS_NUMBER_SYMBOL( UTF8_DONG, "_" UTF8_DONG, " " ), 1513 NUMFMT_ENDTABLE() 1514 }; 1515 1516 // CJK ------------------------------------------------------------------------ 1517 1518 /** Base table for CJK locales. */ 1519 static const BuiltinFormat spBuiltinFormats_CJK[] = 1520 { 1521 NUMFMT_REUSE( 29, 28 ), 1522 NUMFMT_REUSE( 36, 27 ), 1523 NUMFMT_REUSE( 50, 27 ), 1524 NUMFMT_REUSE( 51, 28 ), 1525 NUMFMT_REUSE( 52, 34 ), 1526 NUMFMT_REUSE( 53, 35 ), 1527 NUMFMT_REUSE( 54, 28 ), 1528 NUMFMT_REUSE( 55, 34 ), 1529 NUMFMT_REUSE( 56, 35 ), 1530 NUMFMT_REUSE( 57, 27 ), 1531 NUMFMT_REUSE( 58, 28 ), 1532 NUMFMT_ENDTABLE() 1533 }; 1534 1535 /** Japanese, Japan. */ 1536 static const BuiltinFormat spBuiltinFormats_ja_JP[] = 1537 { 1538 NUMFMT_ALLDATETIMES( "YYYY/MM/DD", "DD", "-", "MMM", "-", "YY", "h", "h" ), 1539 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_YEN_JP, "" ), 1540 NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( 23, "$", "", "" ), 1541 NUMFMT_STRING( 27, "[$-411]GE.MM.DD" ), 1542 NUMFMT_STRING( 28, "[$-411]GGGE\"" UTF8_CJ_YEAR "\"MM\"" UTF8_CJ_MON "\"DD\"" UTF8_CJ_DAY "\"" ), 1543 NUMFMT_STRING( 30, "MM/DD/YY" ), 1544 NUMFMT_STRING( 31, "YYYY\"" UTF8_CJ_YEAR "\"MM\"" UTF8_CJ_MON "\"DD\"" UTF8_CJ_DAY "\"" ), 1545 NUMFMT_TIME_CJK( 32, "h", UTF8_CJ_HOUR, UTF8_CJ_MIN, UTF8_CJ_SEC ), 1546 NUMFMT_STRING( 34, "YYYY\"" UTF8_CJ_YEAR "\"MM\"" UTF8_CJ_MON "\"" ), 1547 NUMFMT_STRING( 35, "MM\"" UTF8_CJ_MON "\"DD\"" UTF8_CJ_DAY "\"" ), 1548 NUMFMT_ENDTABLE() 1549 }; 1550 1551 /** Korean, South Korea. */ 1552 static const BuiltinFormat spBuiltinFormats_ko_KR[] = 1553 { 1554 NUMFMT_ALLDATETIMES( "YYYY-MM-DD", "DD", "-", "MMM", "-", "YY", "h", "h" ), 1555 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( UTF8_WON, "" ), 1556 NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( 23, "$", "", "" ), 1557 NUMFMT_STRING( 27, "YYYY" UTF8_CJ_YEAR " MM" UTF8_CJ_MON " DD" UTF8_CJ_DAY ), 1558 NUMFMT_STRING( 28, "MM-DD" ), 1559 NUMFMT_STRING( 30, "MM-DD-YY" ), 1560 NUMFMT_STRING( 31, "YYYY" UTF8_KO_YEAR " MM" UTF8_KO_MON " DD" UTF8_KO_DAY ), 1561 NUMFMT_TIME_CJK( 32, "h", UTF8_KO_HOUR, UTF8_KO_MIN, UTF8_KO_SEC ), 1562 // slashes must be quoted to prevent conversion to minus 1563 NUMFMT_STRING( 34, "YYYY\\/MM\\/DD" ), 1564 NUMFMT_REUSE( 35, 14 ), 1565 NUMFMT_ENDTABLE() 1566 }; 1567 1568 /** Chinese, China. */ 1569 static const BuiltinFormat spBuiltinFormats_zh_CN[] = 1570 { 1571 NUMFMT_ALLDATETIMES( "YYYY-M-D", "D", "-", "MMM", "-", "YY", "h", "h" ), 1572 NUMFMT_ALLCURRENCIES_SYMBOL_MINUS_NUMBER( UTF8_YEN_CN, "" ), 1573 NUMFMT_ALLTIMES_CJK( "h", "h", UTF8_CS_HOUR, UTF8_CS_MIN, UTF8_CS_SEC ), 1574 NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( 23, "$", "", "" ), 1575 NUMFMT_STRING( 27, "YYYY\"" UTF8_CS_YEAR "\"M\"" UTF8_CS_MON "\"" ), 1576 NUMFMT_STRING( 28, "M\"" UTF8_CS_MON "\"D\"" UTF8_CS_DAY "\"" ), 1577 NUMFMT_STRING( 30, "M-D-YY" ), 1578 NUMFMT_STRING( 31, "YYYY\"" UTF8_CS_YEAR "\"M\"" UTF8_CS_MON "\"D\"" UTF8_CS_DAY "\"" ), 1579 NUMFMT_REUSE( 52, 27 ), 1580 NUMFMT_REUSE( 53, 28 ), 1581 NUMFMT_ENDTABLE() 1582 }; 1583 1584 /** Chinese, Hong Kong. */ 1585 static const BuiltinFormat spBuiltinFormats_zh_HK[] = 1586 { 1587 NUMFMT_ALLDATETIMES( "D/M/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 1588 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\"HK$\"", "" ), 1589 NUMFMT_ALLTIMES_CJK( "h", "h", UTF8_CJ_HOUR, UTF8_CJ_MIN, UTF8_CJ_SEC ), 1590 NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( 23, "\"US$\"", "", "" ), 1591 NUMFMT_STRING( 27, "[$-404]D/M/E" ), 1592 NUMFMT_STRING( 28, "[$-404]D\"" UTF8_CJ_DAY "\"M\"" UTF8_CJ_MON "\"E\"" UTF8_CJ_YEAR "\"" ), 1593 NUMFMT_STRING( 30, "M/D/YY" ), 1594 NUMFMT_STRING( 31, "D\"" UTF8_CJ_DAY "\"M\"" UTF8_CJ_MON "\"YYYY\"" UTF8_CJ_YEAR "\"" ), 1595 NUMFMT_ENDTABLE() 1596 }; 1597 1598 /** Chinese, Macau. */ 1599 static const BuiltinFormat spBuiltinFormats_zh_MO[] = 1600 { 1601 NUMFMT_ALLDATETIMES( "D/M/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 1602 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "\\P", "" ), 1603 NUMFMT_ALLTIMES_CJK( "h", "h", UTF8_CJ_HOUR, UTF8_CJ_MIN, UTF8_CJ_SEC ), 1604 NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( 23, "\"US$\"", "", "" ), 1605 NUMFMT_STRING( 27, "[$-404]D/M/E" ), 1606 NUMFMT_STRING( 28, "[$-404]D\"" UTF8_CJ_DAY "\"M\"" UTF8_CJ_MON "\"E\"" UTF8_CJ_YEAR "\"" ), 1607 NUMFMT_STRING( 30, "M/D/YY" ), 1608 NUMFMT_STRING( 31, "D\"" UTF8_CJ_DAY "\"M\"" UTF8_CJ_MON "\"YYYY\"" UTF8_CJ_YEAR "\"" ), 1609 NUMFMT_ENDTABLE() 1610 }; 1611 1612 /** Chinese, Singapore. */ 1613 static const BuiltinFormat spBuiltinFormats_zh_SG[] = 1614 { 1615 NUMFMT_ALLDATETIMES( "D/M/YYYY", "D", "-", "MMM", "-", "YY", "h", "h" ), 1616 NUMFMT_ALLCURRENCIES_OPEN_SYMBOL_NUMBER_CLOSE( "$", "" ), 1617 NUMFMT_ALLTIMES_CJK( "h", "h", UTF8_CS_HOUR, UTF8_CS_MIN, UTF8_CS_SEC ), 1618 NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( 23, "$", "", "" ), 1619 NUMFMT_STRING( 27, "YYYY\"" UTF8_CS_YEAR "\"M\"" UTF8_CS_MON "\"" ), 1620 NUMFMT_STRING( 28, "M\"" UTF8_CS_MON "\"D\"" UTF8_CS_DAY "\"" ), 1621 NUMFMT_STRING( 30, "M/D/YY" ), 1622 NUMFMT_STRING( 31, "D\"" UTF8_CS_DAY "\"M\"" UTF8_CS_MON "\"YYYY\"" UTF8_CS_YEAR "\"" ), 1623 NUMFMT_ENDTABLE() 1624 }; 1625 1626 /** Chinese, Taiwan. */ 1627 static const BuiltinFormat spBuiltinFormats_zh_TW[] = 1628 { 1629 NUMFMT_ALLDATETIMES( "YYYY/M/D", "D", "-", "MMM", "-", "YY", "hh", "hh" ), 1630 NUMFMT_ALLCURRENCIES_MINUS_SYMBOL_NUMBER( "$", "" ), 1631 NUMFMT_ALLTIMES_CJK( "hh", "hh", UTF8_CJ_HOUR, UTF8_CJ_MIN, UTF8_CJ_SEC ), 1632 NUMFMT_CURRENCY_OPEN_SYMBOL_NUMBER_CLOSE( 23, "\"US$\"", "", "" ), 1633 NUMFMT_STRING( 27, "[$-404]E/M/D" ), 1634 NUMFMT_STRING( 28, "[$-404]E\"" UTF8_CJ_YEAR "\"M\"" UTF8_CJ_MON "\"D\"" UTF8_CJ_DAY "\"" ), 1635 NUMFMT_STRING( 30, "M/D/YY" ), 1636 NUMFMT_STRING( 31, "YYYY\"" UTF8_CJ_YEAR "\"M\"" UTF8_CJ_MON "\"D\"" UTF8_CJ_DAY "\"" ), 1637 NUMFMT_ENDTABLE() 1638 }; 1639 1640 // ---------------------------------------------------------------------------- 1641 1642 /** Specifies a built-in number format table for a specific locale. */ 1643 struct BuiltinFormatTable 1644 { 1645 const sal_Char* mpcLocale; /// The locale for this table. 1646 const sal_Char* mpcParent; /// The locale of the parent table. 1647 const BuiltinFormat* mpFormats; /// The number format table (may be 0, if equal to parent). 1648 }; 1649 1650 static const BuiltinFormatTable spBuiltinFormatTables[] = 1651 { // locale parent format table 1652 { "*", "", spBuiltinFormats_BASE }, // Base table 1653 { "af-ZA", "*", spBuiltinFormats_en_ZA }, // Afrikaans, South Africa 1654 { "ar-AE", "*", spBuiltinFormats_ar_AE }, // Arabic, U.A.E. 1655 { "ar-BH", "*", spBuiltinFormats_ar_BH }, // Arabic, Bahrain 1656 { "ar-DZ", "*", spBuiltinFormats_ar_DZ }, // Arabic, Algeria 1657 { "ar-EG", "*", spBuiltinFormats_ar_EG }, // Arabic, Egypt 1658 { "ar-IQ", "*", spBuiltinFormats_ar_IQ }, // Arabic, Iraq 1659 { "ar-JO", "*", spBuiltinFormats_ar_JO }, // Arabic, Jordan 1660 { "ar-KW", "*", spBuiltinFormats_ar_KW }, // Arabic, Kuwait 1661 { "ar-LB", "*", spBuiltinFormats_ar_LB }, // Arabic, Lebanon 1662 { "ar-LY", "*", spBuiltinFormats_ar_LY }, // Arabic, Libya 1663 { "ar-MA", "*", spBuiltinFormats_ar_MA }, // Arabic, Morocco 1664 { "ar-OM", "*", spBuiltinFormats_ar_OM }, // Arabic, Oman 1665 { "ar-QA", "*", spBuiltinFormats_ar_QA }, // Arabic, Qatar 1666 { "ar-SA", "*", spBuiltinFormats_ar_SA }, // Arabic, Saudi Arabia 1667 { "ar-SY", "*", spBuiltinFormats_ar_SY }, // Arabic, Syria 1668 { "ar-TN", "*", spBuiltinFormats_ar_TN }, // Arabic, Tunisia 1669 { "ar-YE", "*", spBuiltinFormats_ar_YE }, // Arabic, Yemen 1670 { "be-BY", "*", spBuiltinFormats_be_BY }, // Belarusian, Belarus 1671 { "bg-BG", "*", spBuiltinFormats_bg_BG }, // Bulgarian, Bulgaria 1672 { "bn-IN", "*", spBuiltinFormats_bn_IN }, // Bengali, India 1673 { "ca-ES", "*", spBuiltinFormats_es_ES }, // Catalan, Spain 1674 { "cs-CZ", "*", spBuiltinFormats_cs_CZ }, // Czech, Czech Republic 1675 { "cy-GB", "*", spBuiltinFormats_en_GB }, // Welsh, United Kingdom 1676 { "da-DK", "*", spBuiltinFormats_da_DK }, // Danish, Denmark 1677 { "de-AT", "*", spBuiltinFormats_de_AT }, // German, Austria 1678 { "de-CH", "*", spBuiltinFormats_de_CH }, // German, Switzerland 1679 { "de-DE", "*", spBuiltinFormats_de_DE }, // German, Germany 1680 { "de-LI", "*", spBuiltinFormats_de_LI }, // German, Liechtenstein 1681 { "de-LU", "*", spBuiltinFormats_de_LU }, // German, Luxembourg 1682 { "div-MV", "*", spBuiltinFormats_div_MV }, // Divehi, Maldives 1683 { "el-GR", "*", spBuiltinFormats_el_GR }, // Greek, Greece 1684 { "en-AU", "*", spBuiltinFormats_en_AU }, // English, Australia 1685 { "en-BZ", "*", spBuiltinFormats_en_BZ }, // English, Belize 1686 { "en-CA", "*", spBuiltinFormats_en_CA }, // English, Canada 1687 { "en-CB", "*", spBuiltinFormats_en_CB }, // English, Caribbean 1688 { "en-GB", "*", spBuiltinFormats_en_GB }, // English, United Kingdom 1689 { "en-IE", "*", spBuiltinFormats_en_IE }, // English, Ireland 1690 { "en-JM", "*", spBuiltinFormats_en_JM }, // English, Jamaica 1691 { "en-NZ", "*", spBuiltinFormats_en_NZ }, // English, New Zealand 1692 { "en-PH", "*", spBuiltinFormats_en_PH }, // English, Philippines 1693 { "en-TT", "*", spBuiltinFormats_en_TT }, // English, Trinidad and Tobago 1694 { "en-US", "*", spBuiltinFormats_en_US }, // English, USA 1695 { "en-ZA", "*", spBuiltinFormats_en_ZA }, // English, South Africa 1696 { "en-ZW", "*", spBuiltinFormats_en_ZW }, // English, Zimbabwe 1697 { "es-AR", "*", spBuiltinFormats_es_AR }, // Spanish, Argentina 1698 { "es-BO", "*", spBuiltinFormats_es_BO }, // Spanish, Bolivia 1699 { "es-CL", "*", spBuiltinFormats_es_CL }, // Spanish, Chile 1700 { "es-CO", "*", spBuiltinFormats_es_CO }, // Spanish, Colombia 1701 { "es-CR", "*", spBuiltinFormats_es_CR }, // Spanish, Costa Rica 1702 { "es-DO", "*", spBuiltinFormats_es_DO }, // Spanish, Dominican Republic 1703 { "es-EC", "*", spBuiltinFormats_es_EC }, // Spanish, Ecuador 1704 { "es-ES", "*", spBuiltinFormats_es_ES }, // Spanish, Spain 1705 { "es-GT", "*", spBuiltinFormats_es_GT }, // Spanish, Guatemala 1706 { "es-HN", "*", spBuiltinFormats_es_HN }, // Spanish, Honduras 1707 { "es-MX", "*", spBuiltinFormats_es_MX }, // Spanish, Mexico 1708 { "es-NI", "*", spBuiltinFormats_es_NI }, // Spanish, Nicaragua 1709 { "es-PA", "*", spBuiltinFormats_es_PA }, // Spanish, Panama 1710 { "es-PE", "*", spBuiltinFormats_es_PE }, // Spanish, Peru 1711 { "es-PR", "*", spBuiltinFormats_es_PR }, // Spanish, Puerto Rico 1712 { "es-PY", "*", spBuiltinFormats_es_PY }, // Spanish, Paraguay 1713 { "es-SV", "*", spBuiltinFormats_es_SV }, // Spanish, El Salvador 1714 { "es-UY", "*", spBuiltinFormats_es_UY }, // Spanish, Uruguay 1715 { "es-VE", "*", spBuiltinFormats_es_VE }, // Spanish, Venezuela 1716 { "et-EE", "*", spBuiltinFormats_et_EE }, // Estonian, Estonia 1717 { "fa-IR", "*", spBuiltinFormats_fa_IR }, // Farsi, Iran 1718 { "fi-FI", "*", spBuiltinFormats_fi_FI }, // Finnish, Finland 1719 { "fo-FO", "*", spBuiltinFormats_fo_FO }, // Faroese, Faroe Islands 1720 { "fr-BE", "*", spBuiltinFormats_fr_BE }, // French, Belgium 1721 { "fr-CA", "*", spBuiltinFormats_fr_CA }, // French, Canada 1722 { "fr-CH", "*", spBuiltinFormats_fr_CH }, // French, Switzerland 1723 { "fr-FR", "*", spBuiltinFormats_fr_FR }, // French, France 1724 { "fr-LU", "*", spBuiltinFormats_fr_LU }, // French, Luxembourg 1725 { "fr-MC", "*", spBuiltinFormats_fr_MC }, // French, Monaco 1726 { "gl-ES", "*", spBuiltinFormats_gl_ES }, // Galizian, Spain 1727 { "gu-IN", "*", spBuiltinFormats_gu_IN }, // Gujarati, India 1728 { "he-IL", "*", spBuiltinFormats_he_IL }, // Hebrew, Israel 1729 { "hi-IN", "*", spBuiltinFormats_hi_IN }, // Hindi, India 1730 { "hr-BA", "*", spBuiltinFormats_hr_BA }, // Croatian, Bosnia and Herzegowina 1731 { "hr-HR", "*", spBuiltinFormats_hr_HR }, // Croatian, Croatia 1732 { "hu-HU", "*", spBuiltinFormats_hu_HU }, // Hungarian, Hungary 1733 { "hy-AM", "*", spBuiltinFormats_hy_AM }, // Armenian, Armenia 1734 { "id-ID", "*", spBuiltinFormats_id_ID }, // Indonesian, Indonesia 1735 { "is-IS", "*", spBuiltinFormats_is_IS }, // Icelandic, Iceland 1736 { "it-CH", "*", spBuiltinFormats_it_CH }, // Italian, Switzerland 1737 { "it-IT", "*", spBuiltinFormats_it_IT }, // Italian, Italy 1738 { "ka-GE", "*", spBuiltinFormats_ka_GE }, // Georgian, Georgia 1739 { "kk-KZ", "*", spBuiltinFormats_kk_KZ }, // Kazakh, Kazakhstan 1740 { "kn-IN", "*", spBuiltinFormats_kn_IN }, // Kannada, India 1741 { "kok-IN", "*", spBuiltinFormats_hi_IN }, // Konkani, India 1742 { "ky-KG", "*", spBuiltinFormats_ky_KG }, // Kyrgyz, Kyrgyzstan 1743 { "lt-LT", "*", spBuiltinFormats_lt_LT }, // Lithuanian, Lithuania 1744 { "lv-LV", "*", spBuiltinFormats_lv_LV }, // Latvian, Latvia 1745 { "mi-NZ", "*", spBuiltinFormats_en_NZ }, // Maori, New Zealand 1746 { "ml-IN", "*", spBuiltinFormats_ml_IN }, // Malayalam, India 1747 { "mn-MN", "*", spBuiltinFormats_mn_MN }, // Mongolian, Mongolia 1748 { "mr-IN", "*", spBuiltinFormats_hi_IN }, // Marathi, India 1749 { "ms-BN", "*", spBuiltinFormats_ms_BN }, // Malay, Brunei Darussalam 1750 { "ms-MY", "*", spBuiltinFormats_ms_MY }, // Malay, Malaysia 1751 { "mt-MT", "*", spBuiltinFormats_mt_MT }, // Maltese, Malta 1752 { "nb-NO", "*", spBuiltinFormats_no_NO }, // Norwegian Bokmal, Norway 1753 { "nl-BE", "*", spBuiltinFormats_nl_BE }, // Dutch, Belgium 1754 { "nl-NL", "*", spBuiltinFormats_nl_NL }, // Dutch, Netherlands 1755 { "nn-NO", "*", spBuiltinFormats_no_NO }, // Norwegian Nynorsk, Norway 1756 { "nso-ZA", "*", spBuiltinFormats_en_ZA }, // Northern Sotho, South Africa 1757 { "pa-IN", "*", spBuiltinFormats_pa_IN }, // Punjabi, India 1758 { "pl-PL", "*", spBuiltinFormats_pl_PL }, // Polish, Poland 1759 { "pt-BR", "*", spBuiltinFormats_pt_BR }, // Portugese, Brazil 1760 { "pt-PT", "*", spBuiltinFormats_pt_PT }, // Portugese, Portugal 1761 { "qu-BO", "*", spBuiltinFormats_es_BO }, // Quechua, Bolivia 1762 { "qu-EC", "*", spBuiltinFormats_es_EC }, // Quechua, Ecuador 1763 { "qu-PE", "*", spBuiltinFormats_es_PE }, // Quechua, Peru 1764 { "ro-RO", "*", spBuiltinFormats_ro_RO }, // Romanian, Romania 1765 { "ru-RU", "*", spBuiltinFormats_ru_RU }, // Russian, Russian Federation 1766 { "sa-IN", "*", spBuiltinFormats_hi_IN }, // Sanskrit, India 1767 { "se-FI", "*", spBuiltinFormats_fi_FI }, // Sami, Finland 1768 { "se-NO", "*", spBuiltinFormats_no_NO }, // Sami, Norway 1769 { "se-SE", "*", spBuiltinFormats_sv_SE }, // Sami, Sweden 1770 { "sk-SK", "*", spBuiltinFormats_sk_SK }, // Slovak, Slovakia 1771 { "sl-SI", "*", spBuiltinFormats_sl_SI }, // Slovenian, Slovenia 1772 { "sv-FI", "*", spBuiltinFormats_sv_FI }, // Swedish, Finland 1773 { "sv-SE", "*", spBuiltinFormats_sv_SE }, // Swedish, Sweden 1774 { "sw-TZ", "*", spBuiltinFormats_sw_TZ }, // Swahili, Tanzania 1775 { "syr-SY", "*", spBuiltinFormats_ar_SY }, // Syriac, Syria 1776 { "syr-TR", "*", spBuiltinFormats_tr_TR }, // Syriac, Turkey 1777 { "ta-IN", "*", spBuiltinFormats_ta_IN }, // Tamil, India 1778 { "te-IN", "*", spBuiltinFormats_te_IN }, // Telugu, India 1779 { "th-TH", "*", spBuiltinFormats_th_TH }, // Thai, Thailand 1780 { "tn-ZA", "*", spBuiltinFormats_en_ZA }, // Tswana, South Africa 1781 { "tr-TR", "*", spBuiltinFormats_tr_TR }, // Turkish, Turkey 1782 { "tt-RU", "*", spBuiltinFormats_tt_RU }, // Tatar, Russian Federation 1783 { "uk-UA", "*", spBuiltinFormats_uk_UA }, // Ukrainian, Ukraine 1784 { "ur-PK", "*", spBuiltinFormats_ur_PK }, // Urdu, Pakistan 1785 { "vi-VN", "*", spBuiltinFormats_vi_VN }, // Vietnamese, Viet Nam 1786 { "xh-ZA", "*", spBuiltinFormats_en_ZA }, // Xhosa, South Africa 1787 { "zu-ZA", "*", spBuiltinFormats_en_ZA }, // Zulu, South Africa 1788 1789 { "*CJK", "*", spBuiltinFormats_CJK }, // CJK base table 1790 { "ja-JP", "*CJK", spBuiltinFormats_ja_JP }, // Japanese, Japan 1791 { "ko-KR", "*CJK", spBuiltinFormats_ko_KR }, // Korean, South Korea 1792 { "zh-CN", "*CJK", spBuiltinFormats_zh_CN }, // Chinese, China 1793 { "zh-HK", "*CJK", spBuiltinFormats_zh_HK }, // Chinese, Hong Kong 1794 { "zh-MO", "*CJK", spBuiltinFormats_zh_MO }, // Chinese, Macau 1795 { "zh-SG", "*CJK", spBuiltinFormats_zh_SG }, // Chinese, Singapore 1796 { "zh-TW", "*CJK", spBuiltinFormats_zh_TW } // Chinese, Taiwan 1797 }; 1798 1799 } // namespace 1800 1801 // ============================================================================ 1802 1803 NumFmtModel::NumFmtModel() : 1804 mnPredefId( -1 ) 1805 { 1806 } 1807 1808 // ---------------------------------------------------------------------------- 1809 1810 ApiNumFmtData::ApiNumFmtData() : 1811 mnIndex( 0 ) 1812 { 1813 } 1814 1815 // ---------------------------------------------------------------------------- 1816 1817 namespace { 1818 1819 sal_Int32 lclCreatePredefinedFormat( const Reference< XNumberFormats >& rxNumFmts, 1820 sal_Int16 nPredefId, const Locale& rToLocale ) 1821 { 1822 sal_Int32 nIndex = 0; 1823 try 1824 { 1825 Reference< XNumberFormatTypes > xNumFmtTypes( rxNumFmts, UNO_QUERY_THROW ); 1826 nIndex = (nPredefId >= 0) ? 1827 xNumFmtTypes->getFormatIndex( nPredefId, rToLocale ) : 1828 xNumFmtTypes->getStandardIndex( rToLocale ); 1829 } 1830 catch( Exception& ) 1831 { 1832 OSL_ENSURE( false, 1833 OStringBuffer( "lclCreatePredefinedFormat - cannot create predefined number format " ). 1834 append( OString::valueOf( static_cast< sal_Int32 >( nPredefId ) ) ).getStr() ); 1835 } 1836 return nIndex; 1837 } 1838 1839 sal_Int32 lclCreateFormat( const Reference< XNumberFormats >& rxNumFmts, 1840 const OUString& rFmtCode, const Locale& rToLocale, const Locale& rFromLocale ) 1841 { 1842 sal_Int32 nIndex = 0; 1843 try 1844 { 1845 nIndex = rxNumFmts->addNewConverted( rFmtCode, rFromLocale, rToLocale ); 1846 } 1847 catch( Exception& ) 1848 { 1849 // BIFF2-BIFF4 stores standard format explicitly in stream 1850 if( rFmtCode.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "general" ) ) ) 1851 { 1852 nIndex = lclCreatePredefinedFormat( rxNumFmts, 0, rToLocale ); 1853 } 1854 else 1855 { 1856 // do not assert fractional number formats with fixed denominator 1857 OSL_ENSURE( rFmtCode.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "#\\ ?/" ) ) || 1858 rFmtCode.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "#\\ ?\?/" ) ) || 1859 rFmtCode.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "#\\ ?\?\?/" ) ), 1860 OStringBuffer( "lclCreateFormat - cannot create number format '" ). 1861 append( OUStringToOString( rFmtCode, osl_getThreadTextEncoding() ) ). 1862 append( '\'' ).getStr() ); 1863 } 1864 } 1865 return nIndex; 1866 } 1867 1868 // ---------------------------------------------------------------------------- 1869 1870 /** Functor for converting an XML number format to an API number format index. */ 1871 class NumberFormatFinalizer 1872 { 1873 public: 1874 explicit NumberFormatFinalizer( const WorkbookHelper& rHelper ); 1875 1876 inline bool is() const { return mxNumFmts.is(); } 1877 1878 inline void operator()( NumberFormat& rNumFmt ) const 1879 { rNumFmt.finalizeImport( mxNumFmts, maEnUsLocale ); } 1880 1881 private: 1882 Reference< XNumberFormats > mxNumFmts; 1883 Locale maEnUsLocale; 1884 }; 1885 1886 NumberFormatFinalizer::NumberFormatFinalizer( const WorkbookHelper& rHelper ) : 1887 maEnUsLocale( CREATE_OUSTRING( "en" ), CREATE_OUSTRING( "US" ), OUString() ) 1888 { 1889 try 1890 { 1891 Reference< XNumberFormatsSupplier > xNumFmtsSupp( rHelper.getDocument(), UNO_QUERY_THROW ); 1892 mxNumFmts = xNumFmtsSupp->getNumberFormats(); 1893 } 1894 catch( Exception& ) 1895 { 1896 } 1897 OSL_ENSURE( mxNumFmts.is(), "NumberFormatFinalizer::NumberFormatFinalizer - cannot get number formats" ); 1898 } 1899 1900 } // namespace 1901 1902 // ---------------------------------------------------------------------------- 1903 1904 NumberFormat::NumberFormat( const WorkbookHelper& rHelper ) : 1905 WorkbookHelper( rHelper ) 1906 { 1907 } 1908 1909 void NumberFormat::setFormatCode( const OUString& rFmtCode ) 1910 { 1911 maModel.maFmtCode = rFmtCode; 1912 } 1913 1914 void NumberFormat::setFormatCode( const Locale& rLocale, const sal_Char* pcFmtCode ) 1915 { 1916 maModel.maLocale = rLocale; 1917 maModel.maFmtCode = OStringToOUString( OString( pcFmtCode ), RTL_TEXTENCODING_UTF8 ); 1918 maModel.mnPredefId = -1; 1919 } 1920 1921 void NumberFormat::setPredefinedId( const Locale& rLocale, sal_Int16 nPredefId ) 1922 { 1923 maModel.maLocale = rLocale; 1924 maModel.maFmtCode = OUString(); 1925 maModel.mnPredefId = nPredefId; 1926 } 1927 1928 sal_Int32 NumberFormat::finalizeImport( const Reference< XNumberFormats >& rxNumFmts, const Locale& rFromLocale ) 1929 { 1930 if( rxNumFmts.is() && (maModel.maFmtCode.getLength() > 0) ) 1931 maApiData.mnIndex = lclCreateFormat( rxNumFmts, maModel.maFmtCode, maModel.maLocale, rFromLocale ); 1932 else 1933 maApiData.mnIndex = lclCreatePredefinedFormat( rxNumFmts, maModel.mnPredefId, maModel.maLocale ); 1934 return maApiData.mnIndex; 1935 } 1936 1937 void NumberFormat::writeToPropertyMap( PropertyMap& rPropMap ) const 1938 { 1939 rPropMap[ PROP_NumberFormat ] <<= maApiData.mnIndex; 1940 } 1941 1942 // ============================================================================ 1943 1944 NumberFormatsBuffer::NumberFormatsBuffer( const WorkbookHelper& rHelper ) : 1945 WorkbookHelper( rHelper ), 1946 mnNextBiffIndex( 0 ) 1947 { 1948 // get the current locale 1949 try 1950 { 1951 Reference< XMultiServiceFactory > xConfigProv( getBaseFilter().getServiceFactory()->createInstance( 1952 CREATE_OUSTRING( "com.sun.star.configuration.ConfigurationProvider" ) ), UNO_QUERY_THROW ); 1953 1954 // try user-defined locale setting 1955 Sequence< Any > aArgs( 1 ); 1956 aArgs[ 0 ] <<= CREATE_OUSTRING( "org.openoffice.Setup/L10N/" ); 1957 Reference< XNameAccess > xConfigNA( xConfigProv->createInstanceWithArguments( 1958 CREATE_OUSTRING( "com.sun.star.configuration.ConfigurationAccess" ), aArgs ), UNO_QUERY_THROW ); 1959 xConfigNA->getByName( CREATE_OUSTRING( "ooSetupSystemLocale" ) ) >>= maLocaleStr; 1960 1961 // if set to "use system", get locale from system 1962 if( maLocaleStr.getLength() == 0 ) 1963 { 1964 aArgs[ 0 ] <<= CREATE_OUSTRING( "org.openoffice.System/L10N/" ); 1965 xConfigNA.set( xConfigProv->createInstanceWithArguments( 1966 CREATE_OUSTRING( "com.sun.star.configuration.ConfigurationAccess" ), aArgs ), UNO_QUERY_THROW ); 1967 xConfigNA->getByName( CREATE_OUSTRING( "Locale" ) ) >>= maLocaleStr; 1968 } 1969 } 1970 catch( Exception& ) 1971 { 1972 OSL_ENSURE( false, "NumberFormatsBuffer::NumberFormatsBuffer - cannot get system locale" ); 1973 } 1974 1975 // create built-in formats for current locale 1976 insertBuiltinFormats(); 1977 } 1978 1979 NumberFormatRef NumberFormatsBuffer::createNumFmt( sal_Int32 nNumFmtId, const OUString& rFmtCode ) 1980 { 1981 NumberFormatRef xNumFmt; 1982 if( nNumFmtId >= 0 ) 1983 { 1984 xNumFmt.reset( new NumberFormat( *this ) ); 1985 maNumFmts[ nNumFmtId ] = xNumFmt; 1986 xNumFmt->setFormatCode( rFmtCode ); 1987 } 1988 return xNumFmt; 1989 } 1990 1991 NumberFormatRef NumberFormatsBuffer::importNumFmt( const AttributeList& rAttribs ) 1992 { 1993 sal_Int32 nNumFmtId = rAttribs.getInteger( XML_numFmtId, -1 ); 1994 OUString aFmtCode = rAttribs.getXString( XML_formatCode, OUString() ); 1995 return createNumFmt( nNumFmtId, aFmtCode ); 1996 } 1997 1998 void NumberFormatsBuffer::importNumFmt( SequenceInputStream& rStrm ) 1999 { 2000 sal_Int32 nNumFmtId = rStrm.readuInt16(); 2001 OUString aFmtCode = BiffHelper::readString( rStrm ); 2002 createNumFmt( nNumFmtId, aFmtCode ); 2003 } 2004 2005 void NumberFormatsBuffer::importFormat( BiffInputStream& rStrm ) 2006 { 2007 OUString aFmtCode; 2008 switch( getBiff() ) 2009 { 2010 case BIFF2: 2011 case BIFF3: 2012 aFmtCode = rStrm.readByteStringUC( false, getTextEncoding() ); 2013 break; 2014 case BIFF4: 2015 rStrm.skip( 2 ); // in BIFF4 the index field exists, but is undefined 2016 aFmtCode = rStrm.readByteStringUC( false, getTextEncoding() ); 2017 break; 2018 case BIFF5: 2019 mnNextBiffIndex = rStrm.readuInt16(); 2020 aFmtCode = rStrm.readByteStringUC( false, getTextEncoding() ); 2021 break; 2022 case BIFF8: 2023 mnNextBiffIndex = rStrm.readuInt16(); 2024 aFmtCode = rStrm.readUniString(); 2025 break; 2026 case BIFF_UNKNOWN: break; 2027 } 2028 2029 createNumFmt( mnNextBiffIndex, aFmtCode ); 2030 ++mnNextBiffIndex; 2031 } 2032 2033 void NumberFormatsBuffer::finalizeImport() 2034 { 2035 maNumFmts.forEach( NumberFormatFinalizer( *this ) ); 2036 } 2037 2038 void NumberFormatsBuffer::writeToPropertyMap( PropertyMap& rPropMap, sal_Int32 nNumFmtId ) const 2039 { 2040 if( const NumberFormat* pNumFmt = maNumFmts.get( nNumFmtId ).get() ) 2041 pNumFmt->writeToPropertyMap( rPropMap ); 2042 } 2043 2044 void NumberFormatsBuffer::insertBuiltinFormats() 2045 { 2046 // build a map containing pointers to all tables 2047 typedef ::std::map< OUString, const BuiltinFormatTable* > BuiltinMap; 2048 BuiltinMap aBuiltinMap; 2049 for( const BuiltinFormatTable* pTable = spBuiltinFormatTables; 2050 pTable != STATIC_ARRAY_END( spBuiltinFormatTables ); ++pTable ) 2051 aBuiltinMap[ OUString::createFromAscii( pTable->mpcLocale ) ] = pTable; 2052 2053 // convert locale string to locale struct 2054 Locale aSysLocale; 2055 sal_Int32 nDashPos = maLocaleStr.indexOf( '-' ); 2056 if( nDashPos < 0 ) nDashPos = maLocaleStr.getLength(); 2057 aSysLocale.Language = maLocaleStr.copy( 0, nDashPos ); 2058 if( nDashPos + 1 < maLocaleStr.getLength() ) 2059 aSysLocale.Country = maLocaleStr.copy( nDashPos + 1 ); 2060 2061 // build a list of table pointers for the current locale, with all parent tables 2062 typedef ::std::vector< const BuiltinFormatTable* > BuiltinVec; 2063 BuiltinVec aBuiltinVec; 2064 BuiltinMap::const_iterator aMIt = aBuiltinMap.find( maLocaleStr ), aMEnd = aBuiltinMap.end(); 2065 OSL_ENSURE( aMIt != aMEnd, 2066 OStringBuffer( "NumberFormatsBuffer::insertBuiltinFormats - locale '" ). 2067 append( OUStringToOString( maLocaleStr, RTL_TEXTENCODING_ASCII_US ) ). 2068 append( "' not supported (#i29949#)" ).getStr() ); 2069 // start with default table, if no table has been found 2070 if( aMIt == aMEnd ) 2071 aMIt = aBuiltinMap.find( CREATE_OUSTRING( "*" ) ); 2072 OSL_ENSURE( aMIt != aMEnd, "NumberFormatsBuffer::insertBuiltinFormats - default map not found" ); 2073 // insert all tables into the vector 2074 for( ; aMIt != aMEnd; aMIt = aBuiltinMap.find( OUString::createFromAscii( aMIt->second->mpcParent ) ) ) 2075 aBuiltinVec.push_back( aMIt->second ); 2076 2077 // insert the default formats in the format map (in reverse order from default table to system locale) 2078 typedef ::std::map< sal_Int32, sal_Int32 > ReuseMap; 2079 ReuseMap aReuseMap; 2080 for( BuiltinVec::reverse_iterator aVIt = aBuiltinVec.rbegin(), aVEnd = aBuiltinVec.rend(); aVIt != aVEnd; ++aVIt ) 2081 { 2082 // do not put the current system locale for default table 2083 Locale aLocale; 2084 if( (*aVIt)->mpcLocale[ 0 ] != '\0' ) 2085 aLocale = aSysLocale; 2086 for( const BuiltinFormat* pBuiltin = (*aVIt)->mpFormats; pBuiltin && (pBuiltin->mnNumFmtId >= 0); ++pBuiltin ) 2087 { 2088 NumberFormatRef& rxNumFmt = maNumFmts[ pBuiltin->mnNumFmtId ]; 2089 rxNumFmt.reset( new NumberFormat( *this ) ); 2090 2091 bool bReuse = false; 2092 if( pBuiltin->mpcFmtCode ) 2093 rxNumFmt->setFormatCode( aLocale, pBuiltin->mpcFmtCode ); 2094 else if( pBuiltin->mnPredefId >= 0 ) 2095 rxNumFmt->setPredefinedId( aLocale, pBuiltin->mnPredefId ); 2096 else 2097 bReuse = pBuiltin->mnReuseId >= 0; 2098 2099 if( bReuse ) 2100 aReuseMap[ pBuiltin->mnNumFmtId ] = pBuiltin->mnReuseId; 2101 else 2102 aReuseMap.erase( pBuiltin->mnNumFmtId ); 2103 } 2104 } 2105 2106 // copy reused number formats 2107 for( ReuseMap::const_iterator aRIt = aReuseMap.begin(), aREnd = aReuseMap.end(); aRIt != aREnd; ++aRIt ) 2108 maNumFmts[ aRIt->first ] = maNumFmts[ aRIt->second ]; 2109 } 2110 2111 // ============================================================================ 2112 2113 } // namespace xls 2114 } // namespace oox 2115