From 4d8389ef1eaa66a4123abf13c83db6c9a2d9c207 Mon Sep 17 00:00:00 2001 From: Sanxing Chen Date: Thu, 12 Apr 2018 09:30:33 +0800 Subject: [PATCH] Support currency compound unit (#412) * Support compound unit's patterns * Basic support for currency compound units - refactor the extractor and parser of NumberWithUnit - add BaseCurrencyParser * Update patterns and revise tests - Support optional IsoCurrency in Resolution - Fix js tests * Comments fixes * Fix minor issue in mergedExtractor * Comments fixes - update English pattern to support more written chinese currencies. - add code comments * Revise code - remove SYS_UNIT_COMPOUND * Merge master and resolve conflicts --- .../BaseCurrency.cs | 268 ++++ .../BaseCurrency.tt | 7 + .../Chinese/NumbersWithUnitDefinitions.cs | 1 + .../English/NumbersWithUnitDefinitions.cs | 269 +++- .../French/NumbersWithUnitDefinitions.cs | 1 + .../German/NumbersWithUnitDefinitions.cs | 1 + .../Microsoft.Recognizers.Definitions.csproj | 9 + .../Portuguese/NumbersWithUnitDefinitions.cs | 1 + .../Spanish/NumbersWithUnitDefinitions.cs | 1 + .../TestDateTimeRecognizerInitialization.cs | 4 +- .../TestNumberWithUnit_English.cs | 2 +- .../TestBase.cs | 11 + .../TestHelpers.cs | 26 +- ...arserChs.cs => MergedDateTimeParserChs.cs} | 4 +- .../Constants.cs | 2 +- .../DateTimeRecognizer.cs | 20 +- ...ctor.cs => BaseMergedDateTimeExtractor.cs} | 156 +- ...dParser.cs => BaseMergedDateTimeParser.cs} | 1406 ++++++++--------- ...eseNumberWithUnitExtractorConfiguration.cs | 7 +- .../Constants.cs | 5 + .../CurrencyExtractorConfiguration.cs | 2 + ...ishNumberWithUnitExtractorConfiguration.cs | 5 +- .../Parsers/CurrencyParserConfiguration.cs | 8 +- .../Extractors/BaseMergedUnitExtractor.cs | 178 +++ .../INumberWithUnitExtractorConfiguration.cs | 4 +- ...nchNumberWithUnitExtractorConfiguration.cs | 6 +- ...manNumberWithUnitExtractorConfiguration.cs | 6 +- .../Models/AbstractNumberWithUnitModel.cs | 31 +- .../NumberWithUnitRecognizer.cs | 4 +- .../Parsers/BaseCurrencyParser.cs | 232 +++ .../Parsers/BaseMergedUnitParser.cs | 31 + .../INumberWithUnitParserConfiguration.cs | 40 +- .../Parsers/NumberWithUnitParser.cs | 7 +- ...eseNumberWithUnitExtractorConfiguration.cs | 5 +- ...ishNumberWithUnitExtractorConfiguration.cs | 13 +- .../Utilities/DictionaryUtils.cs | 44 + .NET/Microsoft.Recognizers.Text.sln | 1 + .../Models/ResolutionKey.cs | 1 + .../resource-definitions.json | 8 + .../src/resources/baseCurrency.ts | 12 + .../src/resources/chineseNumericWithUnit.ts | 1 + .../src/resources/englishNumericWithUnit.ts | 5 +- .../src/resources/frenchNumericWithUnit.ts | 1 + .../resources/portugueseNumericWithUnit.ts | 1 + .../src/resources/spanishNumericWithUnit.ts | 1 + Patterns/Base-Currency.yaml | 247 +++ Patterns/Chinese/Chinese-NumbersWithUnit.yaml | 2 + Patterns/English/English-NumbersWithUnit.yaml | 273 +++- Patterns/French/French-NumbersWithUnit.yaml | 2 + Patterns/German/German-NumbersWithUnit.yaml | 2 + Patterns/Italian/Italian-NumbersWithUnit.yaml | 2 + .../Portuguese-NumbersWithUnit.yaml | 2 + Patterns/Spanish/Spanish-NumbersWithUnit.yaml | 2 + .../NumberWithUnit/English/CurrencyModel.json | 215 ++- 54 files changed, 2710 insertions(+), 885 deletions(-) create mode 100644 .NET/Microsoft.Recognizers.Definitions/BaseCurrency.cs create mode 100644 .NET/Microsoft.Recognizers.Definitions/BaseCurrency.tt rename .NET/Microsoft.Recognizers.Text.DateTime/Chinese/Parsers/{MergedParserChs.cs => MergedDateTimeParserChs.cs} (96%) rename .NET/Microsoft.Recognizers.Text.DateTime/Extractors/{BaseMergedExtractor.cs => BaseMergedDateTimeExtractor.cs} (97%) rename .NET/Microsoft.Recognizers.Text.DateTime/Parsers/{BaseMergedParser.cs => BaseMergedDateTimeParser.cs} (96%) create mode 100644 .NET/Microsoft.Recognizers.Text.NumberWithUnit/Extractors/BaseMergedUnitExtractor.cs create mode 100644 .NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/BaseCurrencyParser.cs create mode 100644 .NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/BaseMergedUnitParser.cs create mode 100644 .NET/Microsoft.Recognizers.Text.NumberWithUnit/Utilities/DictionaryUtils.cs create mode 100644 JavaScript/packages/recognizers-number-with-unit/src/resources/baseCurrency.ts create mode 100644 Patterns/Base-Currency.yaml diff --git a/.NET/Microsoft.Recognizers.Definitions/BaseCurrency.cs b/.NET/Microsoft.Recognizers.Definitions/BaseCurrency.cs new file mode 100644 index 0000000000..fa1196413b --- /dev/null +++ b/.NET/Microsoft.Recognizers.Definitions/BaseCurrency.cs @@ -0,0 +1,268 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Generation parameters: +// - DataFilename: Patterns\Base-Currency.yaml +// - Language: NULL +// - ClassName: BaseCurrency +// +//------------------------------------------------------------------------------ +namespace Microsoft.Recognizers.Definitions +{ + using System; + using System.Collections.Generic; + + public static class BaseCurrency + { + public static readonly Dictionary CurrencyFractionMapping = new Dictionary + { + { "CNY", "FEN|JIAO" }, + { "__D", "CENT" }, + { "RUB", "KOPEK" }, + { "AFN", "PUL" }, + { "EUR", "CENT" }, + { "ALL", "QINDARKE" }, + { "_ALP", "PENNY" }, + { "GBP", "PENNY" }, + { "_GGP", "PENNY" }, + { "DZD", "SANTEEM" }, + { "AOA", "CENTIMO" }, + { "ARS", "CENTAVO" }, + { "AMD", "LUMA" }, + { "AWG", "CENT" }, + { "_AP", "PENNY" }, + { "SHP", "PENNY" }, + { "AUD", "CENT" }, + { "AZN", "QƏPIK" }, + { "BSD", "CENT" }, + { "BHD", "FILS" }, + { "BDT", "POISHA" }, + { "BBD", "CENT" }, + { "BYN", "KAPYEYKA" }, + { "BZD", "CENT" }, + { "XOF", "CENTIME" }, + { "BMD", "CENT" }, + { "BTN", "CHETRUM" }, + { "INR", "PAISA" }, + { "BOB", "CENTAVO" }, + { "USD", "CENT" }, + { "BAM", "FENING" }, + { "BWP", "THEBE" }, + { "BRL", "CENTAVO" }, + { "_BD", "CENT" }, + { "BND", "SEN" }, + { "SGD", "CENT" }, + { "BGN", "STOTINKA" }, + { "BIF", "CENTIME" }, + { "KHR", "SEN" }, + { "XAF", "CENTIME" }, + { "CAD", "CENT" }, + { "CVE", "CENTAVO" }, + { "KYD", "CENT" }, + { "CLP", "CENTAVO" }, + { "COP", "CENTAVO" }, + { "KMF", "CENTIME" }, + { "CDF", "CENTIME" }, + { "NZD", "CENT" }, + { "_CKD", "CENT" }, + { "CRC", "CENTIMO" }, + { "HRK", "LIPA" }, + { "CUC", "CENTAVO" }, + { "CUP", "CENTAVO" }, + { "CZK", "HALER" }, + { "DKK", "ØRE" }, + { "DJF", "CENTIME" }, + { "DOP", "CENTAVO" }, + { "EGP", "PIASTRE" }, + { "ERN", "CENT" }, + { "ETB", "SANTIM" }, + { "FKP", "PENNY" }, + { "_FOK", "OYRA" }, + { "FJD", "CENT" }, + { "XPF", "CENTIME" }, + { "GMD", "BUTUT" }, + { "GEL", "TETRI" }, + { "GHS", "PESEWA" }, + { "GIP", "PENNY" }, + { "GTQ", "CENTAVO" }, + { "GNF", "CENTIME" }, + { "GYD", "CENT" }, + { "HTG", "CENTIME" }, + { "HNL", "CENTAVO" }, + { "HKD", "CENT" }, + { "HUF", "FILLER" }, + { "ISK", "EYRIR" }, + { "IDR", "SEN" }, + { "IRR", "DINAR" }, + { "IQD", "FILS" }, + { "IMP", "PENNY" }, + { "ILS", "AGORA" }, + { "JMD", "CENT" }, + { "JPY", "SEN" }, + { "JEP", "PENNY" }, + { "JOD", "PIASTRE" }, + { "KZT", "TIIN" }, + { "KES", "CENT" }, + { "_KID", "CENT" }, + { "KPW", "CHON" }, + { "KRW", "JEON" }, + { "KWD", "FILS" }, + { "KGS", "TYIYN" }, + { "LAK", "ATT" }, + { "LBP", "PIASTRE" }, + { "LSL", "SENTE" }, + { "ZAR", "CENT" }, + { "LRD", "CENT" }, + { "LYD", "DIRHAM" }, + { "CHF", "RAPPEN" }, + { "MOP", "AVO" }, + { "MKD", "DENI" }, + { "MGA", "IRAIMBILANJA" }, + { "MWK", "TAMBALA" }, + { "MYR", "SEN" }, + { "MVR", "LAARI" }, + { "MRO", "KHOUMS" }, + { "MUR", "CENT" }, + { "MXN", "CENTAVO" }, + { "_MD", "CENT" }, + { "MDL", "BAN" }, + { "MNT", "MONGO" }, + { "MAD", "CENTIME" }, + { "MZN", "CENTAVO" }, + { "MMK", "PYA" }, + { "NAD", "CENT" }, + { "_ND", "CENT" }, + { "NPR", "PAISA" }, + { "NIO", "CENTAVO" }, + { "NGN", "KOBO" }, + { "_NID", "CENT" }, + { "TRY", "KURUS" }, + { "NOK", "ØRE" }, + { "OMR", "BAISA" }, + { "PKR", "PAISA" }, + { "_PD", "CENT" }, + { "PAB", "CENTESIMO" }, + { "PGK", "TOEA" }, + { "PYG", "CENTIMO" }, + { "PEN", "CENTIMO" }, + { "_PND", "CENT" }, + { "PLN", "GROSZ" }, + { "QAR", "DIRHAM" }, + { "RON", "BAN" }, + { "RWF", "CENTIME" }, + { "WST", "SENE" }, + { "STD", "CENTIMO" }, + { "SAR", "HALALA" }, + { "RSD", "PARA" }, + { "SCR", "CENT" }, + { "SLL", "CENT" }, + { "SBD", "CENT" }, + { "SOS", "CENT" }, + { "_SS", "CENT" }, + { "_SP", "PENNY" }, + { "SSP", "PIASTRE" }, + { "LKR", "CENT" }, + { "SDG", "PIASTRE" }, + { "SRD", "CENT" }, + { "SZL", "CENT" }, + { "SEK", "ORE" }, + { "SYP", "PIASTRE" }, + { "TWD", "CENT" }, + { "TJS", "DIRAM" }, + { "TZS", "CENT" }, + { "THB", "SATANG" }, + { "PRB", "KOPEK" }, + { "TTD", "CENT" }, + { "_TP", "PENNY" }, + { "TND", "MILLIME" }, + { "TMT", "TENNESI" }, + { "TVD", "CENT" }, + { "UGX", "CENT" }, + { "UAH", "KOPIYKA" }, + { "AED", "FILS" }, + { "UYU", "CENTESIMO" }, + { "VEF", "CENTIMO" }, + { "YER", "FILS" }, + { "ZMW", "NGWEE" } + }; + public static readonly Dictionary CurrencyFractionalRatios = new Dictionary + { + { "Kopek", 100 }, + { "Pul", 100 }, + { "Cent", 100 }, + { "Qindarkë", 100 }, + { "Penny", 100 }, + { "Santeem", 100 }, + { "Cêntimo", 100 }, + { "Centavo", 100 }, + { "Luma", 100 }, + { "Qəpik", 100 }, + { "Fils", 1000 }, + { "Poisha", 100 }, + { "Kapyeyka", 100 }, + { "Centime", 100 }, + { "Chetrum", 100 }, + { "Paisa", 100 }, + { "Fening", 100 }, + { "Thebe", 100 }, + { "Sen", 100 }, + { "Stotinka", 100 }, + { "Jiao", 10 }, + { "Fen", 100 }, + { "Céntimo", 100 }, + { "Lipa", 100 }, + { "Haléř", 100 }, + { "Øre", 100 }, + { "Piastre", 100 }, + { "Santim", 100 }, + { "Oyra", 100 }, + { "Butut", 100 }, + { "Tetri", 100 }, + { "Pesewa", 100 }, + { "Fillér", 100 }, + { "Eyrir", 100 }, + { "Dinar", 100 }, + { "Agora", 100 }, + { "Tïın", 100 }, + { "Chon", 100 }, + { "Jeon", 100 }, + { "Tyiyn", 100 }, + { "Att", 100 }, + { "Sente", 100 }, + { "Dirham", 1000 }, + { "Rappen", 100 }, + { "Avo", 100 }, + { "Deni", 100 }, + { "Iraimbilanja", 5 }, + { "Tambala", 100 }, + { "Laari", 100 }, + { "Khoums", 5 }, + { "Ban", 100 }, + { "Möngö", 100 }, + { "Pya", 100 }, + { "Kobo", 100 }, + { "Kuruş", 100 }, + { "Baisa", 1000 }, + { "Centésimo", 100 }, + { "Toea", 100 }, + { "Sentimo", 100 }, + { "Grosz", 100 }, + { "Sene", 100 }, + { "Halala", 100 }, + { "Para", 100 }, + { "Öre", 100 }, + { "Diram", 100 }, + { "Satang", 100 }, + { "Seniti", 100 }, + { "Millime", 1000 }, + { "Tennesi", 100 }, + { "Kopiyka", 100 }, + { "Tiyin", 100 }, + { "Hào", 10 }, + { "Ngwee", 100 } + }; + } +} \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Definitions/BaseCurrency.tt b/.NET/Microsoft.Recognizers.Definitions/BaseCurrency.tt new file mode 100644 index 0000000000..67af512813 --- /dev/null +++ b/.NET/Microsoft.Recognizers.Definitions/BaseCurrency.tt @@ -0,0 +1,7 @@ +<#@ template debug="true" hostspecific="true" language="C#" #> +<# + this.DataFilename = @"Patterns\Base-Currency.yaml"; + this.Language = null; + this.ClassName = "BaseCurrency"; +#> +<#@ include file=".\CommonDefinitions.ttinclude"#> \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Definitions/Chinese/NumbersWithUnitDefinitions.cs b/.NET/Microsoft.Recognizers.Definitions/Chinese/NumbersWithUnitDefinitions.cs index 86a686639a..70f597b9d5 100644 --- a/.NET/Microsoft.Recognizers.Definitions/Chinese/NumbersWithUnitDefinitions.cs +++ b/.NET/Microsoft.Recognizers.Definitions/Chinese/NumbersWithUnitDefinitions.cs @@ -244,6 +244,7 @@ public static class NumbersWithUnitDefinitions { "Finnish markka", "芬兰马克" }, { "Penni", "盆尼" } }; + public const string CompoundUnitConnectorRegex = @"(?又|再)"; public static readonly Dictionary CurrencyPrefixList = new Dictionary { { "Dollar", "$" }, diff --git a/.NET/Microsoft.Recognizers.Definitions/English/NumbersWithUnitDefinitions.cs b/.NET/Microsoft.Recognizers.Definitions/English/NumbersWithUnitDefinitions.cs index 769a1f8d4f..65e89c5279 100644 --- a/.NET/Microsoft.Recognizers.Definitions/English/NumbersWithUnitDefinitions.cs +++ b/.NET/Microsoft.Recognizers.Definitions/English/NumbersWithUnitDefinitions.cs @@ -284,12 +284,277 @@ public static class NumbersWithUnitDefinitions { "Trinidad and Tobago dollar", "trinidad and tobago dollars|trinidad and tobago dollar|trinidad and tobago $|trinidad $|trinidad dollar|trinidad dollars|trinidadian dollar|trinidadian dollars|trinidadian $|ttd" }, { "Tuvaluan dollar", "tuvaluan dollars|tuvaluan dollar|tuvaluan $" }, { "Dollar", "dollars|dollar|$" }, - { "Chinese yuan", "yuan|chinese yuan|renminbi|cny|rmb|¥" }, + { "Chinese yuan", "yuan|kuai|chinese yuan|renminbi|cny|rmb|¥" }, { "Fen", "fen" }, - { "Jiao", "jiao" }, + { "Jiao", "jiao|mao" }, { "Finnish markka", "suomen markka|finnish markka|finsk mark|fim|markkaa|markka" }, { "Penni", "penniä|penni" } }; + public static readonly Dictionary CurrencyNameToIsoCodeMap = new Dictionary + { + { "Afghan afghani", "AFN" }, + { "Euro", "EUR" }, + { "Albanian lek", "ALL" }, + { "Angolan kwanza", "AOA" }, + { "Armenian dram", "AMD" }, + { "Aruban florin", "AWG" }, + { "Bangladeshi taka", "BDT" }, + { "Bhutanese ngultrum", "BTN" }, + { "Bolivian boliviano", "BOB" }, + { "Bosnia and Herzegovina convertible mark", "BAM" }, + { "Botswana pula", "BWP" }, + { "Brazilian real", "BRL" }, + { "Bulgarian lev", "BGN" }, + { "Cambodian riel", "KHR" }, + { "Cape Verdean escudo", "CVE" }, + { "Costa Rican colón", "CRC" }, + { "Croatian kuna", "HRK" }, + { "Czech koruna", "CZK" }, + { "Eritrean nakfa", "ERN" }, + { "Ethiopian birr", "ETB" }, + { "Gambian dalasi", "GMD" }, + { "Georgian lari", "GEL" }, + { "Ghanaian cedi", "GHS" }, + { "Guatemalan quetzal", "GTQ" }, + { "Haitian gourde", "HTG" }, + { "Honduran lempira", "HNL" }, + { "Hungarian forint", "HUF" }, + { "Iranian rial", "IRR" }, + { "Yemeni rial", "YER" }, + { "Israeli new shekel", "ILS" }, + { "Japanese yen", "JPY" }, + { "Kazakhstani tenge", "KZT" }, + { "Kenyan shilling", "KES" }, + { "North Korean won", "KPW" }, + { "South Korean won", "KRW" }, + { "Kyrgyzstani som", "KGS" }, + { "Lao kip", "LAK" }, + { "Lesotho loti", "LSL" }, + { "South African rand", "ZAR" }, + { "Macanese pataca", "MOP" }, + { "Macedonian denar", "MKD" }, + { "Malagasy ariary", "MGA" }, + { "Malawian kwacha", "MWK" }, + { "Malaysian ringgit", "MYR" }, + { "Mauritanian ouguiya", "MRO" }, + { "Mongolian tögrög", "MNT" }, + { "Mozambican metical", "MZN" }, + { "Burmese kyat", "MMK" }, + { "Nicaraguan córdoba", "NIO" }, + { "Nigerian naira", "NGN" }, + { "Turkish lira", "TRY" }, + { "Omani rial", "OMR" }, + { "Panamanian balboa", "PAB" }, + { "Papua New Guinean kina", "PGK" }, + { "Paraguayan guaraní", "PYG" }, + { "Peruvian sol", "PEN" }, + { "Polish złoty", "PLN" }, + { "Qatari riyal", "QAR" }, + { "Saudi riyal", "SAR" }, + { "Samoan tālā", "WST" }, + { "São Tomé and Príncipe dobra", "STD" }, + { "Sierra Leonean leone", "SLL" }, + { "Swazi lilangeni", "SZL" }, + { "Tajikistani somoni", "TJS" }, + { "Thai baht", "THB" }, + { "Ukrainian hryvnia", "UAH" }, + { "Vanuatu vatu", "VUV" }, + { "Venezuelan bolívar", "VEF" }, + { "Zambian kwacha", "ZMW" }, + { "Moroccan dirham", "MAD" }, + { "United Arab Emirates dirham", "AED" }, + { "Azerbaijani manat", "AZN" }, + { "Turkmenistan manat", "TMT" }, + { "Somali shilling", "SOS" }, + { "Tanzanian shilling", "TZS" }, + { "Ugandan shilling", "UGX" }, + { "Romanian leu", "RON" }, + { "Moldovan leu", "MDL" }, + { "Nepalese rupee", "NPR" }, + { "Pakistani rupee", "PKR" }, + { "Indian rupee", "INR" }, + { "Seychellois rupee", "SCR" }, + { "Mauritian rupee", "MUR" }, + { "Maldivian rufiyaa", "MVR" }, + { "Sri Lankan rupee", "LKR" }, + { "Indonesian rupiah", "IDR" }, + { "Danish krone", "DKK" }, + { "Norwegian krone", "NOK" }, + { "Icelandic króna", "ISK" }, + { "Swedish krona", "SEK" }, + { "West African CFA franc", "XOF" }, + { "Central African CFA franc", "XAF" }, + { "Comorian franc", "KMF" }, + { "Congolese franc", "CDF" }, + { "Burundian franc", "BIF" }, + { "Djiboutian franc", "DJF" }, + { "CFP franc", "XPF" }, + { "Guinean franc", "GNF" }, + { "Swiss franc", "CHF" }, + { "Rwandan franc", "RWF" }, + { "Russian ruble", "RUB" }, + { "Transnistrian ruble", "PRB" }, + { "Belarusian ruble", "BYN" }, + { "Algerian dinar", "DZD" }, + { "Bahraini dinar", "BHD" }, + { "Iraqi dinar", "IQD" }, + { "Jordanian dinar", "JOD" }, + { "Kuwaiti dinar", "KWD" }, + { "Libyan dinar", "LYD" }, + { "Serbian dinar", "RSD" }, + { "Tunisian dinar", "TND" }, + { "Argentine peso", "ARS" }, + { "Chilean peso", "CLP" }, + { "Colombian peso", "COP" }, + { "Cuban convertible peso", "CUC" }, + { "Cuban peso", "CUP" }, + { "Dominican peso", "DOP" }, + { "Mexican peso", "MXN" }, + { "Uruguayan peso", "UYU" }, + { "British pound", "GBP" }, + { "Saint Helena pound", "SHP" }, + { "Egyptian pound", "EGP" }, + { "Falkland Islands pound", "FKP" }, + { "Gibraltar pound", "GIP" }, + { "Manx pound", "IMP" }, + { "Jersey pound", "JEP" }, + { "Lebanese pound", "LBP" }, + { "South Sudanese pound", "SSP" }, + { "Sudanese pound", "SDG" }, + { "Syrian pound", "SYP" }, + { "United States dollar", "USD" }, + { "Australian dollar", "AUD" }, + { "Bahamian dollar", "BSD" }, + { "Barbadian dollar", "BBD" }, + { "Belize dollar", "BZD" }, + { "Bermudian dollar", "BMD" }, + { "Brunei dollar", "BND" }, + { "Singapore dollar", "SGD" }, + { "Canadian dollar", "CAD" }, + { "Cayman Islands dollar", "KYD" }, + { "New Zealand dollar", "NZD" }, + { "Fijian dollar", "FJD" }, + { "Guyanese dollar", "GYD" }, + { "Hong Kong dollar", "HKD" }, + { "Jamaican dollar", "JMD" }, + { "Liberian dollar", "LRD" }, + { "Namibian dollar", "NAD" }, + { "Solomon Islands dollar", "SBD" }, + { "Surinamese dollar", "SRD" }, + { "New Taiwan dollar", "TWD" }, + { "Trinidad and Tobago dollar", "TTD" }, + { "Tuvaluan dollar", "TVD" }, + { "Chinese yuan", "CNY" }, + { "Rial", "__RI" }, + { "Shiling", "__S" }, + { "Som", "__SO" }, + { "Dirham", "__DR" }, + { "Dinar", "_DN" }, + { "Dollar", "__D" }, + { "Manat", "__MA" }, + { "Rupee", "__R" }, + { "Krone", "__K" }, + { "Krona", "__K" }, + { "Crown", "__K" }, + { "Frank", "__F" }, + { "Mark", "__M" }, + { "Ruble", "__RB" }, + { "Peso", "__PE" }, + { "Pound", "__P" }, + { "Tristan da Cunha pound", "_TP" }, + { "South Georgia and the South Sandwich Islands pound", "_SP" }, + { "Somaliland shilling", "_SS" }, + { "Pitcairn Islands dollar", "_PND" }, + { "Palauan dollar", "_PD" }, + { "Niue dollar", "_NID" }, + { "Nauruan dollar", "_ND" }, + { "Micronesian dollar", "_MD" }, + { "Kiribati dollar", "_KID" }, + { "Guernsey pound", "_GGP" }, + { "Faroese króna", "_FOK" }, + { "Cook Islands dollar", "_CKD" }, + { "British Virgin Islands dollar", "_BD" }, + { "Ascension pound", "_AP" }, + { "Alderney pound", "_ALP" }, + { "Abkhazian apsar", "_AA" } + }; + public static readonly Dictionary FractionalUnitNameToCodeMap = new Dictionary + { + { "Jiao", "JIAO" }, + { "Kopek", "KOPEK" }, + { "Pul", "PUL" }, + { "Cent", "CENT" }, + { "Qindarkë", "QINDARKE" }, + { "Penny", "PENNY" }, + { "Santeem", "SANTEEM" }, + { "Cêntimo", "CENTIMO" }, + { "Centavo", "CENTAVO" }, + { "Luma", "LUMA" }, + { "Qəpik", "QƏPIK" }, + { "Fils", "FILS" }, + { "Poisha", "POISHA" }, + { "Kapyeyka", "KAPYEYKA" }, + { "Centime", "CENTIME" }, + { "Chetrum", "CHETRUM" }, + { "Paisa", "PAISA" }, + { "Fening", "FENING" }, + { "Thebe", "THEBE" }, + { "Sen", "SEN" }, + { "Stotinka", "STOTINKA" }, + { "Fen", "FEN" }, + { "Céntimo", "CENTIMO" }, + { "Lipa", "LIPA" }, + { "Haléř", "HALER" }, + { "Øre", "ØRE" }, + { "Piastre", "PIASTRE" }, + { "Santim", "SANTIM" }, + { "Oyra", "OYRA" }, + { "Butut", "BUTUT" }, + { "Tetri", "TETRI" }, + { "Pesewa", "PESEWA" }, + { "Fillér", "FILLER" }, + { "Eyrir", "EYRIR" }, + { "Dinar", "DINAR" }, + { "Agora", "AGORA" }, + { "Tïın", "TIIN" }, + { "Chon", "CHON" }, + { "Jeon", "JEON" }, + { "Tyiyn", "TYIYN" }, + { "Att", "ATT" }, + { "Sente", "SENTE" }, + { "Dirham", "DIRHAM" }, + { "Rappen", "RAPPEN" }, + { "Avo", "AVO" }, + { "Deni", "DENI" }, + { "Iraimbilanja", "IRAIMBILANJA" }, + { "Tambala", "TAMBALA" }, + { "Laari", "LAARI" }, + { "Khoums", "KHOUMS" }, + { "Ban", "BAN" }, + { "Möngö", "MONGO" }, + { "Pya", "PYA" }, + { "Kobo", "KOBO" }, + { "Kuruş", "KURUS" }, + { "Baisa", "BAISA" }, + { "Centésimo", "CENTESIMO" }, + { "Toea", "TOEA" }, + { "Sentimo", "SENTIMO" }, + { "Grosz", "GROSZ" }, + { "Sene", "SENE" }, + { "Halala", "HALALA" }, + { "Para", "PARA" }, + { "Öre", "ORE" }, + { "Diram", "DIRAM" }, + { "Satang", "SATANG" }, + { "Seniti", "SENITI" }, + { "Millime", "MILLIME" }, + { "Tennesi", "TENNESI" }, + { "Kopiyka", "KOPIYKA" }, + { "Tiyin", "TIYIN" }, + { "Hào", "HAO" }, + { "Ngwee", "NGWEE" } + }; + public const string CompoundUnitConnectorRegex = @"(?and)"; public static readonly Dictionary CurrencyPrefixList = new Dictionary { { "Dollar", "$" }, diff --git a/.NET/Microsoft.Recognizers.Definitions/French/NumbersWithUnitDefinitions.cs b/.NET/Microsoft.Recognizers.Definitions/French/NumbersWithUnitDefinitions.cs index 01c72fbfd3..e576a4b535 100644 --- a/.NET/Microsoft.Recognizers.Definitions/French/NumbersWithUnitDefinitions.cs +++ b/.NET/Microsoft.Recognizers.Definitions/French/NumbersWithUnitDefinitions.cs @@ -267,6 +267,7 @@ public static class NumbersWithUnitDefinitions { "Jiao", "jiao" }, { "Mark Finlandais", "marks finlandais|mark finlandais|fim|mark" } }; + public const string CompoundUnitConnectorRegex = @"(?[^.])"; public static readonly Dictionary CurrencyPrefixList = new Dictionary { { "Dollar", "$" }, diff --git a/.NET/Microsoft.Recognizers.Definitions/German/NumbersWithUnitDefinitions.cs b/.NET/Microsoft.Recognizers.Definitions/German/NumbersWithUnitDefinitions.cs index eb79612101..9c7d3d90a0 100644 --- a/.NET/Microsoft.Recognizers.Definitions/German/NumbersWithUnitDefinitions.cs +++ b/.NET/Microsoft.Recognizers.Definitions/German/NumbersWithUnitDefinitions.cs @@ -290,6 +290,7 @@ public static class NumbersWithUnitDefinitions { "Finnish markka", "suomen markka|finnish markka|finsk mark|fim|markkaa|markka|finnische mark|finnischen mark" }, { "Penni", "penniä|penni" } }; + public const string CompoundUnitConnectorRegex = @"(?[^.])"; public static readonly Dictionary CurrencyPrefixList = new Dictionary { { "Dollar", "$" }, diff --git a/.NET/Microsoft.Recognizers.Definitions/Microsoft.Recognizers.Definitions.csproj b/.NET/Microsoft.Recognizers.Definitions/Microsoft.Recognizers.Definitions.csproj index 89a8403596..21039a3575 100644 --- a/.NET/Microsoft.Recognizers.Definitions/Microsoft.Recognizers.Definitions.csproj +++ b/.NET/Microsoft.Recognizers.Definitions/Microsoft.Recognizers.Definitions.csproj @@ -26,6 +26,11 @@ + + True + True + BaseCurrency.tt + BaseDateTime.tt True @@ -203,6 +208,10 @@ + + TextTemplatingFileGenerator + BaseCurrency.cs + TextTemplatingFileGenerator BaseDateTime.cs diff --git a/.NET/Microsoft.Recognizers.Definitions/Portuguese/NumbersWithUnitDefinitions.cs b/.NET/Microsoft.Recognizers.Definitions/Portuguese/NumbersWithUnitDefinitions.cs index a4a1ac4508..a975179152 100644 --- a/.NET/Microsoft.Recognizers.Definitions/Portuguese/NumbersWithUnitDefinitions.cs +++ b/.NET/Microsoft.Recognizers.Definitions/Portuguese/NumbersWithUnitDefinitions.cs @@ -347,6 +347,7 @@ public static class NumbersWithUnitDefinitions { "Kwacha zambiano", "kwacha zambiano|kwacha zambianos|kwachas zambianos|zmw" }, { "Ngwee zambiano", "ngwee zambiano|ngwee zambianos|ngwees zambianos" } }; + public const string CompoundUnitConnectorRegex = @"(?[^.])"; public static readonly Dictionary CurrencyPrefixList = new Dictionary { { "Dólar", "$" }, diff --git a/.NET/Microsoft.Recognizers.Definitions/Spanish/NumbersWithUnitDefinitions.cs b/.NET/Microsoft.Recognizers.Definitions/Spanish/NumbersWithUnitDefinitions.cs index 4f0730ec2b..d663111f98 100644 --- a/.NET/Microsoft.Recognizers.Definitions/Spanish/NumbersWithUnitDefinitions.cs +++ b/.NET/Microsoft.Recognizers.Definitions/Spanish/NumbersWithUnitDefinitions.cs @@ -354,6 +354,7 @@ public static class NumbersWithUnitDefinitions { "Kwacha zambiano", "kwacha zambiano|kwacha zambianos|zmw" }, { "Ngwee zambiano", "ngwee zambiano|ngwee zambianos" } }; + public const string CompoundUnitConnectorRegex = @"(?[^.])"; public static readonly Dictionary CurrencyPrefixList = new Dictionary { { "Dólar", "$" }, diff --git a/.NET/Microsoft.Recognizers.Text.DataDrivenTests/DateTime/TestDateTimeRecognizerInitialization.cs b/.NET/Microsoft.Recognizers.Text.DataDrivenTests/DateTime/TestDateTimeRecognizerInitialization.cs index 69849740bf..e9573c0a33 100644 --- a/.NET/Microsoft.Recognizers.Text.DataDrivenTests/DateTime/TestDateTimeRecognizerInitialization.cs +++ b/.NET/Microsoft.Recognizers.Text.DataDrivenTests/DateTime/TestDateTimeRecognizerInitialization.cs @@ -20,8 +20,8 @@ public class TestDateTimeRecognizerInitialization public TestDateTimeRecognizerInitialization() { controlModel = new DateTimeModel( - new BaseMergedParser(new EnglishMergedParserConfiguration(DateTimeOptions.None)), - new BaseMergedExtractor(new EnglishMergedExtractorConfiguration(DateTimeOptions.None))); + new BaseMergedDateTimeParser(new EnglishMergedParserConfiguration(DateTimeOptions.None)), + new BaseMergedDateTimeExtractor(new EnglishMergedExtractorConfiguration(DateTimeOptions.None))); } [TestMethod] diff --git a/.NET/Microsoft.Recognizers.Text.DataDrivenTests/NumberWithUnit/TestNumberWithUnit_English.cs b/.NET/Microsoft.Recognizers.Text.DataDrivenTests/NumberWithUnit/TestNumberWithUnit_English.cs index 96c078b44d..c9d729a96c 100644 --- a/.NET/Microsoft.Recognizers.Text.DataDrivenTests/NumberWithUnit/TestNumberWithUnit_English.cs +++ b/.NET/Microsoft.Recognizers.Text.DataDrivenTests/NumberWithUnit/TestNumberWithUnit_English.cs @@ -33,7 +33,7 @@ public void AgeModel() [TestMethod] public void CurrencyModel() { - base.TestNumberWithUnit(); + base.TestCurrency(); } [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "DimensionModel-English.csv", "DimensionModel-English#csv", DataAccessMethod.Sequential)] diff --git a/.NET/Microsoft.Recognizers.Text.DataDrivenTests/TestBase.cs b/.NET/Microsoft.Recognizers.Text.DataDrivenTests/TestBase.cs index 4dbe15db04..5aedb22f26 100644 --- a/.NET/Microsoft.Recognizers.Text.DataDrivenTests/TestBase.cs +++ b/.NET/Microsoft.Recognizers.Text.DataDrivenTests/TestBase.cs @@ -65,6 +65,12 @@ public void TestNumberWithUnit() ValidateResults(new string[] { ResolutionKey.Unit }); } + public void TestCurrency() + { + TestPreValidation(); + ValidateResults(new string[] { ResolutionKey.Unit, ResolutionKey.IsoCurrency }); + } + public void TestDateTime() { TestPreValidation(); @@ -294,6 +300,11 @@ private void ValidateResults(IEnumerable testResolutionKeys = null) foreach (var key in testResolutionKeys ?? Enumerable.Empty()) { + if (!actual.Resolution.ContainsKey(key) && !expected.Resolution.ContainsKey(key)) + { + continue; + } + Assert.AreEqual(expected.Resolution[key], actual.Resolution[key], GetMessage(TestSpec)); } } diff --git a/.NET/Microsoft.Recognizers.Text.DataDrivenTests/TestHelpers.cs b/.NET/Microsoft.Recognizers.Text.DataDrivenTests/TestHelpers.cs index e89d581d85..b8b02a8a59 100644 --- a/.NET/Microsoft.Recognizers.Text.DataDrivenTests/TestHelpers.cs +++ b/.NET/Microsoft.Recognizers.Text.DataDrivenTests/TestHelpers.cs @@ -216,9 +216,9 @@ public static IDateTimeExtractor GetEnglishExtractor(DateTimeExtractors extracto case DateTimeExtractors.Set: return new BaseSetExtractor(new EnglishSetExtractorConfiguration()); case DateTimeExtractors.Merged: - return new BaseMergedExtractor(new EnglishMergedExtractorConfiguration(DateTimeOptions.None)); + return new BaseMergedDateTimeExtractor(new EnglishMergedExtractorConfiguration(DateTimeOptions.None)); case DateTimeExtractors.MergedSkipFromTo: - return new BaseMergedExtractor(new EnglishMergedExtractorConfiguration(DateTimeOptions.SkipFromToMerge)); + return new BaseMergedDateTimeExtractor(new EnglishMergedExtractorConfiguration(DateTimeOptions.SkipFromToMerge)); } throw new Exception($"Extractor '{extractorName}' for English not supported"); @@ -250,7 +250,7 @@ public static IDateTimeParser GetEnglishParser(DateTimeParsers parserName) case DateTimeParsers.Set: return new BaseSetParser(new EnglishSetParserConfiguration(commonConfiguration)); case DateTimeParsers.Merged: - return new BaseMergedParser(new EnglishMergedParserConfiguration(DateTimeOptions.None)); + return new BaseMergedDateTimeParser(new EnglishMergedParserConfiguration(DateTimeOptions.None)); } throw new Exception($"Parser '{parserName}' for English not supported"); @@ -340,7 +340,7 @@ public static IDateTimeExtractor GetSpanishExtractor(DateTimeExtractors extracto case DateTimeExtractors.Set: return new BaseSetExtractor(new SpanishSetExtractorConfiguration()); case DateTimeExtractors.Merged: - return new BaseMergedExtractor(new SpanishMergedExtractorConfiguration(DateTimeOptions.None)); + return new BaseMergedDateTimeExtractor(new SpanishMergedExtractorConfiguration(DateTimeOptions.None)); } throw new Exception($"Extractor '{extractorName}' for Spanish not supported"); @@ -371,7 +371,7 @@ public static IDateTimeParser GetSpanishParser(DateTimeParsers parserName) case DateTimeParsers.Set: return new BaseSetParser(new SpanishSetParserConfiguration(commonConfiguration)); case DateTimeParsers.Merged: - return new BaseMergedParser(new SpanishMergedParserConfiguration(DateTimeOptions.None)); + return new BaseMergedDateTimeParser(new SpanishMergedParserConfiguration(DateTimeOptions.None)); } throw new Exception($"Parser '{parserName}' for Spanish not supported"); @@ -400,7 +400,7 @@ public static IDateTimeExtractor GetPortugueseExtractor(DateTimeExtractors extra case DateTimeExtractors.Set: return new BaseSetExtractor(new PortugueseSetExtractorConfiguration()); case DateTimeExtractors.Merged: - return new BaseMergedExtractor(new PortugueseMergedExtractorConfiguration(DateTimeOptions.None)); + return new BaseMergedDateTimeExtractor(new PortugueseMergedExtractorConfiguration(DateTimeOptions.None)); } throw new Exception($"Extractor '{extractorName}' for Portuguese not supported"); @@ -431,7 +431,7 @@ public static IDateTimeParser GetPortugueseParser(DateTimeParsers parserName) case DateTimeParsers.Set: return new BaseSetParser(new PortugueseSetParserConfiguration(commonConfiguration)); case DateTimeParsers.Merged: - return new BaseMergedParser(new PortugueseMergedParserConfiguration(DateTimeOptions.None)); + return new BaseMergedDateTimeParser(new PortugueseMergedParserConfiguration(DateTimeOptions.None)); } throw new Exception($"Parser '{parserName}' for Portuguese not supported"); @@ -460,9 +460,9 @@ public static IDateTimeExtractor GetFrenchExtractor(DateTimeExtractors extractor case DateTimeExtractors.Set: return new BaseSetExtractor(new FrenchSetExtractorConfiguration()); case DateTimeExtractors.Merged: - return new BaseMergedExtractor(new FrenchMergedExtractorConfiguration(DateTimeOptions.None)); + return new BaseMergedDateTimeExtractor(new FrenchMergedExtractorConfiguration(DateTimeOptions.None)); case DateTimeExtractors.MergedSkipFromTo: - return new BaseMergedExtractor(new FrenchMergedExtractorConfiguration(DateTimeOptions.SkipFromToMerge)); + return new BaseMergedDateTimeExtractor(new FrenchMergedExtractorConfiguration(DateTimeOptions.SkipFromToMerge)); } throw new Exception($"Extractor '{extractorName}' for French not supported"); @@ -492,7 +492,7 @@ public static IDateTimeParser GetFrenchParser(DateTimeParsers parserName) case DateTimeParsers.Set: return new BaseSetParser(new FrenchSetParserConfiguration(commonConfiguration)); case DateTimeParsers.Merged: - return new BaseMergedParser(new FrenchMergedParserConfiguration(DateTimeOptions.None)); + return new BaseMergedDateTimeParser(new FrenchMergedParserConfiguration(DateTimeOptions.None)); } throw new Exception($"Parser '{parserName}' for French not supported"); @@ -521,9 +521,9 @@ public static IDateTimeExtractor GetGermanExtractor(DateTimeExtractors extractor case DateTimeExtractors.Set: return new BaseSetExtractor(new GermanSetExtractorConfiguration()); case DateTimeExtractors.Merged: - return new BaseMergedExtractor(new GermanMergedExtractorConfiguration(DateTimeOptions.None)); + return new BaseMergedDateTimeExtractor(new GermanMergedExtractorConfiguration(DateTimeOptions.None)); case DateTimeExtractors.MergedSkipFromTo: - return new BaseMergedExtractor(new GermanMergedExtractorConfiguration(DateTimeOptions.SkipFromToMerge)); + return new BaseMergedDateTimeExtractor(new GermanMergedExtractorConfiguration(DateTimeOptions.SkipFromToMerge)); } throw new Exception($"Extractor '{extractorName}' for German not supported"); @@ -553,7 +553,7 @@ public static IDateTimeParser GetGermanParser(DateTimeParsers parserName) case DateTimeParsers.Set: return new BaseSetParser(new GermanSetParserConfiguration(commonConfiguration)); case DateTimeParsers.Merged: - return new BaseMergedParser(new GermanMergedParserConfiguration(DateTimeOptions.None)); + return new BaseMergedDateTimeParser(new GermanMergedParserConfiguration(DateTimeOptions.None)); } throw new Exception($"Parser '{parserName}' for German not supported"); diff --git a/.NET/Microsoft.Recognizers.Text.DateTime/Chinese/Parsers/MergedParserChs.cs b/.NET/Microsoft.Recognizers.Text.DateTime/Chinese/Parsers/MergedDateTimeParserChs.cs similarity index 96% rename from .NET/Microsoft.Recognizers.Text.DateTime/Chinese/Parsers/MergedParserChs.cs rename to .NET/Microsoft.Recognizers.Text.DateTime/Chinese/Parsers/MergedDateTimeParserChs.cs index 8924ba3b73..f8327c6dec 100644 --- a/.NET/Microsoft.Recognizers.Text.DateTime/Chinese/Parsers/MergedParserChs.cs +++ b/.NET/Microsoft.Recognizers.Text.DateTime/Chinese/Parsers/MergedDateTimeParserChs.cs @@ -6,7 +6,7 @@ namespace Microsoft.Recognizers.Text.DateTime.Chinese { - public class MergedParserChs : BaseMergedParser + public class MergedDateTimeParserChs : BaseMergedDateTimeParser { private static readonly Regex BeforeRegex = new Regex(DateTimeDefinitions.MergedBeforeRegex, RegexOptions.IgnoreCase | RegexOptions.Singleline); @@ -15,7 +15,7 @@ public class MergedParserChs : BaseMergedParser //TODO implement SinceRegex private static readonly Regex SinceRegex = new Regex(DateTimeDefinitions.MergedAfterRegex, RegexOptions.IgnoreCase | RegexOptions.Singleline); - public MergedParserChs(IMergedParserConfiguration configuration) : base(configuration) { } + public MergedDateTimeParserChs(IMergedParserConfiguration configuration) : base(configuration) { } public new ParseResult Parse(ExtractResult er) { diff --git a/.NET/Microsoft.Recognizers.Text.DateTime/Constants.cs b/.NET/Microsoft.Recognizers.Text.DateTime/Constants.cs index 33ad1d2d27..8e01cbaa75 100644 --- a/.NET/Microsoft.Recognizers.Text.DateTime/Constants.cs +++ b/.NET/Microsoft.Recognizers.Text.DateTime/Constants.cs @@ -37,7 +37,7 @@ public static class Constants public const string SubType = "subType"; // Comment - internal tag used during entity processing, never exposed to users. - // Tags are filtered out in BaseMergedParser DateTimeResolution() + // Tags are filtered out in BaseMergedDateTimeParser DateTimeResolution() public const string Comment = "Comment"; // AmPm time representation for time parser public const string Comment_AmPm = "ampm"; diff --git a/.NET/Microsoft.Recognizers.Text.DateTime/DateTimeRecognizer.cs b/.NET/Microsoft.Recognizers.Text.DateTime/DateTimeRecognizer.cs index b90f4afe12..4ed00e08e4 100644 --- a/.NET/Microsoft.Recognizers.Text.DateTime/DateTimeRecognizer.cs +++ b/.NET/Microsoft.Recognizers.Text.DateTime/DateTimeRecognizer.cs @@ -48,8 +48,8 @@ protected override void InitializeConfiguration() RegisterModel( Culture.English, (options) => new DateTimeModel( - new BaseMergedParser(new EnglishMergedParserConfiguration(options)), - new BaseMergedExtractor(new EnglishMergedExtractorConfiguration(options)))); + new BaseMergedDateTimeParser(new EnglishMergedParserConfiguration(options)), + new BaseMergedDateTimeExtractor(new EnglishMergedExtractorConfiguration(options)))); RegisterModel( Culture.Chinese, @@ -60,26 +60,26 @@ protected override void InitializeConfiguration() RegisterModel( Culture.Spanish, (options) => new DateTimeModel( - new BaseMergedParser(new SpanishMergedParserConfiguration(options)), - new BaseMergedExtractor(new SpanishMergedExtractorConfiguration(options)))); + new BaseMergedDateTimeParser(new SpanishMergedParserConfiguration(options)), + new BaseMergedDateTimeExtractor(new SpanishMergedExtractorConfiguration(options)))); RegisterModel( Culture.French, (options) => new DateTimeModel( - new BaseMergedParser(new FrenchMergedParserConfiguration(options)), - new BaseMergedExtractor(new FrenchMergedExtractorConfiguration(options)))); + new BaseMergedDateTimeParser(new FrenchMergedParserConfiguration(options)), + new BaseMergedDateTimeExtractor(new FrenchMergedExtractorConfiguration(options)))); RegisterModel( Culture.Portuguese, (options) => new DateTimeModel( - new BaseMergedParser(new PortugueseMergedParserConfiguration(options)), - new BaseMergedExtractor(new PortugueseMergedExtractorConfiguration(options)))); + new BaseMergedDateTimeParser(new PortugueseMergedParserConfiguration(options)), + new BaseMergedDateTimeExtractor(new PortugueseMergedExtractorConfiguration(options)))); RegisterModel( Culture.German, (options) => new DateTimeModel( - new BaseMergedParser(new GermanMergedParserConfiguration(options)), - new BaseMergedExtractor(new GermanMergedExtractorConfiguration(options)))); + new BaseMergedDateTimeParser(new GermanMergedParserConfiguration(options)), + new BaseMergedDateTimeExtractor(new GermanMergedExtractorConfiguration(options)))); } } } \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Text.DateTime/Extractors/BaseMergedExtractor.cs b/.NET/Microsoft.Recognizers.Text.DateTime/Extractors/BaseMergedDateTimeExtractor.cs similarity index 97% rename from .NET/Microsoft.Recognizers.Text.DateTime/Extractors/BaseMergedExtractor.cs rename to .NET/Microsoft.Recognizers.Text.DateTime/Extractors/BaseMergedDateTimeExtractor.cs index a1daad5562..646af3e3e4 100644 --- a/.NET/Microsoft.Recognizers.Text.DateTime/Extractors/BaseMergedExtractor.cs +++ b/.NET/Microsoft.Recognizers.Text.DateTime/Extractors/BaseMergedDateTimeExtractor.cs @@ -7,18 +7,18 @@ namespace Microsoft.Recognizers.Text.DateTime { - public class BaseMergedExtractor : IDateTimeExtractor + public class BaseMergedDateTimeExtractor : IDateTimeExtractor { private readonly IMergedExtractorConfiguration config; - public BaseMergedExtractor(IMergedExtractorConfiguration config) + public BaseMergedDateTimeExtractor(IMergedExtractorConfiguration config) { this.config = config; } public List Extract(string text) { - return Extract(text, DateObject.Now); + return Extract(text, DateObject.Now); } public List Extract(string text, DateObject reference) @@ -34,28 +34,28 @@ public List Extract(string text, DateObject reference) AddTo(ret, this.config.TimePeriodExtractor.Extract(text, reference), text); AddTo(ret, this.config.DateTimePeriodExtractor.Extract(text, reference), text); AddTo(ret, this.config.SetExtractor.Extract(text, reference), text); - AddTo(ret, this.config.HolidayExtractor.Extract(text, reference), text); - - if ((this.config.Options & DateTimeOptions.EnablePreview) != 0) - { - AddTo(ret, this.config.TimeZoneExtractor.Extract(text, reference), text); - } - - // This should be at the end since if need the extractor to determine the previous text contains time or not - AddTo(ret, NumberEndingRegexMatch(text, ret), text); - - // modify time entity to an alternative DateTime expression if it follows a DateTime entity - if ((this.config.Options & DateTimeOptions.ExtendedTypes) != 0) - { - ret = this.config.DateTimeAltExtractor.Extract(ret, text, reference); + AddTo(ret, this.config.HolidayExtractor.Extract(text, reference), text); + + if ((this.config.Options & DateTimeOptions.EnablePreview) != 0) + { + AddTo(ret, this.config.TimeZoneExtractor.Extract(text, reference), text); + } + + // This should be at the end since if need the extractor to determine the previous text contains time or not + AddTo(ret, NumberEndingRegexMatch(text, ret), text); + + // modify time entity to an alternative DateTime expression if it follows a DateTime entity + if ((this.config.Options & DateTimeOptions.ExtendedTypes) != 0) + { + ret = this.config.DateTimeAltExtractor.Extract(ret, text, reference); } AddMod(ret, text); // filtering - if ((this.config.Options & DateTimeOptions.CalendarMode) != 0) - { - CheckCalendarFilterList(ret, text); + if ((this.config.Options & DateTimeOptions.CalendarMode) != 0) + { + CheckCalendarFilterList(ret, text); } ret = ret.OrderBy(p => p.Start).ToList(); @@ -63,19 +63,19 @@ public List Extract(string text, DateObject reference) return ret; } - private void CheckCalendarFilterList(List ers, string text) - { - foreach (var er in ers.Reverse()) - { - foreach (var negRegex in this.config.FilterWordRegexList) - { - var match = negRegex.Match(er.Text); - if (match.Success) - { - ers.Remove(er); - } - } - } + private void CheckCalendarFilterList(List ers, string text) + { + foreach (var er in ers.Reverse()) + { + foreach (var negRegex in this.config.FilterWordRegexList) + { + var match = negRegex.Match(er.Text); + if (match.Success) + { + ers.Remove(er); + } + } + } } private void AddTo(List dst, List src, string text) @@ -91,9 +91,9 @@ private void AddTo(List dst, List src, string text } // comment this code for now - //if (FilterAmbiguousSingleWord(result, text)) - //{ - // continue; + //if (FilterAmbiguousSingleWord(result, text)) + //{ + // continue; //} var isFound = false; @@ -146,7 +146,7 @@ private bool ShouldSkipFromToMerge(ExtractResult er) { return config.FromToRegex.IsMatch(er.Text); } - private bool FilterAmbiguousSingleWord(ExtractResult er, string text) + private bool FilterAmbiguousSingleWord(ExtractResult er, string text) { if (config.SingleAmbiguousMonthRegex.IsMatch(er.Text.ToLowerInvariant())) { @@ -164,29 +164,29 @@ private bool FilterAmbiguousSingleWord(ExtractResult er, string text) private List NumberEndingRegexMatch(string text, List extractResults) { var tokens = new List(); - - foreach (var extractResult in extractResults) - { - if (extractResult.Type.Equals(Constants.SYS_DATETIME_TIME) - || extractResult.Type.Equals(Constants.SYS_DATETIME_DATETIME)) - { - var stringAfter = text.Substring((int)extractResult.Start + (int)extractResult.Length); - var match = this.config.NumberEndingPattern.Match(stringAfter); - if (match != null && match.Success) - { - var newTime = match.Groups["newTime"]; - var numRes = this.config.IntegerExtractor.Extract(newTime.ToString()); - if (numRes.Count == 0) - { - continue; - } - - var startPosition = (int)extractResult.Start + (int)extractResult.Length + newTime.Index; - tokens.Add(new Token(startPosition, startPosition + newTime.Length)); - } - } - } - + + foreach (var extractResult in extractResults) + { + if (extractResult.Type.Equals(Constants.SYS_DATETIME_TIME) + || extractResult.Type.Equals(Constants.SYS_DATETIME_DATETIME)) + { + var stringAfter = text.Substring((int)extractResult.Start + (int)extractResult.Length); + var match = this.config.NumberEndingPattern.Match(stringAfter); + if (match != null && match.Success) + { + var newTime = match.Groups["newTime"]; + var numRes = this.config.IntegerExtractor.Extract(newTime.ToString()); + if (numRes.Count == 0) + { + continue; + } + + var startPosition = (int)extractResult.Start + (int)extractResult.Length + newTime.Index; + tokens.Add(new Token(startPosition, startPosition + newTime.Length)); + } + } + } + return Token.MergeAllTokens(tokens, text, Constants.SYS_DATETIME_TIME); } @@ -195,24 +195,24 @@ private void AddMod(List ers, string text) var lastEnd = 0; foreach (var er in ers) { - var beforeStr = text.Substring(lastEnd, er.Start ?? 0).ToLowerInvariant(); - + var beforeStr = text.Substring(lastEnd, er.Start ?? 0).ToLowerInvariant(); + if (HasTokenIndex(beforeStr.TrimEnd(), config.BeforeRegex, out int tokenIndex)) { var modLengh = beforeStr.Length - tokenIndex; er.Length += modLengh; er.Start -= modLengh; er.Text = text.Substring(er.Start ?? 0, er.Length ?? 0); - } - + } + if (HasTokenIndex(beforeStr.TrimEnd(), config.AfterRegex, out tokenIndex)) { var modLengh = beforeStr.Length - tokenIndex; er.Length += modLengh; er.Start -= modLengh; er.Text = text.Substring(er.Start ?? 0, er.Length ?? 0); - } - + } + if (HasTokenIndex(beforeStr.TrimEnd(), config.SinceRegex, out tokenIndex)) { var modLengh = beforeStr.Length - tokenIndex; @@ -221,18 +221,18 @@ private void AddMod(List ers, string text) er.Text = text.Substring(er.Start ?? 0, er.Length ?? 0); } - if (er.Type.Equals(Constants.SYS_DATETIME_DATEPERIOD)) - { - // 2012 or after/above - var afterStr = text.Substring((er.Start ?? 0) + (er.Length ?? 0)).ToLowerInvariant(); - - var match = config.YearAfterRegex.Match(afterStr.TrimStart()); - if (match.Success && match.Index == 0) - { - var modLengh = match.Length + afterStr.IndexOf(match.Value); - er.Length += modLengh; - er.Text = text.Substring(er.Start ?? 0, er.Length ?? 0); - } + if (er.Type.Equals(Constants.SYS_DATETIME_DATEPERIOD)) + { + // 2012 or after/above + var afterStr = text.Substring((er.Start ?? 0) + (er.Length ?? 0)).ToLowerInvariant(); + + var match = config.YearAfterRegex.Match(afterStr.TrimStart()); + if (match.Success && match.Index == 0) + { + var modLengh = match.Length + afterStr.IndexOf(match.Value); + er.Length += modLengh; + er.Text = text.Substring(er.Start ?? 0, er.Length ?? 0); + } } } } diff --git a/.NET/Microsoft.Recognizers.Text.DateTime/Parsers/BaseMergedParser.cs b/.NET/Microsoft.Recognizers.Text.DateTime/Parsers/BaseMergedDateTimeParser.cs similarity index 96% rename from .NET/Microsoft.Recognizers.Text.DateTime/Parsers/BaseMergedParser.cs rename to .NET/Microsoft.Recognizers.Text.DateTime/Parsers/BaseMergedDateTimeParser.cs index fe5946f647..0f3ef9bc32 100644 --- a/.NET/Microsoft.Recognizers.Text.DateTime/Parsers/BaseMergedParser.cs +++ b/.NET/Microsoft.Recognizers.Text.DateTime/Parsers/BaseMergedDateTimeParser.cs @@ -1,704 +1,704 @@ -using System.Collections.Generic; -using System.Linq; -using System.Globalization; -using System.Text.RegularExpressions; - -using DateObject = System.DateTime; - -namespace Microsoft.Recognizers.Text.DateTime -{ - public class BaseMergedParser : IDateTimeParser - { - public const string ParserTypeName = "datetimeV2"; - - protected readonly IMergedParserConfiguration Config; - - public static readonly string DateMinString = FormatUtil.FormatDate(DateObject.MinValue); - public static readonly string DateTimeMinString = FormatUtil.FormatDateTime(DateObject.MinValue); - private static readonly Calendar Cal = DateTimeFormatInfo.InvariantInfo.Calendar; - - public BaseMergedParser(IMergedParserConfiguration configuration) - { - Config = configuration; - } - - public ParseResult Parse(ExtractResult er) - { - return Parse(er, DateObject.Now); - } - - public DateTimeParseResult Parse(ExtractResult er, DateObject refTime) - { - var referenceTime = refTime; - DateTimeParseResult pr = null; - - // Push, save the MOD string - bool hasBefore = false, hasAfter = false, hasSince = false, hasYearAfter = false; - var modStr = string.Empty; - var beforeMatch = Config.BeforeRegex.Match(er.Text); - var afterMatch = Config.AfterRegex.Match(er.Text); - var sinceMatch = Config.SinceRegex.Match(er.Text); - - if (beforeMatch.Success && beforeMatch.Index==0) - { - hasBefore = true; - er.Start += beforeMatch.Length; - er.Length -= beforeMatch.Length; - er.Text = er.Text.Substring(beforeMatch.Length); - modStr = beforeMatch.Value; - } - else if (afterMatch.Success && afterMatch.Index == 0) - { - hasAfter = true; - er.Start += afterMatch.Length; - er.Length -= afterMatch.Length; - er.Text = er.Text.Substring(afterMatch.Length); - modStr = afterMatch.Value; - } - else if (sinceMatch.Success && sinceMatch.Index == 0) - { - hasSince = true; - er.Start += sinceMatch.Length; - er.Length -= sinceMatch.Length; - er.Text = er.Text.Substring(sinceMatch.Length); - modStr = sinceMatch.Value; - } - else if (er.Type.Equals(Constants.SYS_DATETIME_DATEPERIOD) && Config.YearRegex.Match(er.Text).Success) - { - // This has to be put at the end of the if, or cases like "before 2012" and "after 2012" would fall into this - // 2012 or after/above - var match = Config.YearAfterRegex.Match(er.Text); - if (match.Success && er.Text.EndsWith(match.Value)) - { - hasYearAfter = true; - er.Length -= match.Length; - er.Text = er.Text.Substring(0, er.Length ?? 0); - modStr = match.Value; - } - } - - if (er.Type.Equals(Constants.SYS_DATETIME_DATE)) - { - pr = this.Config.DateParser.Parse(er, referenceTime); - if (pr.Value == null) - { - pr = Config.HolidayParser.Parse(er, referenceTime); - } - } - else if (er.Type.Equals(Constants.SYS_DATETIME_TIME)) - { - pr = this.Config.TimeParser.Parse(er, referenceTime); - } - else if (er.Type.Equals(Constants.SYS_DATETIME_DATETIME)) - { - pr = this.Config.DateTimeParser.Parse(er, referenceTime); - } - else if (er.Type.Equals(Constants.SYS_DATETIME_DATEPERIOD)) - { - pr = this.Config.DatePeriodParser.Parse(er, referenceTime); - } - else if (er.Type.Equals(Constants.SYS_DATETIME_TIMEPERIOD)) - { - pr = this.Config.TimePeriodParser.Parse(er, referenceTime); - } - else if (er.Type.Equals(Constants.SYS_DATETIME_DATETIMEPERIOD)) - { - pr = this.Config.DateTimePeriodParser.Parse(er, referenceTime); - } - else if (er.Type.Equals(Constants.SYS_DATETIME_DURATION)) - { - pr = this.Config.DurationParser.Parse(er, referenceTime); - } - else if (er.Type.Equals(Constants.SYS_DATETIME_SET)) - { - pr = this.Config.GetParser.Parse(er, referenceTime); - } - else if (er.Type.Equals(Constants.SYS_DATETIME_DATETIMEALT)) - { - pr = this.Config.DateTimeAltParser.Parse(er, referenceTime); - } - else if (er.Type.Equals(Constants.SYS_DATETIME_TIMEZONE)) - { - if ((Config.Options & DateTimeOptions.EnablePreview) != 0) - { - pr = this.Config.TimeZoneParser.Parse(er, referenceTime); - } - } - else - { - return null; - } - - // Pop, restore the MOD string - if (hasBefore && pr.Value != null) - { - pr.Length += modStr.Length; - pr.Start -= modStr.Length; - pr.Text = modStr + pr.Text; - var val = (DateTimeResolutionResult) pr.Value; - val.Mod = Constants.BEFORE_MOD; - pr.Value = val; - } - - if (hasAfter && pr.Value != null) - { - pr.Length += modStr.Length; - pr.Start -= modStr.Length; - pr.Text = modStr + pr.Text; - var val = (DateTimeResolutionResult) pr.Value; - val.Mod = Constants.AFTER_MOD; - pr.Value = val; - } - - if (hasSince && pr.Value != null) - { - pr.Length += modStr.Length; - pr.Start -= modStr.Length; - pr.Text = modStr + pr.Text; - var val = (DateTimeResolutionResult)pr.Value; - val.Mod = Constants.SINCE_MOD; - pr.Value = val; - } - - if (hasYearAfter && pr.Value != null) - { - pr.Length += modStr.Length; - pr.Text = pr.Text + modStr; - var val = (DateTimeResolutionResult)pr.Value; - val.Mod = Constants.SINCE_MOD; - pr.Value = val; - hasSince = true; - } - - if ((Config.Options & DateTimeOptions.SplitDateAndTime) != 0 && - ((DateTimeResolutionResult)pr.Value)?.SubDateTimeEntities != null) - { - pr.Value = DateTimeResolutionForSplit(pr); - } - else - { - pr = SetParseResult(pr, hasBefore, hasAfter, hasSince); - } - - return pr; - } - - public List FilterResults(string query, List candidateResults) - { - - if (candidateResults != null && candidateResults.Any()) - { - - var matches = Config.AmbiguousMonthP0Regex.Matches(query); - - foreach (Match match in matches) - { - - // Check for intersections/overlaps - candidateResults = candidateResults.Where(c => !( match.Index < c.Start + c.Length && - c.Start < match.Index + match.Length )).ToList(); - } - - } - - return candidateResults; - } - - public DateTimeParseResult SetParseResult(DateTimeParseResult slot, bool hasBefore, bool hasAfter, bool hasSince) - { - slot.Value = DateTimeResolution(slot, hasBefore, hasAfter, hasSince); - - // Change the type at last for the after or before modes - slot.Type = $"{ParserTypeName}.{DetermineDateTimeType(slot.Type, hasBefore, hasAfter, hasSince)}"; - return slot; - } - - public string DetermineDateTimeType(string type, bool hasBefore, bool hasAfter, bool hasSince) - { - if ((Config.Options & DateTimeOptions.SplitDateAndTime) != 0) - { - if (type.Equals(Constants.SYS_DATETIME_DATETIME)) - { - return Constants.SYS_DATETIME_TIME; - } - } - else - { - if (hasBefore || hasAfter || hasSince) - { - if (type.Equals(Constants.SYS_DATETIME_DATE)) - { - return Constants.SYS_DATETIME_DATEPERIOD; - } - - if (type.Equals(Constants.SYS_DATETIME_TIME)) - { - return Constants.SYS_DATETIME_TIMEPERIOD; - } - - if (type.Equals(Constants.SYS_DATETIME_DATETIME)) - { - return Constants.SYS_DATETIME_DATETIMEPERIOD; - } - } - } - - return type; - } - - public List DateTimeResolutionForSplit(DateTimeParseResult slot) - { - var results = new List(); - if (((DateTimeResolutionResult) slot.Value).SubDateTimeEntities != null) - { - var subEntities = ((DateTimeResolutionResult) slot.Value).SubDateTimeEntities; - foreach (var subEntity in subEntities) - { - var result = (DateTimeParseResult) subEntity; - results.AddRange(DateTimeResolutionForSplit(result)); - } - } - else - { - slot.Value = DateTimeResolution(slot, false, false, false); - slot.Type = $"{ParserTypeName}.{DetermineDateTimeType(slot.Type, false, false, false)}"; - results.Add(slot); - } - - return results; - } - - public SortedDictionary DateTimeResolution(DateTimeParseResult slot, bool hasBefore, bool hasAfter, bool hasSince) - { - if (slot == null) - { - return null; - } - var resolutions = new List>(); - var res = new Dictionary(); - - var type = slot.Type; - var typeOutput = DetermineDateTimeType(slot.Type, hasBefore, hasAfter, hasSince); - var timex = slot.TimexStr; - - var val = (DateTimeResolutionResult) slot.Value; - if (val == null) - { - return null; - } - - var islunar = val.IsLunar; - var mod = val.Mod; - var comment = val.Comment; - - // The following should be added to res first, since ResolveAmPm requires these fields. - AddResolutionFields(res, DateTimeResolutionKey.Timex, timex); - AddResolutionFields(res, Constants.Comment, comment); - AddResolutionFields(res, DateTimeResolutionKey.Mod, mod); - AddResolutionFields(res, ResolutionKey.Type, typeOutput); - AddResolutionFields(res, DateTimeResolutionKey.IsLunar, islunar? islunar.ToString():string.Empty); - - var pastResolutionStr = ((DateTimeResolutionResult) slot.Value).PastResolution; - var futureResolutionStr = ((DateTimeResolutionResult) slot.Value).FutureResolution; - - if (typeOutput == Constants.SYS_DATETIME_DATETIMEALT && pastResolutionStr.Count > 0) - { - typeOutput = DetermineResolutionDateTimeType(pastResolutionStr); - } - - var resolutionPast = GenerateResolution(type, pastResolutionStr, mod); - var resolutionFuture = GenerateResolution(type, futureResolutionStr, mod); - - // If past and future are same, keep only one - if (resolutionFuture.OrderBy(t => t.Key).Select(t => t.Value) - .SequenceEqual(resolutionPast.OrderBy(t => t.Key).Select(t => t.Value))) - { - if (resolutionPast.Count > 0) - { - AddResolutionFields(res, Constants.Resolve, resolutionPast); - } - } - else - { - if (resolutionPast.Count > 0) - { - AddResolutionFields(res, Constants.ResolveToPast, resolutionPast); - } - - if (resolutionFuture.Count > 0) - { - AddResolutionFields(res, Constants.ResolveToFuture, resolutionFuture); - } - } - - // If 'ampm', double our resolution accordingly - if (!string.IsNullOrEmpty(comment) && comment.Equals(Constants.Comment_AmPm)) - { - if (res.ContainsKey(Constants.Resolve)) - { - ResolveAmpm(res, Constants.Resolve); - } - else - { - ResolveAmpm(res, Constants.ResolveToPast); - ResolveAmpm(res, Constants.ResolveToFuture); - } - } - - // If WeekOf and in CalendarMode, modify the past part of our resolution - if ((Config.Options & DateTimeOptions.CalendarMode) != 0 && - !string.IsNullOrEmpty(comment) && comment.Equals(Constants.Comment_WeekOf)) - { - ResolveWeekOf(res, Constants.ResolveToPast); - } - - if (val.TimeZoneResolution != null) - { - var timeZoneResolution = new Dictionary(); - timeZoneResolution.Add(ResolutionKey.Value, val.TimeZoneResolution.Value); - timeZoneResolution.Add(Constants.UtcOffsetMinsKey, val.TimeZoneResolution.UtcOffsetMins.ToString()); - - AddResolutionFields(res, Constants.ResolveTimeZone, timeZoneResolution); - } - - foreach (var p in res) - { - if (p.Value is Dictionary) - { - var value = new Dictionary(); - - AddResolutionFields(value, DateTimeResolutionKey.Timex, timex); - AddResolutionFields(value, DateTimeResolutionKey.Mod, mod); - AddResolutionFields(value, ResolutionKey.Type, typeOutput); - AddResolutionFields(value, DateTimeResolutionKey.IsLunar, islunar ? islunar.ToString() : string.Empty); - - foreach (var q in (Dictionary) p.Value) - { - if (value.ContainsKey(q.Key)) - { - value[q.Key] = q.Value; - } - else - { - value.Add(q.Key, q.Value); - } - } - - resolutions.Add(value); - } - } - - if (resolutionPast.Count == 0 && resolutionFuture.Count == 0 && val.TimeZoneResolution == null) - { - var notResolved = new Dictionary { - { - DateTimeResolutionKey.Timex, timex - }, - { - ResolutionKey.Type, typeOutput - }, - { - ResolutionKey.Value, "not resolved" - } - }; - - resolutions.Add(notResolved); - } - - return new SortedDictionary { { ResolutionKey.ValueSet, resolutions } }; - } - - private string DetermineResolutionDateTimeType(Dictionary pastResolutionStr) - { - switch (pastResolutionStr.Keys.First()) - { - case TimeTypeConstants.START_DATE: - return Constants.SYS_DATETIME_DATEPERIOD; - - case TimeTypeConstants.START_DATETIME: - return Constants.SYS_DATETIME_DATETIMEPERIOD; - - case TimeTypeConstants.START_TIME: - return Constants.SYS_DATETIME_TIMEPERIOD; - - default: - return pastResolutionStr.Keys.First().ToLower(); - } - } - - internal void AddResolutionFields(Dictionary dic, string key, object value) - { - if (value is string) - { - if (!string.IsNullOrEmpty((string)value)) - { - dic.Add(key, value); - } - } - else - { - dic.Add(key, value); - } - } - - internal void AddResolutionFields(Dictionary dic, string key, string value) - { - if (!string.IsNullOrEmpty(value)) - { - dic.Add(key, value); - } - } - - internal void ResolveAmpm(Dictionary resolutionDic, string keyName) - { - if (resolutionDic.ContainsKey(keyName)) - { - var resolution = (Dictionary) resolutionDic[keyName]; - if (!resolutionDic.ContainsKey(DateTimeResolutionKey.Timex)) - { - return; - } - - var timex = (string) resolutionDic[DateTimeResolutionKey.Timex]; - resolutionDic.Remove(keyName); - - resolutionDic.Add(keyName + "Am", resolution); - - var resolutionPm = new Dictionary(); - - switch ((string) resolutionDic[ResolutionKey.Type]) - { - case Constants.SYS_DATETIME_TIME: - resolutionPm[ResolutionKey.Value] = FormatUtil.ToPm(resolution[ResolutionKey.Value]); - resolutionPm[DateTimeResolutionKey.Timex] = FormatUtil.ToPm(timex); - break; - - case Constants.SYS_DATETIME_DATETIME: - var splited = resolution[ResolutionKey.Value].Split(' '); - resolutionPm[ResolutionKey.Value] = splited[0] + " " + FormatUtil.ToPm(splited[1]); - resolutionPm[DateTimeResolutionKey.Timex] = FormatUtil.AllStringToPm(timex); - break; - - case Constants.SYS_DATETIME_TIMEPERIOD: - if (resolution.ContainsKey(DateTimeResolutionKey.START)) - { - resolutionPm[DateTimeResolutionKey.START] = FormatUtil.ToPm(resolution[DateTimeResolutionKey.START]); - } - - if (resolution.ContainsKey(DateTimeResolutionKey.END)) - { - resolutionPm[DateTimeResolutionKey.END] = FormatUtil.ToPm(resolution[DateTimeResolutionKey.END]); - } - - resolutionPm[DateTimeResolutionKey.Timex] = FormatUtil.AllStringToPm(timex); - break; - - case Constants.SYS_DATETIME_DATETIMEPERIOD: - if (resolution.ContainsKey(DateTimeResolutionKey.START)) - { - splited = resolution[DateTimeResolutionKey.START].Split(' '); - if (resolution.ContainsKey(DateTimeResolutionKey.START)) - { - resolutionPm[DateTimeResolutionKey.START] = splited[0] + " " + FormatUtil.ToPm(splited[1]); - } - } - - if (resolution.ContainsKey(DateTimeResolutionKey.END)) - { - splited = resolution[DateTimeResolutionKey.END].Split(' '); - - if (resolution.ContainsKey(DateTimeResolutionKey.END)) - { - resolutionPm[DateTimeResolutionKey.END] = splited[0] + " " + FormatUtil.ToPm(splited[1]); - } - } - - resolutionPm[DateTimeResolutionKey.Timex] = FormatUtil.AllStringToPm(timex); - break; - } - - resolutionDic.Add(keyName + "Pm", resolutionPm); - } - } - - internal void ResolveWeekOf(Dictionary resolutionDic, string keyName) - { - if (resolutionDic.ContainsKey(keyName)) - { - var resolution = (Dictionary)resolutionDic[keyName]; - - var monday = DateObject.Parse(resolution[DateTimeResolutionKey.START]); - resolution[DateTimeResolutionKey.Timex] = FormatUtil.ToIsoWeekTimex(monday); - - resolutionDic.Remove(keyName); - resolutionDic.Add(keyName, resolution); - } - } - - internal Dictionary GenerateResolution(string type, Dictionary resolutionDic, string mod) - { - var res = new Dictionary(); - - if (type.Equals(Constants.SYS_DATETIME_DATETIME)) - { - AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.DATETIME,mod, res); - } - else if (type.Equals(Constants.SYS_DATETIME_TIME)) - { - AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.TIME, mod, res); - } - else if (type.Equals(Constants.SYS_DATETIME_DATE)) - { - AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.DATE, mod, res); - } - else if (type.Equals(Constants.SYS_DATETIME_DURATION)) - { - if (resolutionDic.ContainsKey(TimeTypeConstants.DURATION)) - { - res.Add(ResolutionKey.Value, resolutionDic[TimeTypeConstants.DURATION]); - } - } - else if (type.Equals(Constants.SYS_DATETIME_TIMEPERIOD)) - { - AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_TIME, TimeTypeConstants.END_TIME, mod, res); - } - else if (type.Equals(Constants.SYS_DATETIME_DATEPERIOD)) - { - AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_DATE, TimeTypeConstants.END_DATE, mod, res); - } - else if (type.Equals(Constants.SYS_DATETIME_DATETIMEPERIOD)) - { - AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_DATETIME, TimeTypeConstants.END_DATETIME, mod, res); - } - else if (type.Equals(Constants.SYS_DATETIME_DATETIMEALT)) - { - // for a period - if (resolutionDic.Count > 2) - { - AddAltPeriodToResolution(resolutionDic, mod, res); - } - else - { - // for a datetime point - AddAltSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.DATETIMEALT, mod, res); - } - } - - return res; - } - - public void AddAltPeriodToResolution(Dictionary resolutionDic, string mod, Dictionary res) - { - if (resolutionDic.ContainsKey(TimeTypeConstants.START_DATETIME) && resolutionDic.ContainsKey(TimeTypeConstants.END_DATETIME)) - { - AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_DATETIME, TimeTypeConstants.END_DATETIME, mod, res); - } - else if (resolutionDic.ContainsKey(TimeTypeConstants.START_DATE) && resolutionDic.ContainsKey(TimeTypeConstants.END_DATE)) - { - AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_DATE, TimeTypeConstants.END_DATE, mod, res); - } - else if (resolutionDic.ContainsKey(TimeTypeConstants.START_TIME) && resolutionDic.ContainsKey(TimeTypeConstants.END_TIME)) - { - AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_TIME, TimeTypeConstants.END_TIME, mod, res); - } - - } - - public void AddAltSingleDateTimeToResolution(Dictionary resolutionDic, string type, string mod, - Dictionary res) - { - if (resolutionDic.ContainsKey(TimeTypeConstants.DATE)) - { - AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.DATE, mod, res); - } - else if (resolutionDic.ContainsKey(TimeTypeConstants.DATETIME)) - { - AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.DATETIME, mod, res); - } - else if (resolutionDic.ContainsKey(TimeTypeConstants.TIME)) - { - AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.TIME, mod, res); - } - - } - - public void AddSingleDateTimeToResolution(Dictionary resolutionDic, string type, string mod, - Dictionary res) - { - if (resolutionDic.ContainsKey(type) && - !resolutionDic[type].Equals(DateMinString) && !resolutionDic[type].Equals(DateTimeMinString)) - { - - if (!string.IsNullOrEmpty(mod)) - { - if (mod.Equals(Constants.BEFORE_MOD)) - { - res.Add(DateTimeResolutionKey.END, resolutionDic[type]); - return; - } - - if (mod.Equals(Constants.AFTER_MOD)) - { - res.Add(DateTimeResolutionKey.START, resolutionDic[type]); - return; - } - - if (mod.Equals(Constants.SINCE_MOD)) - { - res.Add(DateTimeResolutionKey.START, resolutionDic[type]); - return; - } - } - - res.Add(ResolutionKey.Value, resolutionDic[type]); - } - } - - public void AddPeriodToResolution(Dictionary resolutionDic, string startType, string endType, - string mod, Dictionary res) - { - var start = ""; - var end = ""; - - if (resolutionDic.ContainsKey(startType)) - { - start = resolutionDic[startType]; - } - - if (resolutionDic.ContainsKey(endType)) - { - end = resolutionDic[endType]; - } - - if (!string.IsNullOrEmpty(mod)) - { - // For the 'before' mod, the start of the period should be the end the new period, not the start - if (mod.Equals(Constants.BEFORE_MOD)) - { - res.Add(DateTimeResolutionKey.END, start); - return; - } - - // For the 'after' mod, the end of the period should be the start the new period, not the end - if (mod.Equals(Constants.AFTER_MOD)) - { - res.Add(DateTimeResolutionKey.START, end); - return; - } - - // For the 'since' mod, the start of the period should be the start the new period, not the end - if (mod.Equals(Constants.SINCE_MOD)) - { - res.Add(DateTimeResolutionKey.START, start); - return; - } - } - - if (!string.IsNullOrEmpty(start) && !string.IsNullOrEmpty(end)) - { - res.Add(DateTimeResolutionKey.START, start); - res.Add(DateTimeResolutionKey.END, end); - } - } - } +using System.Collections.Generic; +using System.Linq; +using System.Globalization; +using System.Text.RegularExpressions; + +using DateObject = System.DateTime; + +namespace Microsoft.Recognizers.Text.DateTime +{ + public class BaseMergedDateTimeParser : IDateTimeParser + { + public const string ParserTypeName = "datetimeV2"; + + protected readonly IMergedParserConfiguration Config; + + public static readonly string DateMinString = FormatUtil.FormatDate(DateObject.MinValue); + public static readonly string DateTimeMinString = FormatUtil.FormatDateTime(DateObject.MinValue); + private static readonly Calendar Cal = DateTimeFormatInfo.InvariantInfo.Calendar; + + public BaseMergedDateTimeParser(IMergedParserConfiguration configuration) + { + Config = configuration; + } + + public ParseResult Parse(ExtractResult er) + { + return Parse(er, DateObject.Now); + } + + public DateTimeParseResult Parse(ExtractResult er, DateObject refTime) + { + var referenceTime = refTime; + DateTimeParseResult pr = null; + + // Push, save the MOD string + bool hasBefore = false, hasAfter = false, hasSince = false, hasYearAfter = false; + var modStr = string.Empty; + var beforeMatch = Config.BeforeRegex.Match(er.Text); + var afterMatch = Config.AfterRegex.Match(er.Text); + var sinceMatch = Config.SinceRegex.Match(er.Text); + + if (beforeMatch.Success && beforeMatch.Index==0) + { + hasBefore = true; + er.Start += beforeMatch.Length; + er.Length -= beforeMatch.Length; + er.Text = er.Text.Substring(beforeMatch.Length); + modStr = beforeMatch.Value; + } + else if (afterMatch.Success && afterMatch.Index == 0) + { + hasAfter = true; + er.Start += afterMatch.Length; + er.Length -= afterMatch.Length; + er.Text = er.Text.Substring(afterMatch.Length); + modStr = afterMatch.Value; + } + else if (sinceMatch.Success && sinceMatch.Index == 0) + { + hasSince = true; + er.Start += sinceMatch.Length; + er.Length -= sinceMatch.Length; + er.Text = er.Text.Substring(sinceMatch.Length); + modStr = sinceMatch.Value; + } + else if (er.Type.Equals(Constants.SYS_DATETIME_DATEPERIOD) && Config.YearRegex.Match(er.Text).Success) + { + // This has to be put at the end of the if, or cases like "before 2012" and "after 2012" would fall into this + // 2012 or after/above + var match = Config.YearAfterRegex.Match(er.Text); + if (match.Success && er.Text.EndsWith(match.Value)) + { + hasYearAfter = true; + er.Length -= match.Length; + er.Text = er.Text.Substring(0, er.Length ?? 0); + modStr = match.Value; + } + } + + if (er.Type.Equals(Constants.SYS_DATETIME_DATE)) + { + pr = this.Config.DateParser.Parse(er, referenceTime); + if (pr.Value == null) + { + pr = Config.HolidayParser.Parse(er, referenceTime); + } + } + else if (er.Type.Equals(Constants.SYS_DATETIME_TIME)) + { + pr = this.Config.TimeParser.Parse(er, referenceTime); + } + else if (er.Type.Equals(Constants.SYS_DATETIME_DATETIME)) + { + pr = this.Config.DateTimeParser.Parse(er, referenceTime); + } + else if (er.Type.Equals(Constants.SYS_DATETIME_DATEPERIOD)) + { + pr = this.Config.DatePeriodParser.Parse(er, referenceTime); + } + else if (er.Type.Equals(Constants.SYS_DATETIME_TIMEPERIOD)) + { + pr = this.Config.TimePeriodParser.Parse(er, referenceTime); + } + else if (er.Type.Equals(Constants.SYS_DATETIME_DATETIMEPERIOD)) + { + pr = this.Config.DateTimePeriodParser.Parse(er, referenceTime); + } + else if (er.Type.Equals(Constants.SYS_DATETIME_DURATION)) + { + pr = this.Config.DurationParser.Parse(er, referenceTime); + } + else if (er.Type.Equals(Constants.SYS_DATETIME_SET)) + { + pr = this.Config.GetParser.Parse(er, referenceTime); + } + else if (er.Type.Equals(Constants.SYS_DATETIME_DATETIMEALT)) + { + pr = this.Config.DateTimeAltParser.Parse(er, referenceTime); + } + else if (er.Type.Equals(Constants.SYS_DATETIME_TIMEZONE)) + { + if ((Config.Options & DateTimeOptions.EnablePreview) != 0) + { + pr = this.Config.TimeZoneParser.Parse(er, referenceTime); + } + } + else + { + return null; + } + + // Pop, restore the MOD string + if (hasBefore && pr.Value != null) + { + pr.Length += modStr.Length; + pr.Start -= modStr.Length; + pr.Text = modStr + pr.Text; + var val = (DateTimeResolutionResult) pr.Value; + val.Mod = Constants.BEFORE_MOD; + pr.Value = val; + } + + if (hasAfter && pr.Value != null) + { + pr.Length += modStr.Length; + pr.Start -= modStr.Length; + pr.Text = modStr + pr.Text; + var val = (DateTimeResolutionResult) pr.Value; + val.Mod = Constants.AFTER_MOD; + pr.Value = val; + } + + if (hasSince && pr.Value != null) + { + pr.Length += modStr.Length; + pr.Start -= modStr.Length; + pr.Text = modStr + pr.Text; + var val = (DateTimeResolutionResult)pr.Value; + val.Mod = Constants.SINCE_MOD; + pr.Value = val; + } + + if (hasYearAfter && pr.Value != null) + { + pr.Length += modStr.Length; + pr.Text = pr.Text + modStr; + var val = (DateTimeResolutionResult)pr.Value; + val.Mod = Constants.SINCE_MOD; + pr.Value = val; + hasSince = true; + } + + if ((Config.Options & DateTimeOptions.SplitDateAndTime) != 0 && + ((DateTimeResolutionResult)pr.Value)?.SubDateTimeEntities != null) + { + pr.Value = DateTimeResolutionForSplit(pr); + } + else + { + pr = SetParseResult(pr, hasBefore, hasAfter, hasSince); + } + + return pr; + } + + public List FilterResults(string query, List candidateResults) + { + + if (candidateResults != null && candidateResults.Any()) + { + + var matches = Config.AmbiguousMonthP0Regex.Matches(query); + + foreach (Match match in matches) + { + + // Check for intersections/overlaps + candidateResults = candidateResults.Where(c => !( match.Index < c.Start + c.Length && + c.Start < match.Index + match.Length )).ToList(); + } + + } + + return candidateResults; + } + + public DateTimeParseResult SetParseResult(DateTimeParseResult slot, bool hasBefore, bool hasAfter, bool hasSince) + { + slot.Value = DateTimeResolution(slot, hasBefore, hasAfter, hasSince); + + // Change the type at last for the after or before modes + slot.Type = $"{ParserTypeName}.{DetermineDateTimeType(slot.Type, hasBefore, hasAfter, hasSince)}"; + return slot; + } + + public string DetermineDateTimeType(string type, bool hasBefore, bool hasAfter, bool hasSince) + { + if ((Config.Options & DateTimeOptions.SplitDateAndTime) != 0) + { + if (type.Equals(Constants.SYS_DATETIME_DATETIME)) + { + return Constants.SYS_DATETIME_TIME; + } + } + else + { + if (hasBefore || hasAfter || hasSince) + { + if (type.Equals(Constants.SYS_DATETIME_DATE)) + { + return Constants.SYS_DATETIME_DATEPERIOD; + } + + if (type.Equals(Constants.SYS_DATETIME_TIME)) + { + return Constants.SYS_DATETIME_TIMEPERIOD; + } + + if (type.Equals(Constants.SYS_DATETIME_DATETIME)) + { + return Constants.SYS_DATETIME_DATETIMEPERIOD; + } + } + } + + return type; + } + + public List DateTimeResolutionForSplit(DateTimeParseResult slot) + { + var results = new List(); + if (((DateTimeResolutionResult) slot.Value).SubDateTimeEntities != null) + { + var subEntities = ((DateTimeResolutionResult) slot.Value).SubDateTimeEntities; + foreach (var subEntity in subEntities) + { + var result = (DateTimeParseResult) subEntity; + results.AddRange(DateTimeResolutionForSplit(result)); + } + } + else + { + slot.Value = DateTimeResolution(slot, false, false, false); + slot.Type = $"{ParserTypeName}.{DetermineDateTimeType(slot.Type, false, false, false)}"; + results.Add(slot); + } + + return results; + } + + public SortedDictionary DateTimeResolution(DateTimeParseResult slot, bool hasBefore, bool hasAfter, bool hasSince) + { + if (slot == null) + { + return null; + } + var resolutions = new List>(); + var res = new Dictionary(); + + var type = slot.Type; + var typeOutput = DetermineDateTimeType(slot.Type, hasBefore, hasAfter, hasSince); + var timex = slot.TimexStr; + + var val = (DateTimeResolutionResult) slot.Value; + if (val == null) + { + return null; + } + + var islunar = val.IsLunar; + var mod = val.Mod; + var comment = val.Comment; + + // The following should be added to res first, since ResolveAmPm requires these fields. + AddResolutionFields(res, DateTimeResolutionKey.Timex, timex); + AddResolutionFields(res, Constants.Comment, comment); + AddResolutionFields(res, DateTimeResolutionKey.Mod, mod); + AddResolutionFields(res, ResolutionKey.Type, typeOutput); + AddResolutionFields(res, DateTimeResolutionKey.IsLunar, islunar? islunar.ToString():string.Empty); + + var pastResolutionStr = ((DateTimeResolutionResult) slot.Value).PastResolution; + var futureResolutionStr = ((DateTimeResolutionResult) slot.Value).FutureResolution; + + if (typeOutput == Constants.SYS_DATETIME_DATETIMEALT && pastResolutionStr.Count > 0) + { + typeOutput = DetermineResolutionDateTimeType(pastResolutionStr); + } + + var resolutionPast = GenerateResolution(type, pastResolutionStr, mod); + var resolutionFuture = GenerateResolution(type, futureResolutionStr, mod); + + // If past and future are same, keep only one + if (resolutionFuture.OrderBy(t => t.Key).Select(t => t.Value) + .SequenceEqual(resolutionPast.OrderBy(t => t.Key).Select(t => t.Value))) + { + if (resolutionPast.Count > 0) + { + AddResolutionFields(res, Constants.Resolve, resolutionPast); + } + } + else + { + if (resolutionPast.Count > 0) + { + AddResolutionFields(res, Constants.ResolveToPast, resolutionPast); + } + + if (resolutionFuture.Count > 0) + { + AddResolutionFields(res, Constants.ResolveToFuture, resolutionFuture); + } + } + + // If 'ampm', double our resolution accordingly + if (!string.IsNullOrEmpty(comment) && comment.Equals(Constants.Comment_AmPm)) + { + if (res.ContainsKey(Constants.Resolve)) + { + ResolveAmpm(res, Constants.Resolve); + } + else + { + ResolveAmpm(res, Constants.ResolveToPast); + ResolveAmpm(res, Constants.ResolveToFuture); + } + } + + // If WeekOf and in CalendarMode, modify the past part of our resolution + if ((Config.Options & DateTimeOptions.CalendarMode) != 0 && + !string.IsNullOrEmpty(comment) && comment.Equals(Constants.Comment_WeekOf)) + { + ResolveWeekOf(res, Constants.ResolveToPast); + } + + if (val.TimeZoneResolution != null) + { + var timeZoneResolution = new Dictionary(); + timeZoneResolution.Add(ResolutionKey.Value, val.TimeZoneResolution.Value); + timeZoneResolution.Add(Constants.UtcOffsetMinsKey, val.TimeZoneResolution.UtcOffsetMins.ToString()); + + AddResolutionFields(res, Constants.ResolveTimeZone, timeZoneResolution); + } + + foreach (var p in res) + { + if (p.Value is Dictionary) + { + var value = new Dictionary(); + + AddResolutionFields(value, DateTimeResolutionKey.Timex, timex); + AddResolutionFields(value, DateTimeResolutionKey.Mod, mod); + AddResolutionFields(value, ResolutionKey.Type, typeOutput); + AddResolutionFields(value, DateTimeResolutionKey.IsLunar, islunar ? islunar.ToString() : string.Empty); + + foreach (var q in (Dictionary) p.Value) + { + if (value.ContainsKey(q.Key)) + { + value[q.Key] = q.Value; + } + else + { + value.Add(q.Key, q.Value); + } + } + + resolutions.Add(value); + } + } + + if (resolutionPast.Count == 0 && resolutionFuture.Count == 0 && val.TimeZoneResolution == null) + { + var notResolved = new Dictionary { + { + DateTimeResolutionKey.Timex, timex + }, + { + ResolutionKey.Type, typeOutput + }, + { + ResolutionKey.Value, "not resolved" + } + }; + + resolutions.Add(notResolved); + } + + return new SortedDictionary { { ResolutionKey.ValueSet, resolutions } }; + } + + private string DetermineResolutionDateTimeType(Dictionary pastResolutionStr) + { + switch (pastResolutionStr.Keys.First()) + { + case TimeTypeConstants.START_DATE: + return Constants.SYS_DATETIME_DATEPERIOD; + + case TimeTypeConstants.START_DATETIME: + return Constants.SYS_DATETIME_DATETIMEPERIOD; + + case TimeTypeConstants.START_TIME: + return Constants.SYS_DATETIME_TIMEPERIOD; + + default: + return pastResolutionStr.Keys.First().ToLower(); + } + } + + internal void AddResolutionFields(Dictionary dic, string key, object value) + { + if (value is string) + { + if (!string.IsNullOrEmpty((string)value)) + { + dic.Add(key, value); + } + } + else + { + dic.Add(key, value); + } + } + + internal void AddResolutionFields(Dictionary dic, string key, string value) + { + if (!string.IsNullOrEmpty(value)) + { + dic.Add(key, value); + } + } + + internal void ResolveAmpm(Dictionary resolutionDic, string keyName) + { + if (resolutionDic.ContainsKey(keyName)) + { + var resolution = (Dictionary) resolutionDic[keyName]; + if (!resolutionDic.ContainsKey(DateTimeResolutionKey.Timex)) + { + return; + } + + var timex = (string) resolutionDic[DateTimeResolutionKey.Timex]; + resolutionDic.Remove(keyName); + + resolutionDic.Add(keyName + "Am", resolution); + + var resolutionPm = new Dictionary(); + + switch ((string) resolutionDic[ResolutionKey.Type]) + { + case Constants.SYS_DATETIME_TIME: + resolutionPm[ResolutionKey.Value] = FormatUtil.ToPm(resolution[ResolutionKey.Value]); + resolutionPm[DateTimeResolutionKey.Timex] = FormatUtil.ToPm(timex); + break; + + case Constants.SYS_DATETIME_DATETIME: + var splited = resolution[ResolutionKey.Value].Split(' '); + resolutionPm[ResolutionKey.Value] = splited[0] + " " + FormatUtil.ToPm(splited[1]); + resolutionPm[DateTimeResolutionKey.Timex] = FormatUtil.AllStringToPm(timex); + break; + + case Constants.SYS_DATETIME_TIMEPERIOD: + if (resolution.ContainsKey(DateTimeResolutionKey.START)) + { + resolutionPm[DateTimeResolutionKey.START] = FormatUtil.ToPm(resolution[DateTimeResolutionKey.START]); + } + + if (resolution.ContainsKey(DateTimeResolutionKey.END)) + { + resolutionPm[DateTimeResolutionKey.END] = FormatUtil.ToPm(resolution[DateTimeResolutionKey.END]); + } + + resolutionPm[DateTimeResolutionKey.Timex] = FormatUtil.AllStringToPm(timex); + break; + + case Constants.SYS_DATETIME_DATETIMEPERIOD: + if (resolution.ContainsKey(DateTimeResolutionKey.START)) + { + splited = resolution[DateTimeResolutionKey.START].Split(' '); + if (resolution.ContainsKey(DateTimeResolutionKey.START)) + { + resolutionPm[DateTimeResolutionKey.START] = splited[0] + " " + FormatUtil.ToPm(splited[1]); + } + } + + if (resolution.ContainsKey(DateTimeResolutionKey.END)) + { + splited = resolution[DateTimeResolutionKey.END].Split(' '); + + if (resolution.ContainsKey(DateTimeResolutionKey.END)) + { + resolutionPm[DateTimeResolutionKey.END] = splited[0] + " " + FormatUtil.ToPm(splited[1]); + } + } + + resolutionPm[DateTimeResolutionKey.Timex] = FormatUtil.AllStringToPm(timex); + break; + } + + resolutionDic.Add(keyName + "Pm", resolutionPm); + } + } + + internal void ResolveWeekOf(Dictionary resolutionDic, string keyName) + { + if (resolutionDic.ContainsKey(keyName)) + { + var resolution = (Dictionary)resolutionDic[keyName]; + + var monday = DateObject.Parse(resolution[DateTimeResolutionKey.START]); + resolution[DateTimeResolutionKey.Timex] = FormatUtil.ToIsoWeekTimex(monday); + + resolutionDic.Remove(keyName); + resolutionDic.Add(keyName, resolution); + } + } + + internal Dictionary GenerateResolution(string type, Dictionary resolutionDic, string mod) + { + var res = new Dictionary(); + + if (type.Equals(Constants.SYS_DATETIME_DATETIME)) + { + AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.DATETIME,mod, res); + } + else if (type.Equals(Constants.SYS_DATETIME_TIME)) + { + AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.TIME, mod, res); + } + else if (type.Equals(Constants.SYS_DATETIME_DATE)) + { + AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.DATE, mod, res); + } + else if (type.Equals(Constants.SYS_DATETIME_DURATION)) + { + if (resolutionDic.ContainsKey(TimeTypeConstants.DURATION)) + { + res.Add(ResolutionKey.Value, resolutionDic[TimeTypeConstants.DURATION]); + } + } + else if (type.Equals(Constants.SYS_DATETIME_TIMEPERIOD)) + { + AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_TIME, TimeTypeConstants.END_TIME, mod, res); + } + else if (type.Equals(Constants.SYS_DATETIME_DATEPERIOD)) + { + AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_DATE, TimeTypeConstants.END_DATE, mod, res); + } + else if (type.Equals(Constants.SYS_DATETIME_DATETIMEPERIOD)) + { + AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_DATETIME, TimeTypeConstants.END_DATETIME, mod, res); + } + else if (type.Equals(Constants.SYS_DATETIME_DATETIMEALT)) + { + // for a period + if (resolutionDic.Count > 2) + { + AddAltPeriodToResolution(resolutionDic, mod, res); + } + else + { + // for a datetime point + AddAltSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.DATETIMEALT, mod, res); + } + } + + return res; + } + + public void AddAltPeriodToResolution(Dictionary resolutionDic, string mod, Dictionary res) + { + if (resolutionDic.ContainsKey(TimeTypeConstants.START_DATETIME) && resolutionDic.ContainsKey(TimeTypeConstants.END_DATETIME)) + { + AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_DATETIME, TimeTypeConstants.END_DATETIME, mod, res); + } + else if (resolutionDic.ContainsKey(TimeTypeConstants.START_DATE) && resolutionDic.ContainsKey(TimeTypeConstants.END_DATE)) + { + AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_DATE, TimeTypeConstants.END_DATE, mod, res); + } + else if (resolutionDic.ContainsKey(TimeTypeConstants.START_TIME) && resolutionDic.ContainsKey(TimeTypeConstants.END_TIME)) + { + AddPeriodToResolution(resolutionDic, TimeTypeConstants.START_TIME, TimeTypeConstants.END_TIME, mod, res); + } + + } + + public void AddAltSingleDateTimeToResolution(Dictionary resolutionDic, string type, string mod, + Dictionary res) + { + if (resolutionDic.ContainsKey(TimeTypeConstants.DATE)) + { + AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.DATE, mod, res); + } + else if (resolutionDic.ContainsKey(TimeTypeConstants.DATETIME)) + { + AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.DATETIME, mod, res); + } + else if (resolutionDic.ContainsKey(TimeTypeConstants.TIME)) + { + AddSingleDateTimeToResolution(resolutionDic, TimeTypeConstants.TIME, mod, res); + } + + } + + public void AddSingleDateTimeToResolution(Dictionary resolutionDic, string type, string mod, + Dictionary res) + { + if (resolutionDic.ContainsKey(type) && + !resolutionDic[type].Equals(DateMinString) && !resolutionDic[type].Equals(DateTimeMinString)) + { + + if (!string.IsNullOrEmpty(mod)) + { + if (mod.Equals(Constants.BEFORE_MOD)) + { + res.Add(DateTimeResolutionKey.END, resolutionDic[type]); + return; + } + + if (mod.Equals(Constants.AFTER_MOD)) + { + res.Add(DateTimeResolutionKey.START, resolutionDic[type]); + return; + } + + if (mod.Equals(Constants.SINCE_MOD)) + { + res.Add(DateTimeResolutionKey.START, resolutionDic[type]); + return; + } + } + + res.Add(ResolutionKey.Value, resolutionDic[type]); + } + } + + public void AddPeriodToResolution(Dictionary resolutionDic, string startType, string endType, + string mod, Dictionary res) + { + var start = ""; + var end = ""; + + if (resolutionDic.ContainsKey(startType)) + { + start = resolutionDic[startType]; + } + + if (resolutionDic.ContainsKey(endType)) + { + end = resolutionDic[endType]; + } + + if (!string.IsNullOrEmpty(mod)) + { + // For the 'before' mod, the start of the period should be the end the new period, not the start + if (mod.Equals(Constants.BEFORE_MOD)) + { + res.Add(DateTimeResolutionKey.END, start); + return; + } + + // For the 'after' mod, the end of the period should be the start the new period, not the end + if (mod.Equals(Constants.AFTER_MOD)) + { + res.Add(DateTimeResolutionKey.START, end); + return; + } + + // For the 'since' mod, the start of the period should be the start the new period, not the end + if (mod.Equals(Constants.SINCE_MOD)) + { + res.Add(DateTimeResolutionKey.START, start); + return; + } + } + + if (!string.IsNullOrEmpty(start) && !string.IsNullOrEmpty(end)) + { + res.Add(DateTimeResolutionKey.START, start); + res.Add(DateTimeResolutionKey.END, end); + } + } + } } \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Chinese/Extractors/ChineseNumberWithUnitExtractorConfiguration.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Chinese/Extractors/ChineseNumberWithUnitExtractorConfiguration.cs index 261375ea47..6b1e289654 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Chinese/Extractors/ChineseNumberWithUnitExtractorConfiguration.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Chinese/Extractors/ChineseNumberWithUnitExtractorConfiguration.cs @@ -1,6 +1,6 @@ using System.Collections.Immutable; using System.Globalization; - +using System.Text.RegularExpressions; using Microsoft.Recognizers.Definitions.Chinese; using Microsoft.Recognizers.Text.Number.Chinese; @@ -15,6 +15,7 @@ protected ChineseNumberWithUnitExtractorConfiguration(CultureInfo ci) this.BuildPrefix = NumbersWithUnitDefinitions.BuildPrefix; this.BuildSuffix = NumbersWithUnitDefinitions.BuildSuffix; this.ConnectorToken = NumbersWithUnitDefinitions.ConnectorToken; + this.CompoundUnitConnectorRegex = new Regex(NumbersWithUnitDefinitions.CompoundUnitConnectorRegex, RegexOptions.IgnoreCase); } public abstract string ExtractType { get; } @@ -29,6 +30,10 @@ protected ChineseNumberWithUnitExtractorConfiguration(CultureInfo ci) public string ConnectorToken { get; } + public Regex CompoundUnitConnectorRegex { get; } + + public IExtractor IntegerExtractor { get; } + public abstract ImmutableDictionary SuffixList { get; } public abstract ImmutableDictionary PrefixList { get; } diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Constants.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Constants.cs index dbb4effb0d..574e11c246 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Constants.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Constants.cs @@ -14,5 +14,10 @@ public static class Constants public const string SYS_UNIT_TEMPERATURE = "builtin.unit.temperature"; public const string SYS_UNIT_VOLUME = "builtin.unit.volume"; public const string SYS_UNIT_WEIGHT = "builtin.unit.weight"; + public const string SYS_NUM = "builtin.num"; + + // For currencies without ISO codes, we use internal values prefixed by '_'. + // These values should never be present in parse output. + public const string FAKE_ISO_CODE_PREFIX = "_"; } } \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Extractors/CurrencyExtractorConfiguration.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Extractors/CurrencyExtractorConfiguration.cs index bf8e1b7627..4f35b8a88f 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Extractors/CurrencyExtractorConfiguration.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Extractors/CurrencyExtractorConfiguration.cs @@ -23,6 +23,8 @@ public CurrencyExtractorConfiguration(CultureInfo ci) : base(ci) { } public static readonly ImmutableDictionary CurrencyPrefixList = NumbersWithUnitDefinitions.CurrencyPrefixList.ToImmutableDictionary(); + public static readonly ImmutableDictionary FractionalUnitNameToCodeMap = NumbersWithUnitDefinitions.FractionalUnitNameToCodeMap.ToImmutableDictionary(); + private static readonly ImmutableList AmbiguousValues = NumbersWithUnitDefinitions.AmbiguousCurrencyUnitList.ToImmutableList(); } } \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Extractors/EnglishNumberWithUnitExtractorConfiguration.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Extractors/EnglishNumberWithUnitExtractorConfiguration.cs index 675fdee631..80ccbeec8e 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Extractors/EnglishNumberWithUnitExtractorConfiguration.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Extractors/EnglishNumberWithUnitExtractorConfiguration.cs @@ -1,6 +1,6 @@ using System.Collections.Immutable; using System.Globalization; - +using System.Text.RegularExpressions; using Microsoft.Recognizers.Definitions.English; using Microsoft.Recognizers.Text.Number.English; using Microsoft.Recognizers.Text.Number; @@ -16,6 +16,7 @@ protected EnglishNumberWithUnitExtractorConfiguration(CultureInfo ci) this.BuildPrefix = NumbersWithUnitDefinitions.BuildPrefix; this.BuildSuffix = NumbersWithUnitDefinitions.BuildSuffix; this.ConnectorToken = string.Empty; + this.CompoundUnitConnectorRegex = new Regex(NumbersWithUnitDefinitions.CompoundUnitConnectorRegex, RegexOptions.IgnoreCase); } public abstract string ExtractType { get; } @@ -30,6 +31,8 @@ protected EnglishNumberWithUnitExtractorConfiguration(CultureInfo ci) public string ConnectorToken { get; } + public Regex CompoundUnitConnectorRegex { get; set; } + public abstract ImmutableDictionary SuffixList { get; } public abstract ImmutableDictionary PrefixList { get; } diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Parsers/CurrencyParserConfiguration.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Parsers/CurrencyParserConfiguration.cs index c3d55b370d..6f6f503ddf 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Parsers/CurrencyParserConfiguration.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/English/Parsers/CurrencyParserConfiguration.cs @@ -1,4 +1,7 @@ -using System.Globalization; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; +using Microsoft.Recognizers.Definitions.English; namespace Microsoft.Recognizers.Text.NumberWithUnit.English { @@ -10,6 +13,9 @@ public CurrencyParserConfiguration(CultureInfo ci) : base(ci) { this.BindDictionary(CurrencyExtractorConfiguration.CurrencySuffixList); this.BindDictionary(CurrencyExtractorConfiguration.CurrencyPrefixList); + this.CurrencyNameToIsoCodeMap = NumbersWithUnitDefinitions.CurrencyNameToIsoCodeMap.ToImmutableDictionary(); + this.CurrencyFractionCodeList = NumbersWithUnitDefinitions.FractionalUnitNameToCodeMap.ToImmutableDictionary(); } + } } diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Extractors/BaseMergedUnitExtractor.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Extractors/BaseMergedUnitExtractor.cs new file mode 100644 index 0000000000..dd2eb5f198 --- /dev/null +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Extractors/BaseMergedUnitExtractor.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; + +namespace Microsoft.Recognizers.Text.NumberWithUnit +{ + public class BaseMergedUnitExtractor : IExtractor + { + private readonly INumberWithUnitExtractorConfiguration config; + + public BaseMergedUnitExtractor(INumberWithUnitExtractorConfiguration config) + { + this.config = config; + } + + public List Extract(string source) + { + List ers; + + // Only merge currency's compound units for now. + if (config.ExtractType.Equals(Constants.SYS_UNIT_CURRENCY)) + { + ers = MergeCompoundUnits(source); + } + else + { + ers = new NumberWithUnitExtractor(config).Extract(source); + } + + return ers; + } + + private List MergeCompoundUnits(string source) + { + var ers = new NumberWithUnitExtractor(config).Extract(source); + MergePureNumber(source, ers); + + var result = new List(); + var groups = new int[ers.Count]; + groups[0] = 0; + for (var idx = 0; idx < ers.Count - 1; idx++) + { + if (ers[idx].Type != ers[idx + 1].Type && !ers[idx].Type.Equals(Constants.SYS_NUM) && + !ers[idx + 1].Type.Equals(Constants.SYS_NUM)) + { + continue; + } + + var middleBegin = ers[idx].Start + ers[idx].Length ?? 0; + var middleEnd = ers[idx + 1].Start ?? 0; + + var middleStr = source.Substring(middleBegin, middleEnd - middleBegin).Trim().ToLowerInvariant(); + + // Separated by whitespace + if (string.IsNullOrEmpty(middleStr)) + { + groups[idx + 1] = groups[idx]; + continue; + } + + // Separated by connectors + var match = config.CompoundUnitConnectorRegex.Match(middleStr); + if (match.Success && match.Index == 0 && match.Length == middleStr.Length) + { + groups[idx + 1] = groups[idx]; + } + else + { + groups[idx + 1] = groups[idx] + 1; + } + } + + for (var idx = 0; idx < ers.Count; idx++) + { + if (idx == 0 || groups[idx] != groups[idx - 1]) + { + var tmpExtractResult = ers[idx]; + tmpExtractResult.Data = new List + { + new ExtractResult + { + Data = ers[idx].Data, + Length = ers[idx].Length, + Start = ers[idx].Start, + Text = ers[idx].Text, + Type = ers[idx].Type + } + }; + result.Add(tmpExtractResult); + } + + // Reduce extract results in same group + if (idx + 1 < ers.Count && groups[idx + 1] == groups[idx]) + { + var group = groups[idx]; + + var periodBegin = result[group].Start ?? 0; + var periodEnd = (ers[idx + 1].Start ?? 0) + (ers[idx + 1].Length ?? 0); + + result[group].Length = periodEnd - periodBegin; + result[group].Text = source.Substring(periodBegin, periodEnd - periodBegin); + result[group].Type = Constants.SYS_UNIT_CURRENCY; + (result[group].Data as List)?.Add(ers[idx + 1]); + } + } + + for (var idx = 0; idx < result.Count; idx++) + { + var innerData = result[idx].Data as List; + if (innerData?.Count == 1) + { + result[idx] = innerData[0]; + } + } + + return result; + } + + private void MergePureNumber(string source, List ers) + { + var numErs = config.UnitNumExtractor.Extract(source); + var unitNumbers = new List(); + for (int i = 0, j = 0; i < numErs.Count; i++) + { + bool hasBehindExtraction = false; + while (j < ers.Count && ers[j].Start + ers[j].Length < numErs[i].Start) + { + hasBehindExtraction = true; + j++; + } + + if (!hasBehindExtraction) + { + continue; + } + + var middleBegin = ers[j - 1].Start + ers[j - 1].Length ?? 0; + var middleEnd = numErs[i].Start ?? 0; + + var middleStr = source.Substring(middleBegin, middleEnd - middleBegin).Trim().ToLowerInvariant(); + + // Separated by whitespace + if (string.IsNullOrEmpty(middleStr)) + { + unitNumbers.Add(numErs[i]); + continue; + } + + // Separated by connectors + var match = config.CompoundUnitConnectorRegex.Match(middleStr); + if (match.Success && match.Index == 0 && match.Length == middleStr.Length) + { + unitNumbers.Add(numErs[i]); + } + } + + foreach (var extractResult in unitNumbers) + { + var overlap = false; + foreach (var er in ers) + { + if (er.Start <= extractResult.Start && er.Start + er.Length >= extractResult.Start) + { + overlap = true; + } + } + + if (!overlap) + { + ers.Add(extractResult); + } + } + + ers.Sort((x, y) => x.Start - y.Start ?? 0); + } + } +} \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Extractors/INumberWithUnitExtractorConfiguration.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Extractors/INumberWithUnitExtractorConfiguration.cs index 3bc314eb6e..85443a81e6 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Extractors/INumberWithUnitExtractorConfiguration.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Extractors/INumberWithUnitExtractorConfiguration.cs @@ -1,6 +1,6 @@ using System.Collections.Immutable; using System.Globalization; - +using System.Text.RegularExpressions; using Microsoft.Recognizers.Text.Number; namespace Microsoft.Recognizers.Text.NumberWithUnit @@ -24,5 +24,7 @@ public interface INumberWithUnitExtractorConfiguration string BuildSuffix { get; } string ConnectorToken { get; } + + Regex CompoundUnitConnectorRegex { get; } } } diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/French/Extractors/FrenchNumberWithUnitExtractorConfiguration.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/French/Extractors/FrenchNumberWithUnitExtractorConfiguration.cs index 7a6b41e3f5..978cd53efe 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/French/Extractors/FrenchNumberWithUnitExtractorConfiguration.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/French/Extractors/FrenchNumberWithUnitExtractorConfiguration.cs @@ -1,8 +1,7 @@ using System.Collections.Immutable; using System.Globalization; - +using System.Text.RegularExpressions; using Microsoft.Recognizers.Definitions.French; -using Microsoft.Recognizers.Text.Number; using Microsoft.Recognizers.Text.Number.French; namespace Microsoft.Recognizers.Text.NumberWithUnit.French @@ -16,6 +15,7 @@ protected FrenchNumberWithUnitExtractorConfiguration(CultureInfo ci) this.BuildPrefix = NumbersWithUnitDefinitions.BuildPrefix; this.BuildSuffix = NumbersWithUnitDefinitions.BuildSuffix; this.ConnectorToken = NumbersWithUnitDefinitions.ConnectorToken; + this.CompoundUnitConnectorRegex = new Regex(NumbersWithUnitDefinitions.CompoundUnitConnectorRegex, RegexOptions.IgnoreCase); } public abstract string ExtractType { get; } @@ -30,6 +30,8 @@ protected FrenchNumberWithUnitExtractorConfiguration(CultureInfo ci) public string ConnectorToken { get; } + public Regex CompoundUnitConnectorRegex { get; set; } + public abstract ImmutableDictionary SuffixList { get; } public abstract ImmutableDictionary PrefixList { get; } diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/German/Extractors/GermanNumberWithUnitExtractorConfiguration.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/German/Extractors/GermanNumberWithUnitExtractorConfiguration.cs index 1354b83ba9..86a0fe37e1 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/German/Extractors/GermanNumberWithUnitExtractorConfiguration.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/German/Extractors/GermanNumberWithUnitExtractorConfiguration.cs @@ -1,9 +1,8 @@ using System.Collections.Immutable; using System.Globalization; - +using System.Text.RegularExpressions; using Microsoft.Recognizers.Definitions.German; using Microsoft.Recognizers.Text.Number.German; -using Microsoft.Recognizers.Text.Number; namespace Microsoft.Recognizers.Text.NumberWithUnit.German { @@ -16,6 +15,7 @@ protected GermanNumberWithUnitExtractorConfiguration(CultureInfo ci) this.BuildPrefix = NumbersWithUnitDefinitions.BuildPrefix; this.BuildSuffix = NumbersWithUnitDefinitions.BuildSuffix; this.ConnectorToken = string.Empty; + this.CompoundUnitConnectorRegex = new Regex(NumbersWithUnitDefinitions.CompoundUnitConnectorRegex, RegexOptions.IgnoreCase); } public abstract string ExtractType { get; } @@ -30,6 +30,8 @@ protected GermanNumberWithUnitExtractorConfiguration(CultureInfo ci) public string ConnectorToken { get; } + public Regex CompoundUnitConnectorRegex { get; set; } + public abstract ImmutableDictionary SuffixList { get; } public abstract ImmutableDictionary PrefixList { get; } diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Models/AbstractNumberWithUnitModel.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Models/AbstractNumberWithUnitModel.cs index d4d6d820e9..70c3384e8e 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Models/AbstractNumberWithUnitModel.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Models/AbstractNumberWithUnitModel.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; - -using Microsoft.Recognizers.Text.Number; using Microsoft.Recognizers.Text.Utilities; namespace Microsoft.Recognizers.Text.NumberWithUnit @@ -20,7 +18,6 @@ protected AbstractNumberWithUnitModel(Dictionary extractorP public List Parse(string query) { - // Preprocess the query query = FormatUtility.Preprocess(query, false); @@ -28,7 +25,6 @@ public List Parse(string query) try { - foreach (var p in ExtractorParserDic) { var extractor = p.Key; @@ -40,22 +36,34 @@ public List Parse(string query) foreach (var result in extractedResults) { - parsedResults.Add(parser.Parse(result)); + var parseResult = parser.Parse(result); + if (parseResult.Value is List) + { + parsedResults.AddRange((List) parseResult.Value); + } + else + { + parsedResults.Add(parseResult); + } } var modelResults = parsedResults.Select(o => new ModelResult { Start = o.Start.Value, End = o.Start.Value + o.Length.Value - 1, - Resolution = (o.Value is UnitValue) ? - new SortedDictionary + Resolution = (o.Value is UnitValue) ? new SortedDictionary { - {ResolutionKey.Value, ((UnitValue)o.Value).Number}, - {ResolutionKey.Unit, ((UnitValue)o.Value).Unit} + {ResolutionKey.Value, ((UnitValue) o.Value).Number}, + {ResolutionKey.Unit, ((UnitValue) o.Value).Unit} } - : new SortedDictionary + : (o.Value is CurrencyUnitValue) ? new SortedDictionary { - {ResolutionKey.Value, (string)o.Value} + {ResolutionKey.Value, ((CurrencyUnitValue) o.Value).Number}, + {ResolutionKey.Unit, ((CurrencyUnitValue) o.Value).Unit}, + {ResolutionKey.IsoCurrency, ((CurrencyUnitValue) o.Value).IsoCurrency} + } : new SortedDictionary + { + {ResolutionKey.Value, (string) o.Value} }, Text = o.Text, TypeName = ModelTypeName @@ -79,7 +87,6 @@ public List Parse(string query) } } } - } catch (Exception) { diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/NumberWithUnitRecognizer.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/NumberWithUnitRecognizer.cs index 22027edaac..cbc9f1e6ea 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/NumberWithUnitRecognizer.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/NumberWithUnitRecognizer.cs @@ -80,8 +80,8 @@ protected override void InitializeConfiguration() (options) => new CurrencyModel(new Dictionary { { - new NumberWithUnitExtractor(new English.CurrencyExtractorConfiguration()), - new NumberWithUnitParser(new English.CurrencyParserConfiguration()) + new BaseMergedUnitExtractor(new English.CurrencyExtractorConfiguration()), + new BaseMergedUnitParser(new English.CurrencyParserConfiguration()) } })); RegisterModel( diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/BaseCurrencyParser.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/BaseCurrencyParser.cs new file mode 100644 index 0000000000..cee88a3db2 --- /dev/null +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/BaseCurrencyParser.cs @@ -0,0 +1,232 @@ +using System.Collections.Generic; + +using Microsoft.Recognizers.Text.NumberWithUnit.Utilities; + +namespace Microsoft.Recognizers.Text.NumberWithUnit +{ + class BaseCurrencyParser : IParser + { + protected readonly BaseNumberWithUnitParserConfiguration config; + private readonly NumberWithUnitParser numberWithUnitParser; + + public BaseCurrencyParser(BaseNumberWithUnitParserConfiguration config) + { + this.config = config; + numberWithUnitParser = new NumberWithUnitParser(config); + } + + public ParseResult Parse(ExtractResult extResult) + { + ParseResult pr; + + if (extResult.Data is List) + { + pr = MergeCompoundUnit(extResult); + } + else + { + pr = numberWithUnitParser.Parse(extResult); + var value = pr.Value as UnitValue; + + config.CurrencyNameToIsoCodeMap.TryGetValue(value?.Unit, out var mainUnitIsoCode); + if (string.IsNullOrEmpty(mainUnitIsoCode) || mainUnitIsoCode.StartsWith(Constants.FAKE_ISO_CODE_PREFIX)) + { + pr.Value = new UnitValue + { + Unit = value?.Unit, + Number = value?.Number + }; + } + else + { + pr.Value = new CurrencyUnitValue + { + Unit = value?.Unit, + Number = value?.Number, + IsoCurrency = mainUnitIsoCode + }; + } + } + + return pr; + } + + private ParseResult MergeCompoundUnit(ExtractResult compoundResult) + { + var results = new List(); + var compoundUnit = (List) compoundResult.Data; + + var count = 0; + ParseResult result = null; + var numberValue = 0.0; + var mainUnitValue = ""; + string mainUnitIsoCode = ""; + string fractionUnitsString = ""; + + for (var idx = 0; idx < compoundUnit.Count; idx++) + { + var extractResult = compoundUnit[idx]; + var parseResult = numberWithUnitParser.Parse(extractResult); + var parseResultValue = parseResult.Value as UnitValue; + var unitValue = parseResultValue?.Unit; + + // Process a new group + if (count == 0) + { + if (!extractResult.Type.Equals(Constants.SYS_UNIT_CURRENCY)) + { + continue; + } + + // Initialize a new result + result = new ParseResult + { + Start = extractResult.Start, + Length = extractResult.Length, + Text = extractResult.Text, + Type = extractResult.Type + }; + + mainUnitValue = unitValue; + numberValue = double.Parse(parseResultValue?.Number); + result.ResolutionStr = parseResult.ResolutionStr; + + config.CurrencyNameToIsoCodeMap.TryGetValue(unitValue, out mainUnitIsoCode); + // If the main unit can't be recognized, finish process this group. + if (string.IsNullOrEmpty(mainUnitIsoCode)) + { + result.Value = new UnitValue + { + Number = numberValue.ToString(), + Unit = mainUnitValue + }; + results.Add(result); + result = null; + continue; + } + + config.CurrencyFractionMapping.TryGetValue(mainUnitIsoCode, out fractionUnitsString); + } + else + { + // Match pure number as fraction unit. + if (extractResult.Type.Equals(Constants.SYS_NUM)) + { + numberValue += (double) parseResult.Value * (1.0 / 100); + result.ResolutionStr += ' ' + parseResult.ResolutionStr; + result.Length = parseResult.Start + parseResult.Length - result.Start; + count++; + continue; + } + + config.CurrencyFractionCodeList.TryGetValue(unitValue, out var fractionUnitCode); + config.CurrencyFractionNumMap.TryGetValue(parseResultValue?.Unit, out var fractionNumValue); + + if (!string.IsNullOrEmpty(fractionUnitCode) && fractionNumValue != 0 && + CheckUnitsStringContains(fractionUnitCode, fractionUnitsString)) + { + numberValue += double.Parse(parseResultValue?.Number) * + (1.0 / fractionNumValue); + result.ResolutionStr += ' ' + parseResult.ResolutionStr; + result.Length = parseResult.Start + parseResult.Length - result.Start; + } + else + { + // If the fraction unit doesn't match the main unit, finish process this group. + if (result != null) + { + if (string.IsNullOrEmpty(mainUnitIsoCode) || + mainUnitIsoCode.StartsWith(Constants.FAKE_ISO_CODE_PREFIX)) + { + result.Value = new UnitValue + { + Number = numberValue.ToString(), + Unit = mainUnitValue + }; + } + else + { + result.Value = new CurrencyUnitValue + { + Number = numberValue.ToString(), + Unit = mainUnitValue, + IsoCurrency = mainUnitIsoCode + }; + } + + results.Add(result); + result = null; + } + + count = 0; + idx -= 1; + continue; + } + } + + count++; + } + + if (result != null) + { + if (string.IsNullOrEmpty(mainUnitIsoCode) || + mainUnitIsoCode.StartsWith(Constants.FAKE_ISO_CODE_PREFIX)) + { + result.Value = new UnitValue + { + Number = numberValue.ToString(), + Unit = mainUnitValue + }; + } + else + { + result.Value = new CurrencyUnitValue + { + Number = numberValue.ToString(), + Unit = mainUnitValue, + IsoCurrency = mainUnitIsoCode + }; + } + + results.Add(result); + } + + ResolveText(results, compoundResult.Text, (int) compoundResult.Start); + + return new ParseResult + { + Value = results + }; + } + + private bool CheckUnitsStringContains(string fractionUnitCode, string fractionUnitsString) + { + var unitsMap = new Dictionary(); + DictionaryUtils.BindUnitsString(unitsMap, "", fractionUnitsString); + if (unitsMap.ContainsKey(fractionUnitCode)) + { + return true; + } + + return false; + } + + private void ResolveText(List prs, string source, int bias) + { + foreach (var parseResult in prs) + { + if (parseResult.Start != null && parseResult.Length != null) + { + parseResult.Text = source.Substring((int) parseResult.Start - bias, (int) parseResult.Length); + } + } + } + } + + public class CurrencyUnitValue + { + public string Number = ""; + public string Unit = ""; + public string IsoCurrency = ""; + } +} \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/BaseMergedUnitParser.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/BaseMergedUnitParser.cs new file mode 100644 index 0000000000..39f31ca998 --- /dev/null +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/BaseMergedUnitParser.cs @@ -0,0 +1,31 @@ +namespace Microsoft.Recognizers.Text.NumberWithUnit +{ + class BaseMergedUnitParser : IParser + { + protected readonly BaseNumberWithUnitParserConfiguration config; + private readonly NumberWithUnitParser numberWithUnitParser; + + public BaseMergedUnitParser(BaseNumberWithUnitParserConfiguration config) + { + this.config = config; + numberWithUnitParser = new NumberWithUnitParser(config); + } + + public ParseResult Parse(ExtractResult extResult) + { + ParseResult pr; + + // For now only currency model recognizes compound units. + if (extResult.Type.Equals(Constants.SYS_UNIT_CURRENCY)) + { + pr = new BaseCurrencyParser(config).Parse(extResult); + } + else + { + pr = numberWithUnitParser.Parse(extResult); + } + + return pr; + } + } +} \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/INumberWithUnitParserConfiguration.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/INumberWithUnitParserConfiguration.cs index 6f7d1e4ad2..c185d26b1b 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/INumberWithUnitParserConfiguration.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/INumberWithUnitParserConfiguration.cs @@ -1,7 +1,10 @@ using System.Collections.Generic; +using System.Collections.Immutable; using System.Globalization; +using Microsoft.Recognizers.Definitions; using Microsoft.Recognizers.Text.Number; +using Microsoft.Recognizers.Text.NumberWithUnit.Utilities; namespace Microsoft.Recognizers.Text.NumberWithUnit { @@ -9,6 +12,8 @@ public interface INumberWithUnitParserConfiguration { IDictionary UnitMap { get; } + IDictionary CurrencyFractionNumMap { get; } + #region Language settings CultureInfo CultureInfo { get; } @@ -28,6 +33,10 @@ public abstract class BaseNumberWithUnitParserConfiguration : INumberWithUnitPar { public IDictionary UnitMap { get; } + public IDictionary CurrencyFractionNumMap { get; } + + public IDictionary CurrencyFractionMapping { get; } + public CultureInfo CultureInfo { get; } public abstract IParser InternalNumberParser { get; } @@ -36,34 +45,23 @@ public abstract class BaseNumberWithUnitParserConfiguration : INumberWithUnitPar public abstract string ConnectorToken { get; } + public IDictionary CurrencyNameToIsoCodeMap { get; set; } + + public IDictionary CurrencyFractionCodeList { get; set; } + protected BaseNumberWithUnitParserConfiguration(CultureInfo ci) { this.CultureInfo = ci; this.UnitMap = new Dictionary(); + this.CurrencyFractionNumMap = BaseCurrency.CurrencyFractionalRatios.ToImmutableDictionary(); + this.CurrencyFractionMapping = BaseCurrency.CurrencyFractionMapping.ToImmutableDictionary(); + this.CurrencyNameToIsoCodeMap = new Dictionary(); + this.CurrencyFractionCodeList = new Dictionary(); } - + public void BindDictionary(IDictionary dictionary) { - if (dictionary == null) return; - - foreach (var pair in dictionary) - { - if (string.IsNullOrEmpty(pair.Key)) - { - continue; - } - var key = pair.Key; - var values = pair.Value.Trim().Split('|'); - - foreach (var token in values) - { - if (string.IsNullOrWhiteSpace(token) || UnitMap.ContainsKey(token)) - { - continue; - } - UnitMap.Add(token, key); - } - } + DictionaryUtils.BindDictionary(dictionary, UnitMap); } } } \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/NumberWithUnitParser.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/NumberWithUnitParser.cs index 1de1f91fd5..8bf6d7254a 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/NumberWithUnitParser.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Parsers/NumberWithUnitParser.cs @@ -24,6 +24,11 @@ public ParseResult Parse(ExtractResult extResult) { numberResult = unitResult; } + else if (extResult.Type.Equals(Constants.SYS_NUM)) + { + ret.Value = config.InternalNumberParser.Parse(extResult).Value; + return ret; + } else // if there is no unitResult, means there is just unit { numberResult = new ExtractResult { Start = -1, Length = 0 }; @@ -65,7 +70,7 @@ public ParseResult Parse(ExtractResult extResult) /* Unit type depends on last unit in suffix.*/ var lastUnit = unitKeys.Last().ToLowerInvariant(); - if ((!string.IsNullOrEmpty(this.config.ConnectorToken)) && lastUnit.StartsWith(this.config.ConnectorToken)) + if (!string.IsNullOrEmpty(this.config.ConnectorToken) && lastUnit.StartsWith(this.config.ConnectorToken)) { lastUnit = lastUnit.Substring(this.config.ConnectorToken.Length).Trim(); } diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Portuguese/Extractors/PortugueseNumberWithUnitExtractorConfiguration.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Portuguese/Extractors/PortugueseNumberWithUnitExtractorConfiguration.cs index 351ae1670b..70abe48c2e 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Portuguese/Extractors/PortugueseNumberWithUnitExtractorConfiguration.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Portuguese/Extractors/PortugueseNumberWithUnitExtractorConfiguration.cs @@ -1,6 +1,6 @@ using System.Collections.Immutable; using System.Globalization; - +using System.Text.RegularExpressions; using Microsoft.Recognizers.Definitions.Portuguese; using Microsoft.Recognizers.Text.Number; using Microsoft.Recognizers.Text.Number.Portuguese; @@ -16,6 +16,7 @@ protected PortugueseNumberWithUnitExtractorConfiguration(CultureInfo ci) this.BuildPrefix = NumbersWithUnitDefinitions.BuildPrefix; this.BuildSuffix = NumbersWithUnitDefinitions.BuildSuffix; this.ConnectorToken = NumbersWithUnitDefinitions.ConnectorToken; + this.CompoundUnitConnectorRegex = new Regex(NumbersWithUnitDefinitions.CompoundUnitConnectorRegex, RegexOptions.IgnoreCase); } public abstract string ExtractType { get; } @@ -30,6 +31,8 @@ protected PortugueseNumberWithUnitExtractorConfiguration(CultureInfo ci) public string ConnectorToken { get; } + public Regex CompoundUnitConnectorRegex { get; set; } + public abstract ImmutableDictionary SuffixList { get; } public abstract ImmutableDictionary PrefixList { get; } diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Spanish/Extractors/SpanishNumberWithUnitExtractorConfiguration.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Spanish/Extractors/SpanishNumberWithUnitExtractorConfiguration.cs index 52b3724a22..55eb73ddb1 100644 --- a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Spanish/Extractors/SpanishNumberWithUnitExtractorConfiguration.cs +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Spanish/Extractors/SpanishNumberWithUnitExtractorConfiguration.cs @@ -1,6 +1,6 @@ using System.Collections.Immutable; using System.Globalization; - +using System.Text.RegularExpressions; using Microsoft.Recognizers.Definitions.Spanish; using Microsoft.Recognizers.Text.Number; using Microsoft.Recognizers.Text.Number.Spanish; @@ -16,10 +16,11 @@ protected SpanishNumberWithUnitExtractorConfiguration(CultureInfo ci) this.BuildPrefix = NumbersWithUnitDefinitions.BuildPrefix; this.BuildSuffix = NumbersWithUnitDefinitions.BuildSuffix; this.ConnectorToken = NumbersWithUnitDefinitions.ConnectorToken; + this.CompoundUnitConnectorRegex = new Regex(NumbersWithUnitDefinitions.CompoundUnitConnectorRegex, RegexOptions.IgnoreCase); } - public abstract string ExtractType { get; } - + public abstract string ExtractType { get; } + public CultureInfo CultureInfo { get; } public IExtractor UnitNumExtractor { get; } @@ -30,10 +31,12 @@ protected SpanishNumberWithUnitExtractorConfiguration(CultureInfo ci) public string ConnectorToken { get; } + public Regex CompoundUnitConnectorRegex { get; set; } + public abstract ImmutableDictionary SuffixList { get; } - public abstract ImmutableDictionary PrefixList { get; } - + public abstract ImmutableDictionary PrefixList { get; } + public abstract ImmutableList AmbiguousUnitList { get; } } } diff --git a/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Utilities/DictionaryUtils.cs b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Utilities/DictionaryUtils.cs new file mode 100644 index 0000000000..e8da4684ec --- /dev/null +++ b/.NET/Microsoft.Recognizers.Text.NumberWithUnit/Utilities/DictionaryUtils.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace Microsoft.Recognizers.Text.NumberWithUnit.Utilities +{ + public class DictionaryUtils + { + // Safely bind dictionary which contains several key-value pairs to the destination dictionary. + // This function is used to bind all the prefix and suffix for units. + public static void BindDictionary(IDictionary dictionary, + IDictionary sourceDictionary) + { + if (dictionary == null) return; + + foreach (var pair in dictionary) + { + if (string.IsNullOrEmpty(pair.Key)) + { + continue; + } + + BindUnitsString(sourceDictionary, pair.Key, pair.Value); + } + } + + // Bind keys in a string which contains words separated by '|'. + public static void BindUnitsString(IDictionary sourceDictionary, string key, string source) + { + var values = source.Trim().Split('|'); + + foreach (var token in values) + { + if (string.IsNullOrWhiteSpace(token) || sourceDictionary.ContainsKey(token)) + { + continue; + } + + sourceDictionary.Add(token, key); + } + } + } +} \ No newline at end of file diff --git a/.NET/Microsoft.Recognizers.Text.sln b/.NET/Microsoft.Recognizers.Text.sln index 2a6a39b089..16a087f0f1 100644 --- a/.NET/Microsoft.Recognizers.Text.sln +++ b/.NET/Microsoft.Recognizers.Text.sln @@ -21,6 +21,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Patterns", "Patterns", "{23 ..\Patterns\Base-Ip.yaml = ..\Patterns\Base-Ip.yaml ..\Patterns\Base-Numbers.yaml = ..\Patterns\Base-Numbers.yaml ..\Patterns\Base-PhoneNumbers.yaml = ..\Patterns\Base-PhoneNumbers.yaml + ..\Patterns\Base-Currency.yaml = ..\Patterns\Base-Currency.yaml ..\Patterns\Chinese\Chinese-DateTime.yaml = ..\Patterns\Chinese\Chinese-DateTime.yaml ..\Patterns\Chinese\Chinese-Numbers.yaml = ..\Patterns\Chinese\Chinese-Numbers.yaml ..\Patterns\Chinese\Chinese-NumbersWithUnit.yaml = ..\Patterns\Chinese\Chinese-NumbersWithUnit.yaml diff --git a/.NET/Microsoft.Recognizers.Text/Models/ResolutionKey.cs b/.NET/Microsoft.Recognizers.Text/Models/ResolutionKey.cs index 6ab5164e1a..344d072537 100644 --- a/.NET/Microsoft.Recognizers.Text/Models/ResolutionKey.cs +++ b/.NET/Microsoft.Recognizers.Text/Models/ResolutionKey.cs @@ -7,5 +7,6 @@ public static class ResolutionKey public const string Type = "type"; public const string Unit = "unit"; public const string Score = "score"; + public const string IsoCurrency = "isoCurrency"; } } diff --git a/JavaScript/packages/recognizers-number-with-unit/resource-definitions.json b/JavaScript/packages/recognizers-number-with-unit/resource-definitions.json index dc0fec9313..d3a878d23e 100644 --- a/JavaScript/packages/recognizers-number-with-unit/resource-definitions.json +++ b/JavaScript/packages/recognizers-number-with-unit/resource-definitions.json @@ -9,6 +9,14 @@ ], "footer": [ "}" ] }, + { + "input": [ "Base-Currency" ], + "output": "baseCurrency", + "header": [ + "export namespace BaseCurrency {" + ], + "footer": [ "}" ] + }, { "input": [ "English", "English-NumbersWithUnit" ], "output": "englishNumericWithUnit", diff --git a/JavaScript/packages/recognizers-number-with-unit/src/resources/baseCurrency.ts b/JavaScript/packages/recognizers-number-with-unit/src/resources/baseCurrency.ts new file mode 100644 index 0000000000..2ce792866f --- /dev/null +++ b/JavaScript/packages/recognizers-number-with-unit/src/resources/baseCurrency.ts @@ -0,0 +1,12 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ + +export namespace BaseCurrency { + export const CurrencyFractionMapping: ReadonlyMap = new Map([["CNY", "FEN|JIAO"],["__D", "CENT"],["RUB", "KOPEK"],["AFN", "PUL"],["EUR", "CENT"],["ALL", "QINDARKE"],["_ALP", "PENNY"],["GBP", "PENNY"],["_GGP", "PENNY"],["DZD", "SANTEEM"],["AOA", "CENTIMO"],["ARS", "CENTAVO"],["AMD", "LUMA"],["AWG", "CENT"],["_AP", "PENNY"],["SHP", "PENNY"],["AUD", "CENT"],["AZN", "QƏPIK"],["BSD", "CENT"],["BHD", "FILS"],["BDT", "POISHA"],["BBD", "CENT"],["BYN", "KAPYEYKA"],["BZD", "CENT"],["XOF", "CENTIME"],["BMD", "CENT"],["BTN", "CHETRUM"],["INR", "PAISA"],["BOB", "CENTAVO"],["USD", "CENT"],["BAM", "FENING"],["BWP", "THEBE"],["BRL", "CENTAVO"],["_BD", "CENT"],["BND", "SEN"],["SGD", "CENT"],["BGN", "STOTINKA"],["BIF", "CENTIME"],["KHR", "SEN"],["XAF", "CENTIME"],["CAD", "CENT"],["CVE", "CENTAVO"],["KYD", "CENT"],["CLP", "CENTAVO"],["COP", "CENTAVO"],["KMF", "CENTIME"],["CDF", "CENTIME"],["NZD", "CENT"],["_CKD", "CENT"],["CRC", "CENTIMO"],["HRK", "LIPA"],["CUC", "CENTAVO"],["CUP", "CENTAVO"],["CZK", "HALER"],["DKK", "ØRE"],["DJF", "CENTIME"],["DOP", "CENTAVO"],["EGP", "PIASTRE"],["ERN", "CENT"],["ETB", "SANTIM"],["FKP", "PENNY"],["_FOK", "OYRA"],["FJD", "CENT"],["XPF", "CENTIME"],["GMD", "BUTUT"],["GEL", "TETRI"],["GHS", "PESEWA"],["GIP", "PENNY"],["GTQ", "CENTAVO"],["GNF", "CENTIME"],["GYD", "CENT"],["HTG", "CENTIME"],["HNL", "CENTAVO"],["HKD", "CENT"],["HUF", "FILLER"],["ISK", "EYRIR"],["IDR", "SEN"],["IRR", "DINAR"],["IQD", "FILS"],["IMP", "PENNY"],["ILS", "AGORA"],["JMD", "CENT"],["JPY", "SEN"],["JEP", "PENNY"],["JOD", "PIASTRE"],["KZT", "TIIN"],["KES", "CENT"],["_KID", "CENT"],["KPW", "CHON"],["KRW", "JEON"],["KWD", "FILS"],["KGS", "TYIYN"],["LAK", "ATT"],["LBP", "PIASTRE"],["LSL", "SENTE"],["ZAR", "CENT"],["LRD", "CENT"],["LYD", "DIRHAM"],["CHF", "RAPPEN"],["MOP", "AVO"],["MKD", "DENI"],["MGA", "IRAIMBILANJA"],["MWK", "TAMBALA"],["MYR", "SEN"],["MVR", "LAARI"],["MRO", "KHOUMS"],["MUR", "CENT"],["MXN", "CENTAVO"],["_MD", "CENT"],["MDL", "BAN"],["MNT", "MONGO"],["MAD", "CENTIME"],["MZN", "CENTAVO"],["MMK", "PYA"],["NAD", "CENT"],["_ND", "CENT"],["NPR", "PAISA"],["NIO", "CENTAVO"],["NGN", "KOBO"],["_NID", "CENT"],["TRY", "KURUS"],["NOK", "ØRE"],["OMR", "BAISA"],["PKR", "PAISA"],["_PD", "CENT"],["PAB", "CENTESIMO"],["PGK", "TOEA"],["PYG", "CENTIMO"],["PEN", "CENTIMO"],["_PND", "CENT"],["PLN", "GROSZ"],["QAR", "DIRHAM"],["RON", "BAN"],["RWF", "CENTIME"],["WST", "SENE"],["STD", "CENTIMO"],["SAR", "HALALA"],["RSD", "PARA"],["SCR", "CENT"],["SLL", "CENT"],["SBD", "CENT"],["SOS", "CENT"],["_SS", "CENT"],["_SP", "PENNY"],["SSP", "PIASTRE"],["LKR", "CENT"],["SDG", "PIASTRE"],["SRD", "CENT"],["SZL", "CENT"],["SEK", "ORE"],["SYP", "PIASTRE"],["TWD", "CENT"],["TJS", "DIRAM"],["TZS", "CENT"],["THB", "SATANG"],["PRB", "KOPEK"],["TTD", "CENT"],["_TP", "PENNY"],["TND", "MILLIME"],["TMT", "TENNESI"],["TVD", "CENT"],["UGX", "CENT"],["UAH", "KOPIYKA"],["AED", "FILS"],["UYU", "CENTESIMO"],["VEF", "CENTIMO"],["YER", "FILS"],["ZMW", "NGWEE"]]); + export const CurrencyFractionalRatios: ReadonlyMap = new Map([["Kopek", 100],["Pul", 100],["Cent", 100],["Qindarkë", 100],["Penny", 100],["Santeem", 100],["Cêntimo", 100],["Centavo", 100],["Luma", 100],["Qəpik", 100],["Fils", 1000],["Poisha", 100],["Kapyeyka", 100],["Centime", 100],["Chetrum", 100],["Paisa", 100],["Fening", 100],["Thebe", 100],["Sen", 100],["Stotinka", 100],["Jiao", 10],["Fen", 100],["Céntimo", 100],["Lipa", 100],["Haléř", 100],["Øre", 100],["Piastre", 100],["Santim", 100],["Oyra", 100],["Butut", 100],["Tetri", 100],["Pesewa", 100],["Fillér", 100],["Eyrir", 100],["Dinar", 100],["Agora", 100],["Tïın", 100],["Chon", 100],["Jeon", 100],["Tyiyn", 100],["Att", 100],["Sente", 100],["Dirham", 1000],["Rappen", 100],["Avo", 100],["Deni", 100],["Iraimbilanja", 5],["Tambala", 100],["Laari", 100],["Khoums", 5],["Ban", 100],["Möngö", 100],["Pya", 100],["Kobo", 100],["Kuruş", 100],["Baisa", 1000],["Centésimo", 100],["Toea", 100],["Sentimo", 100],["Grosz", 100],["Sene", 100],["Halala", 100],["Para", 100],["Öre", 100],["Diram", 100],["Satang", 100],["Seniti", 100],["Millime", 1000],["Tennesi", 100],["Kopiyka", 100],["Tiyin", 100],["Hào", 10],["Ngwee", 100]]); +} diff --git a/JavaScript/packages/recognizers-number-with-unit/src/resources/chineseNumericWithUnit.ts b/JavaScript/packages/recognizers-number-with-unit/src/resources/chineseNumericWithUnit.ts index 0c0c2221ca..65076319d4 100644 --- a/JavaScript/packages/recognizers-number-with-unit/src/resources/chineseNumericWithUnit.ts +++ b/JavaScript/packages/recognizers-number-with-unit/src/resources/chineseNumericWithUnit.ts @@ -14,6 +14,7 @@ export namespace ChineseNumericWithUnit { export const BuildSuffix = ''; export const ConnectorToken = ''; export const CurrencySuffixList: ReadonlyMap = new Map([["Afghan afghani", "阿富汗尼"],["Pul", "普尔"],["Euro", "欧元"],["Cent", "美分"],["Albanian lek", "阿尔巴尼亚列克|列克"],["Angolan kwanza", "安哥拉宽扎|宽扎"],["Armenian dram", "亚美尼亚德拉姆"],["Aruban florin", "阿鲁巴弗罗林|阿鲁巴币"],["Bangladeshi taka", "塔卡|孟加拉塔卡"],["Paisa", "派萨|帕萨"],["Bhutanese ngultrum", "不丹努尔特鲁姆|不丹努扎姆|努扎姆"],["Chetrum", "切特鲁姆"],["Bolivian boliviano", "玻利维亚诺|玻利维亚币"],["Bosnia and Herzegovina convertible mark", "波斯尼亚和黑塞哥维那可兑换马克|波赫可兑换马克"],["Botswana pula", "博茨瓦纳普拉|普拉"],["Thebe", "thebe"],["Brazilian real", "巴西雷亚尔"],["Bulgarian lev", "保加利亚列弗|保加利亚列瓦"],["Stotinka", "斯托丁卡"],["Cambodian riel", "瑞尔"],["Cape Verdean escudo", "佛得角埃斯库多|维德角埃斯库多"],["Croatian kuna", "克罗地亚库纳|克罗地亚库那|克罗埃西亚库纳"],["Lipa", "利巴"],["Eritrean nakfa", "厄立特里亚纳克法"],["Ethiopian birr", "埃塞俄比亚比尔|埃塞俄比亚元"],["Gambian dalasi", "冈比亚达拉西|甘比亚达拉西"],["Butut", "布达|布图"],["Georgian lari", "格鲁吉亚拉里"],["Tetri", "特特里|泰特里"],["Ghanaian cedi", "塞地|加纳塞地"],["Pesewa", "比塞瓦"],["Guatemalan quetzal", "瓜地马拉格查尔"],["Haitian gourde", "海地古德"],["Honduran lempira", "洪都拉斯伦皮拉"],["Hungarian forint", "匈牙利福林|匈牙利货币|匈牙利福林币"],["Iranian rial", "伊朗里亚尔|伊朗莱尔"],["Yemeni rial", "叶门莱尔|叶门里亚尔"],["Israeli new shekel", "₪|ils|以色列币|以色列新克尔|谢克尔"],["Japanese yen", "日元|日本元|日币|日圆"],["Kazakhstani tenge", "哈萨克斯坦坚戈"],["Kenyan shilling", "肯尼亚先令"],["North Korean won", "朝鲜圆|朝鲜元"],["South Korean won", "韩元|韩圆"],["Korean won", "₩"],["Kyrgyzstani som", "吉尔吉斯斯坦索姆"],["Lao kip", "基普|老挝基普|老挝币"],["Att", "att"],["Lesotho loti", "莱索托洛提|莱索托马洛蒂"],["South African rand", "南非兰特"],["Macedonian denar", "马其顿代纳尔|马其顿币|第纳尔|代纳尔"],["Deni", "第尼"],["Malagasy ariary", "马达加斯加阿里亚里"],["Iraimbilanja", "伊莱姆比拉贾"],["Malawian kwacha", "马拉威克瓦查"],["Tambala", "坦巴拉"],["Malaysian ringgit", "马来西亚币|马币|马来西亚林吉特"],["Mauritanian ouguiya", "毛里塔尼亚乌吉亚"],["Khoums", "库姆斯"],["Mozambican metical", "莫桑比克梅蒂卡尔|梅蒂卡尔"],["Burmese kyat", "缅甸元|缅元"],["Pya", "缅分"],["Nigerian naira", "尼日利亚奈拉|尼日利亚币|奈拉"],["Kobo", "考包"],["Turkish lira", "土耳其里拉"],["Kuruş", "库鲁"],["Omani rial", "阿曼里亚尔|阿曼莱尔"],["Panamanian balboa", "巴拿马巴波亚"],["Centesimo", "意大利分|乌拉圭分|巴拿马分"],["Papua New Guinean kina", "基那"],["Toea", "托亚|托伊"],["Peruvian sol", "秘鲁索尔"],["Polish złoty", "波兰币|波兰兹罗提|兹罗提"],["Grosz", "格罗希"],["Qatari riyal", "卡达里亚尔"],["Saudi riyal", "沙特里亚尔"],["Riyal", "里亚尔|"],["Dirham", "迪拉姆"],["Halala", "哈拉"],["Samoan tālā", "萨摩亚塔拉"],["Sierra Leonean leone", "塞拉利昂利昂|利昂"],["Peseta", "比塞塔|西班牙比塞塔|西班牙币"],["Swazi lilangeni", "斯威士兰里兰吉尼|兰吉尼"],["Tajikistani somoni", "塔吉克斯坦索莫尼"],["Thai baht", "泰铢|泰元"],["Satang", "萨当"],["Tongan paʻanga", "汤加潘加|潘加"],["Ukrainian hryvnia", "乌克兰格里夫纳|格里夫纳"],["Vanuatu vatu", "瓦努阿图瓦图"],["Vietnamese dong", "越南盾"],["Indonesian rupiah", "印度尼西亚盾"],["Netherlands guilder", "荷兰盾|荷属安的列斯盾|列斯盾"],["Surinam florin", "苏里南盾"],["Guilder", "盾"],["Zambian kwacha", "赞比亚克瓦查"],["Moroccan dirham", "摩洛哥迪拉姆"],["United Arab Emirates dirham", "阿联酋迪拉姆"],["Azerbaijani manat", "阿塞拜疆马纳特"],["Turkmenistan manat", "土库曼马纳特"],["Manat", "马纳特"],["Somali shilling", "索马里先令|索马利先令"],["Somaliland shilling", "索马里兰先令"],["Tanzanian shilling", "坦桑尼亚先令"],["Ugandan shilling", "乌干达先令"],["Romanian leu", "罗马尼亚列伊"],["Moldovan leu", "摩尔多瓦列伊"],["Leu", "列伊"],["Ban", "巴尼"],["Nepalese rupee", "尼泊尔卢比"],["Pakistani rupee", "巴基斯坦卢比"],["Indian rupee", "印度卢比"],["Seychellois rupee", "塞舌尔卢比"],["Mauritian rupee", "毛里求斯卢比"],["Maldivian rufiyaa", "马尔代夫卢比"],["Sri Lankan rupee", "斯里兰卡卢比"],["Rupee", "卢比"],["Czech koruna", "捷克克朗"],["Danish krone", "丹麦克朗|丹麦克郎"],["Norwegian krone", "挪威克朗"],["Faroese króna", "法罗克朗"],["Icelandic króna", "冰岛克朗"],["Swedish krona", "瑞典克朗"],["Krone", "克朗"],["Øre", "奥依拉|奥拉|埃利"],["West African CFA franc", "非共体法郎"],["Central African CFA franc", "中非法郎|中非金融合作法郎"],["Comorian franc", "科摩罗法郎"],["Congolese franc", "刚果法郎"],["Burundian franc", "布隆迪法郎"],["Djiboutian franc", "吉布提法郎"],["CFP franc", "太平洋法郎"],["Guinean franc", "几内亚法郎"],["Swiss franc", "瑞士法郎"],["Rwandan franc", "卢旺达法郎"],["Belgian franc", "比利时法郎"],["Rappen", "瑞士分|瑞士生丁"],["Franc", "法郎"],["Centime", "生丁|仙士"],["Russian ruble", "俄国卢布|俄罗斯卢布"],["Transnistrian ruble", "德涅斯特卢布"],["Belarusian ruble", "白俄罗斯卢布"],["Kopek", "戈比"],["Ruble", "卢布"],["Algerian dinar", "阿尔及利亚第纳尔"],["Bahraini dinar", "巴林第纳尔"],["Iraqi dinar", "伊拉克第纳尔|"],["Jordanian dinar", "约旦第纳尔"],["Kuwaiti dinar", "科威特第纳尔|科威特币"],["Libyan dinar", "利比亚第纳尔"],["Serbian dinar", "塞尔维亚第纳尔|塞尔维亚币"],["Tunisian dinar", "突尼斯第纳尔"],["Dinar", "第纳尔"],["Fils", "费尔"],["Para", "帕拉"],["Millime", "米利姆"],["Argentine peso", "阿根廷比索"],["Chilean peso", "智利比索"],["Colombian peso", "哥伦比亚比索"],["Cuban peso", "古巴比索"],["Dominican peso", "多米尼加比索"],["Mexican peso", "墨西哥比索"],["Philippine peso", "菲律宾比索"],["Uruguayan peso", "乌拉圭比索"],["Peso", "比索"],["Centavo", "仙|菲辅币"],["Alderney pound", "奥尔德尼镑"],["British pound", "英镑"],["Guernsey pound", "根西镑"],["Saint Helena pound", "圣赫勒拿镑"],["Egyptian pound", "埃及镑"],["Falkland Islands pound", "福克兰镑"],["Gibraltar pound", "直布罗陀镑"],["Manx pound", "马恩岛镑"],["Jersey pound", "泽西岛镑"],["Lebanese pound", "黎巴嫩镑"],["South Sudanese pound", "南苏丹镑"],["Sudanese pound", "苏丹镑"],["Syrian pound", "叙利亚镑"],["Pound", "英镑"],["Pence", "便士"],["Shilling", "先令"],["United States dollar", "美元|美金|美圆"],["East Caribbean dollar", "东加勒比元"],["Australian dollar", "澳大利亚元|澳元"],["Bahamian dollar", "巴哈马元"],["Barbadian dollar", "巴巴多斯元"],["Belize dollar", "伯利兹元"],["Bermudian dollar", "百慕大元"],["Brunei dollar", "文莱元"],["Singapore dollar", "新加坡元|新元"],["Canadian dollar", "加元|加拿大元"],["Cayman Islands dollar", "开曼岛元|"],["New Zealand dollar", "新西兰元|纽元"],["Cook Islands dollar", "库克群岛元"],["Fijian dollar", "斐济元|斐币"],["Guyanese dollar", "圭亚那元"],["Hong Kong dollar", "蚊|港元|港圆|港币"],["Macau Pataca", "澳元|澳门币|澳门元"],["New Taiwan dollar", "箍|新台币|台币"],["Jamaican dollar", "牙买加元"],["Kiribati dollar", "吉里巴斯元"],["Liberian dollar", "利比里亚元"],["Namibian dollar", "纳米比亚元"],["Surinamese dollar", "苏里南元"],["Trinidad and Tobago dollar", "特立尼达多巴哥元"],["Tuvaluan dollar", "吐瓦鲁元"],["Chinese yuan", "人民币|人民币元|块钱|块|元|圆"],["Fen", "分钱|分"],["Jiao", "毛钱|毛|角钱|角"],["Finnish markka", "芬兰马克"],["Penni", "盆尼"]]); + export const CompoundUnitConnectorRegex = `(?又|再)`; export const CurrencyPrefixList: ReadonlyMap = new Map([["Dollar", "$"],["United States dollar", "us$"],["British Virgin Islands dollar", "bvi$"],["Brunei dollar", "b$"],["Sen", "sen"],["Singapore dollar", "s$"],["Canadian dollar", "can$|c$|c $"],["Cayman Islands dollar", "ci$"],["New Zealand dollar", "nz$|nz $"],["Guyanese dollar", "gy$|gy $|g$|g $"],["Hong Kong dollar", "hk$|hkd|hk $"],["Jamaican dollar", "j$"],["Namibian dollar", "nad|n$|n $"],["Solomon Islands dollar", "si$|si $"],["New Taiwan dollar", "nt$|nt $"],["Samoan tālā", "ws$"],["Chinese yuan", "¥"],["Japanese yen", "¥"],["Turkish lira", "₺"],["Euro", "€"],["Pound", "£"],["Costa Rican colón", "₡"]]); export const CurrencyAmbiguousValues = [ '元','仙','分','圆','块','毛','盾','箍','蚊','角' ]; export const DimensionSuffixList: ReadonlyMap = new Map([["Meter", "米|公尺"],["Kilometer", "千米|公里"],["Decimeter", "分米|公寸"],["Centimeter", "釐米|厘米|公分"],["Micrometer", "毫米|公釐"],["Microns", "微米"],["Picometer", "皮米"],["Nanometer", "纳米"],["Li", "里|市里"],["Zhang", "丈"],["Chi", "市尺|尺"],["Cun", "市寸|寸"],["Fen", "市分|分"],["Hao", "毫"],["Mile", "英里"],["Inch", "英寸"],["Foot", "呎|英尺"],["Yard", "码"],["Knot", "海里"],["Light year", "光年"],["Meter per second", "米每秒|米/秒"],["Kilometer per hour", "公里每小时|千米每小时|公里/小时|千米/小时"],["Kilometer per minute", "公里每分钟|千米每分钟|公里/分钟|千米/分钟"],["Kilometer per second", "公里每秒|千米每秒|公里/秒|千米/秒"],["Mile per hour", "英里每小时|英里/小时"],["Foot per second", "英尺每小时|英尺/小时"],["Foot per minute", "英尺每分钟|英尺/分钟"],["Yard per minute", "码每分|码/分"],["Yard per second", "码每秒|码/秒"],["Square centimetre", "平方厘米"],["Square decimeter", "平方分米"],["Square meter", "平方米"],["Square kilometer", "平方公里"],["Acre", "英亩|公亩"],["Hectare", "公顷"],["Mu", "亩|市亩"],["Liter", "公升|升"],["Milliliter", "毫升"],["Cubic meter", "立方米"],["Cubic decimeter", "立方分米"],["Cubic millimeter", "立方毫米"],["Cubic feet", "立方英尺"],["Gallon", "加仑"],["Pint", "品脱"],["Dou", "市斗|斗"],["Dan", "市石|石"],["Kilogram", "千克|公斤"],["Jin", "市斤|斤"],["Milligram", "毫克"],["Barrel", "桶"],["Pot", "罐"],["Gram", "克"],["Ton", "公吨|吨"],["Pound", "磅"],["Ounce", "盎司"],["Bit", "比特|位"],["Byte", "字节"],["Kilobyte", "千字节"],["Megabyte", "兆字节"],["Gigabyte", "十亿字节|千兆字节"],["Terabyte", "万亿字节|兆兆字节"],["Petabyte", "千兆兆|千万亿字节"]]); diff --git a/JavaScript/packages/recognizers-number-with-unit/src/resources/englishNumericWithUnit.ts b/JavaScript/packages/recognizers-number-with-unit/src/resources/englishNumericWithUnit.ts index 6bda945f6e..7f218bb3d2 100644 --- a/JavaScript/packages/recognizers-number-with-unit/src/resources/englishNumericWithUnit.ts +++ b/JavaScript/packages/recognizers-number-with-unit/src/resources/englishNumericWithUnit.ts @@ -10,7 +10,10 @@ import { BaseNumbers } from "./baseNumbers"; export namespace EnglishNumericWithUnit { export const AgeSuffixList: ReadonlyMap = new Map([["Year", "years old|year old|year-old|years-old|-year-old|-years-old|years of age|year of age"],["Month", "months old|month old|month-old|months-old|-month-old|-months-old|month of age|months of age"],["Week", "weeks old|week old|week-old|weeks-old|-week-old|-weeks-old|week of age|weeks of age"],["Day", "days old|day old|day-old|days-old|-day-old|-days-old|day of age|days of age"]]); export const AreaSuffixList: ReadonlyMap = new Map([["Square kilometer", "sq km|sq kilometer|sq kilometre|sq kilometers|sq kilometres|square kilometer|square kilometre|square kilometers|square kilometres|km2|km^2|km²"],["Square hectometer", "sq hm|sq hectometer|sq hectometre|sq hectometers|sq hectometres|square hectometer|square hectometre|square hectometers|square hectometres|hm2|hm^2|hm²|hectare|hectares"],["Square decameter", "sq dam|sq decameter|sq decametre|sq decameters|sq decametres|square decameter|square decametre|square decameters|square decametres|sq dekameter|sq dekametre|sq dekameters|sq dekametres|square dekameter|square dekametre|square dekameters|square dekametres|dam2|dam^2|dam²"],["Square meter", "sq m|sq meter|sq metre|sq meters|sq metres|sq metre|square meter|square meters|square metre|square metres|m2|m^2|m²"],["Square decimeter", "sq dm|sq decimeter|sq decimetre|sq decimeters|sq decimetres|square decimeter|square decimetre|square decimeters|square decimetres|dm2|dm^2|dm²"],["Square centimeter", "sq cm|sq centimeter|sq centimetre|sq centimeters|sq centimetres|square centimeter|square centimetre|square centimeters|square centimetres|cm2|cm^2|cm²"],["Square millimeter", "sq mm|sq millimeter|sq millimetre|sq millimeters|sq millimetres|square millimeter|square millimetre|square millimeters|square millimetres|mm2|mm^2|mm²"],["Square inch", "sq in|sq inch|square inch|square inches|in2|in^2|in²"],["Square foot", "sqft|sq ft|sq foot|sq feet|square foot|square feet|feet2|feet^2|feet²|ft2|ft^2|ft²"],["Square mile", "sq mi|sq mile|sqmiles|square mile|square miles|mi2|mi^2|mi²"],["Square yard", "sq yd|sq yard|sq yards|square yard|square yards|yd2|yd^2|yd²"],["Acre", "-acre|acre|acres"]]); - export const CurrencySuffixList: ReadonlyMap = new Map([["Abkhazian apsar", "abkhazian apsar|apsars"],["Afghan afghani", "afghan afghani|؋|afn|afghanis|afghani"],["Pul", "pul"],["Euro", "euros|euro|€|eur"],["Cent", "cents|cent|-cents|-cent|sen"],["Albanian lek", "albanian lek|leks|lek"],["Qindarkë", "qindarkë|qindarkës|qindarke|qindarkes"],["Angolan kwanza", "angolan kwanza|kz|aoa|kwanza|kwanzas|angolan kwanzas"],["Armenian dram", "armenian drams|armenian dram"],["Aruban florin", "aruban florin|ƒ|awg|aruban florins"],["Bangladeshi taka", "bangladeshi taka|৳|bdt|taka|takas|bangladeshi takas"],["Paisa", "poisha|paisa"],["Bhutanese ngultrum", "Bhutanese ngultrum|nu.|btn"],["Chetrum", "chetrums|chetrum"],["Bolivian boliviano", "bolivian boliviano|bob|bs.|bolivia boliviano|bolivia bolivianos|bolivian bolivianos"],["Bosnia and Herzegovina convertible mark", "bosnia and herzegovina convertible mark|bam"],["Fening", "fenings|fenings"],["Botswana pula", "botswana pula|bwp|pula|pulas|botswana pulas"],["Thebe", "thebe"],["Brazilian real", "brazilian real|r$|brl|brazil real|brazil reals|brazilian reals"],["Bulgarian lev", "bulgarian lev|bgn|лв|bulgaria lev|bulgaria levs|bulgarian levs"],["Stotinka", "stotinki|stotinka"],["Cambodian riel", "cambodian riel|khr|៛|cambodia riel|cambodia riels|cambodian riels"],["Cape Verdean escudo", "cape verdean escudo|cve"],["Costa Rican colón", "costa rican colón|costa rican colóns|crc|₡|costa rica colón|costa rica colóns|costa rican colon|costa rican colons|costa rica colon|costa rica colons"],["Salvadoran colón", "svc|salvadoran colón|salvadoran colóns|salvador colón|salvador colóns|salvadoran colon|salvadoran colons|salvador colon|salvador colons"],["Céntimo", "céntimo"],["Croatian kuna", "croatian kuna|kn|hrk|croatia kuna|croatian kunas|croatian kuna kunas"],["Lipa", "lipa"],["Czech koruna", "czech koruna|czk|Kč|czech korunas"],["Haléř", "haléř"],["Eritrean nakfa", "eritrean nakfa|nfk|ern|eritrean nakfas"],["Ethiopian birr", "ethiopian birr|etb"],["Gambian dalasi", "gmd"],["Butut", "bututs|butut"],["Georgian lari", "Georgian lari|lari|gel|₾"],["Tetri", "tetri"],["Ghanaian cedi", "Ghanaian cedi|ghs|₵|gh₵"],["Pesewa", "pesewas|pesewa"],["Guatemalan quetzal", "guatemalan quetzal|gtq|guatemala quetzal"],["Haitian gourde", "haitian gourde|htg"],["Honduran lempira", "honduran lempira|hnl"],["Hungarian forint", "hungarian forint|huf|ft|hungary forint|hungary forints|hungarian forints"],["Fillér", "fillér"],["Iranian rial", "iranian rial|irr|iran rial|iran rials|iranian rials"],["Yemeni rial", "yemeni rial|yer|yemeni rials"],["Israeli new shekel", "₪|ils|agora"],["Lithuanian litas", "ltl|lithuanian litas|lithuan litas|lithuanian lit|lithuan lit"],["Japanese yen", "japanese yen|jpy|yen|-yen|¥|yens|japanese yens|japan yen|japan yens"],["Kazakhstani tenge", "Kazakhstani tenge|kzt"],["Kenyan shilling", "kenyan shilling|sh|kes"],["North Korean won", "north korean won|kpw|north korean wons"],["South Korean won", "south korean won|krw|south korean wons"],["Korean won", "korean won|₩|korean wons"],["Kyrgyzstani som", "kyrgyzstani som|kgs"],["Uzbekitan som", "uzbekitan som|uzs"],["Lao kip", "lao kip|lak|₭n|₭"],["Att", "att"],["Lesotho loti", "lesotho loti|lsl|loti"],["Sente", "sente|lisente"],["South African rand", "south african rand|zar|south africa rand|south africa rands|south african rands"],["Macanese pataca", "macanese pataca|mop$|mop"],["Avo", "avos|avo"],["Macedonian denar", "macedonian denar|mkd|ден"],["Deni", "deni"],["Malagasy ariary", "malagasy ariary|mga"],["Iraimbilanja", "iraimbilanja"],["Malawian kwacha", "malawian kwacha|mk|mwk"],["Tambala", "tambala"],["Malaysian ringgit", "malaysian ringgit|rm|myr|malaysia ringgit|malaysia ringgits|malaysian ringgits"],["Mauritanian ouguiya", "mauritanian ouguiya|um|mro|mauritania ouguiya|mauritania ouguiyas|mauritanian ouguiyas"],["Khoums", "khoums"],["Mongolian tögrög", "mongolian tögrög|mnt|₮|mongolia tögrög|mongolia tögrögs|mongolian tögrögs|mongolian togrog|mongolian togrogs|mongolia togrog|mongolia togrogs"],["Mozambican metical", "mozambican metical|mt|mzn|mozambica metical|mozambica meticals|mozambican meticals"],["Burmese kyat", "Burmese kyat|ks|mmk"],["Pya", "pya"],["Nicaraguan córdoba", "nicaraguan córdoba|nio"],["Nigerian naira", "nigerian naira|naira|ngn|₦|nigeria naira|nigeria nairas|nigerian nairas"],["Kobo", "kobo"],["Turkish lira", "turkish lira|try|tl|turkey lira|turkey liras|turkish liras"],["Kuruş", "kuruş"],["Omani rial", "omani rial|omr|ر.ع."],["Panamanian balboa", "panamanian balboa|b/.|pab"],["Centesimo", "centesimo|céntimo"],["Papua New Guinean kina", "papua new guinean kina|kina|pgk"],["Toea", "toea"],["Paraguayan guaraní", "paraguayan guaraní|₲|pyg"],["Peruvian sol", "peruvian sol|soles|sol|peruvian nuevo sol"],["Polish złoty", "złoty|polish złoty|zł|pln|zloty|polish zloty|poland zloty|poland złoty"],["Grosz", "groszy|grosz|grosze"],["Qatari riyal", "qatari riyal|qar|qatari riyals|qatar riyal|qatar riyals"],["Saudi riyal", "saudi riyal|sar|saudi riyals"],["Riyal", "riyal|riyals|rial|﷼"],["Dirham", "dirham|dirhem|dirhm"],["Halala", "halalas|halala"],["Samoan tālā", "samoan tālā|tālā|tala|ws$|samoa|wst|samoan tala"],["Sene", "sene"],["São Tomé and Príncipe dobra", "são tomé and príncipe dobra|dobras|dobra|std"],["Sierra Leonean leone", "sierra Leonean leone|sll|leone|le"],["Peseta", "pesetas|peseta"],["Netherlands guilder", "florin|netherlands antillean guilder|ang|ƒ|nederlandse gulden|guilders|guilder|gulden|-guilders|-guilder|dutch guilders|dutch guilder|fl"],["Swazi lilangeni", "swazi lilangeni|lilangeni|szl|emalangeni"],["Tajikistani somoni", "tajikistani somoni|tjs|somoni"],["Diram", "dirams|diram"],["Thai baht", "thai baht|฿|thb|baht"],["Satang", "satang|satangs"],["Tongan paʻanga", "tongan paʻanga|paʻanga|tongan pa'anga|pa'anga"],["Seniti", "seniti"],["Ukrainian hryvnia", "ukrainian hryvnia|hyrvnia|uah|₴|ukrain hryvnia|ukrain hryvnias|ukrainian hryvnias"],["Vanuatu vatu", "vanuatu vatu|vatu|vuv"],["Venezuelan bolívar", "venezuelan bolívar|venezuelan bolívars|bs.f.|vef|bolívar fuerte|venezuelan bolivar|venezuelan bolivars|venezuela bolivar|venezuela bolivarsvenezuelan bolivar|venezuelan bolivars"],["Vietnamese dong", "vietnamese dong|vnd|đồng|vietnam dong|vietnamese dongs|vietnam dongs"],["Zambian kwacha", "zambian kwacha|zk|zmw|zambia kwacha|kwachas|zambian kwachas"],["Moroccan dirham", "moroccan dirham|mad|د.م."],["United Arab Emirates dirham", "united arab emirates dirham|د.إ|aed"],["Azerbaijani manat", "azerbaijani manat|azn"],["Turkmenistan manat", "turkmenistan manat|turkmenistan new manat|tmt"],["Manat", "manats|manat"],["Qəpik", "qəpik"],["Somali shilling", "somali shillings|somali shilling|shilin soomaali|-shilin soomaali|scellino|shilin|sh.so.|sos"],["Somaliland shilling", "somaliland shillings|somaliland shilling|soomaaliland shilin"],["Tanzanian shilling", "tanzanian shilling|tanzanian shillings|tsh|tzs|tanzania shilling|tanzania shillings"],["Ugandan shilling", "ugandan shilling|ugandan shillings|sh|ugx|uganda shilling|uganda shillings"],["Romanian leu", "romanian leu|lei|ron|romania leu"],["Moldovan leu", "moldovan leu|mdl|moldova leu"],["Leu", "leu"],["Ban", "bani|-ban|ban"],["Nepalese rupee", "nepalese rupee|npr"],["Pakistani rupee", "pakistani rupee|pkr"],["Indian rupee", "indian rupee|inr|₹|india rupee"],["Seychellois rupee", "seychellois rupee|scr|sr|sre"],["Mauritian rupee", "mauritian rupee|mur"],["Maldivian rufiyaa", "maldivian rufiyaa|rf|mvr|.ރ|maldive rufiyaa"],["Sri Lankan rupee", "sri Lankan rupee|lkr|රු|ரூ"],["Indonesian rupiah", "Indonesian rupiah|rupiah|perak|rp|idr"],["Rupee", "rupee|rs"],["Danish krone", "danish krone|dkk|denmark krone|denmark krones|danish krones"],["Norwegian krone", "norwegian krone|nok|norway krone|norway krones|norwegian krones"],["Faroese króna", "faroese króna|faroese krona"],["Icelandic króna", "icelandic króna|isk|icelandic krona|iceland króna|iceland krona"],["Swedish krona", "swedish krona|sek|swedan krona"],["Krone", "kronor|krona|króna|krone|krones|kr|-kr"],["Øre", "Øre|oyra|eyrir"],["West African CFA franc", "west african cfa franc|xof|west africa cfa franc|west africa franc|west african franc"],["Central African CFA franc", "central african cfa franc|xaf|central africa cfa franc|central african franc|central africa franc"],["Comorian franc", "comorian franc|kmf"],["Congolese franc", "congolese franc|cdf"],["Burundian franc", "burundian franc|bif"],["Djiboutian franc", "djiboutian franc|djf"],["CFP franc", "cfp franc|xpf"],["Guinean franc", "guinean franc|gnf"],["Swiss franc", "swiss francs|swiss franc|chf|sfr."],["Rwandan franc", "Rwandan franc|rwf|rf|r₣|frw"],["Belgian franc", "belgian franc|bi.|b.fr.|bef|belgium franc"],["Rappen", "rappen|-rappen"],["Franc", "francs|franc|fr.|fs"],["Centime", "centimes|centime|santim"],["Russian ruble", "russian ruble|₽|rub|russia ruble|russia ₽|russian ₽|russian rubles|russia rubles"],["New Belarusian ruble", "new belarusian ruble|byn|new belarus ruble|new belarus rubles|new belarusian rubles"],["Old Belarusian ruble", "old belarusian ruble|byr|old belarus ruble|old belarus rubles|old belarusian rubles"],["Transnistrian ruble", "transnistrian ruble|prb|р."],["Belarusian ruble", "belarusian ruble|belarus ruble|belarus rubles|belarusian rubles"],["Kopek", "kopek|kopeks"],["Kapyeyka", "kapyeyka"],["Ruble", "rubles|ruble|br"],["Algerian dinar", "algerian dinar|د.ج|dzd|algerian dinars|algeria dinar|algeria dinars"],["Bahraini dinar", "bahraini dinars|bahraini dinar|bhd|.د.ب"],["Santeem", "santeem|santeems"],["Iraqi dinar", "iraqi dinars|iraqi dinar|iraq dinars|iraq dinar|iqd|ع.د"],["Jordanian dinar", "jordanian dinars|jordanian dinar|د.ا|jod|jordan dinar|jordan dinars"],["Kuwaiti dinar", "kuwaiti dinars|kuwaiti dinar|kwd|د.ك"],["Libyan dinar", "libyan dinars|libyan dinar|libya dinars|libya dinar|lyd"],["Serbian dinar", "serbian dinars|serbian dinar|din.|rsd|дин.|serbia dinars|serbia dinar"],["Tunisian dinar", "tunisian dinars|tunisian dinar|tnd|tunisia dinars|tunisia dinar"],["Yugoslav dinar", "yugoslav dinars|yugoslav dinar|yun"],["Dinar", "dinars|dinar|denar|-dinars|-dinar"],["Fils", "fils|fulūs|-fils|-fil"],["Para", "para|napa"],["Millime", "millimes|millime"],["Argentine peso", "argentine peso|ars|argetina peso|argetina pesos|argentine pesos"],["Chilean peso", "chilean pesos|chilean peso|clp|chile peso|chile peso"],["Colombian peso", "colombian pesos|colombian peso|cop|colombia peso|colombia pesos"],["Cuban convertible peso", "cuban convertible pesos|cuban convertible peso|cuc|cuba convertible pesos|cuba convertible peso"],["Cuban peso", "cuban pesos|cuban peso|cup|cuba pesos|cuba peso"],["Dominican peso", "dominican pesos|dominican peso|dop|dominica pesos|dominica peso"],["Mexican peso", "mexican pesos|mexican peso|mxn|mexico pesos|mexico peso"],["Philippine peso", "piso|philippine pesos|philippine peso|₱|php"],["Uruguayan peso", "uruguayan pesos|uruguayan peso|uyu"],["Peso", "pesos|peso"],["Centavo", "centavos|centavo"],["Alderney pound", "alderney pounds|alderney pound|alderney £"],["British pound", "british pounds|british pound|british £|gbp|pound sterling|pound sterlings|sterling|pound scot|pound scots"],["Guernsey pound", "guernsey pounds|guernsey £|ggp"],["Ascension pound", "ascension pounds|ascension pound|ascension £"],["Saint Helena pound", "saint helena pounds|saint helena pound|saint helena £|shp"],["Egyptian pound", "egyptian pounds|egyptian pound|egyptian £|egp|ج.م|egypt pounds|egypt pound"],["Falkland Islands pound", "falkland islands pounds|falkland islands pound|falkland islands £|fkp|falkland island pounds|falkland island pound|falkland island £"],["Gibraltar pound", "gibraltar pounds|gibraltar pound|gibraltar £|gip"],["Manx pound", "manx pounds|manx pound|manx £|imp"],["Jersey pound", "jersey pounds|jersey pound|jersey £|jep"],["Lebanese pound", "lebanese pounds|lebanese pound|lebanese £|lebanan pounds|lebanan pound|lebanan £|lbp|ل.ل"],["South Georgia and the South Sandwich Islands pound", "south georgia and the south sandwich islands pounds|south georgia and the south sandwich islands pound|south georgia and the south sandwich islands £"],["South Sudanese pound", "south sudanese pounds|south sudanese pound|south sudanese £|ssp|south sudan pounds|south sudan pound|south sudan £"],["Sudanese pound", "sudanese pounds|sudanese pound|sudanese £|ج.س.|sdg|sudan pounds|sudan pound|sudan £"],["Syrian pound", "syrian pounds|syrian pound|syrian £|ل.س|syp|syria pounds|syria pound|syria £"],["Tristan da Cunha pound", "tristan da cunha pounds|tristan da cunha pound|tristan da cunha £"],["Pound", "pounds|pound|-pounds|-pound|£"],["Pence", "pence"],["Shilling", "shillings|shilling|shilingi"],["Penny", "pennies|penny"],["United States dollar", "united states dollars|united states dollar|united states $|u.s. dollars|u.s. dollar|u s dollar|u s dollars|usd|american dollars|american dollar|us$|us dollar|us dollars|u.s dollar|u.s dollars"],["East Caribbean dollar", "east caribbean dollars|east caribbean dollar|east Caribbean $|xcd"],["Australian dollar", "australian dollars|australian dollar|australian $|australian$|aud|australia dollars|australia dollar|australia $|australia$"],["Bahamian dollar", "bahamian dollars|bahamian dollar|bahamian $|bahamian$|bsd|bahamia dollars|bahamia dollar|bahamia $|bahamia$"],["Barbadian dollar", "barbadian dollars|barbadian dollar|barbadian $|bbd"],["Belize dollar", "belize dollars|belize dollar|belize $|bzd"],["Bermudian dollar", "bermudian dollars|bermudian dollar|bermudian $|bmd|bermudia dollars|bermudia dollar|bermudia $"],["British Virgin Islands dollar", "british virgin islands dollars|british virgin islands dollar|british virgin islands $|bvi$|virgin islands dollars|virgin islands dolalr|virgin islands $|virgin island dollars|virgin island dollar|virgin island $"],["Brunei dollar", "brunei dollar|brunei $|bnd"],["Sen", "sen"],["Singapore dollar", "singapore dollars|singapore dollar|singapore $|s$|sgd"],["Canadian dollar", "canadian dollars|canadian dollar|canadian $|cad|can$|c$|canada dollars|canada dolllar|canada $"],["Cayman Islands dollar", "cayman islands dollars|cayman islands dollar|cayman islands $|kyd|ci$|cayman island dollar|cayman island doolars|cayman island $"],["New Zealand dollar", "new zealand dollars|new zealand dollar|new zealand $|nz$|nzd|kiwi"],["Cook Islands dollar", "cook islands dollars|cook islands dollar|cook islands $|cook island dollars|cook island dollar|cook island $"],["Fijian dollar", "fijian dollars|fijian dollar|fijian $|fjd|fiji dollars|fiji dollar|fiji $"],["Guyanese dollar", "guyanese dollars|guyanese dollar|gyd|gy$"],["Hong Kong dollar", "hong kong dollars|hong kong dollar|hong kong $|hk$|hkd|hk dollars|hk dollar|hk $|hongkong$"],["Jamaican dollar", "jamaican dollars|jamaican dollar|jamaican $|j$|jamaica dollars|jamaica dollar|jamaica $|jmd"],["Kiribati dollar", "kiribati dollars|kiribati dollar|kiribati $"],["Liberian dollar", "liberian dollars|liberian dollar|liberian $|liberia dollars|liberia dollar|liberia $|lrd"],["Micronesian dollar", "micronesian dollars|micronesian dollar|micronesian $"],["Namibian dollar", "namibian dollars|namibian dollar|namibian $|nad|n$|namibia dollars|namibia dollar|namibia $"],["Nauruan dollar", "nauruan dollars|nauruan dollar|nauruan $"],["Niue dollar", "niue dollars|niue dollar|niue $"],["Palauan dollar", "palauan dollars|palauan dollar|palauan $"],["Pitcairn Islands dollar", "pitcairn islands dollars|pitcairn islands dollar|pitcairn islands $|pitcairn island dollars|pitcairn island dollar|pitcairn island $"],["Solomon Islands dollar", "solomon islands dollars|solomon islands dollar|solomon islands $|si$|sbd|solomon island dollars|solomon island dollar|solomon island $"],["Surinamese dollar", "surinamese dollars|surinamese dollar|surinamese $|srd"],["New Taiwan dollar", "new taiwan dollars|new taiwan dollar|nt$|twd|ntd"],["Trinidad and Tobago dollar", "trinidad and tobago dollars|trinidad and tobago dollar|trinidad and tobago $|trinidad $|trinidad dollar|trinidad dollars|trinidadian dollar|trinidadian dollars|trinidadian $|ttd"],["Tuvaluan dollar", "tuvaluan dollars|tuvaluan dollar|tuvaluan $"],["Dollar", "dollars|dollar|$"],["Chinese yuan", "yuan|chinese yuan|renminbi|cny|rmb|¥"],["Fen", "fen"],["Jiao", "jiao"],["Finnish markka", "suomen markka|finnish markka|finsk mark|fim|markkaa|markka"],["Penni", "penniä|penni"]]); + export const CurrencySuffixList: ReadonlyMap = new Map([["Abkhazian apsar", "abkhazian apsar|apsars"],["Afghan afghani", "afghan afghani|؋|afn|afghanis|afghani"],["Pul", "pul"],["Euro", "euros|euro|€|eur"],["Cent", "cents|cent|-cents|-cent|sen"],["Albanian lek", "albanian lek|leks|lek"],["Qindarkë", "qindarkë|qindarkës|qindarke|qindarkes"],["Angolan kwanza", "angolan kwanza|kz|aoa|kwanza|kwanzas|angolan kwanzas"],["Armenian dram", "armenian drams|armenian dram"],["Aruban florin", "aruban florin|ƒ|awg|aruban florins"],["Bangladeshi taka", "bangladeshi taka|৳|bdt|taka|takas|bangladeshi takas"],["Paisa", "poisha|paisa"],["Bhutanese ngultrum", "Bhutanese ngultrum|nu.|btn"],["Chetrum", "chetrums|chetrum"],["Bolivian boliviano", "bolivian boliviano|bob|bs.|bolivia boliviano|bolivia bolivianos|bolivian bolivianos"],["Bosnia and Herzegovina convertible mark", "bosnia and herzegovina convertible mark|bam"],["Fening", "fenings|fenings"],["Botswana pula", "botswana pula|bwp|pula|pulas|botswana pulas"],["Thebe", "thebe"],["Brazilian real", "brazilian real|r$|brl|brazil real|brazil reals|brazilian reals"],["Bulgarian lev", "bulgarian lev|bgn|лв|bulgaria lev|bulgaria levs|bulgarian levs"],["Stotinka", "stotinki|stotinka"],["Cambodian riel", "cambodian riel|khr|៛|cambodia riel|cambodia riels|cambodian riels"],["Cape Verdean escudo", "cape verdean escudo|cve"],["Costa Rican colón", "costa rican colón|costa rican colóns|crc|₡|costa rica colón|costa rica colóns|costa rican colon|costa rican colons|costa rica colon|costa rica colons"],["Salvadoran colón", "svc|salvadoran colón|salvadoran colóns|salvador colón|salvador colóns|salvadoran colon|salvadoran colons|salvador colon|salvador colons"],["Céntimo", "céntimo"],["Croatian kuna", "croatian kuna|kn|hrk|croatia kuna|croatian kunas|croatian kuna kunas"],["Lipa", "lipa"],["Czech koruna", "czech koruna|czk|Kč|czech korunas"],["Haléř", "haléř"],["Eritrean nakfa", "eritrean nakfa|nfk|ern|eritrean nakfas"],["Ethiopian birr", "ethiopian birr|etb"],["Gambian dalasi", "gmd"],["Butut", "bututs|butut"],["Georgian lari", "Georgian lari|lari|gel|₾"],["Tetri", "tetri"],["Ghanaian cedi", "Ghanaian cedi|ghs|₵|gh₵"],["Pesewa", "pesewas|pesewa"],["Guatemalan quetzal", "guatemalan quetzal|gtq|guatemala quetzal"],["Haitian gourde", "haitian gourde|htg"],["Honduran lempira", "honduran lempira|hnl"],["Hungarian forint", "hungarian forint|huf|ft|hungary forint|hungary forints|hungarian forints"],["Fillér", "fillér"],["Iranian rial", "iranian rial|irr|iran rial|iran rials|iranian rials"],["Yemeni rial", "yemeni rial|yer|yemeni rials"],["Israeli new shekel", "₪|ils|agora"],["Lithuanian litas", "ltl|lithuanian litas|lithuan litas|lithuanian lit|lithuan lit"],["Japanese yen", "japanese yen|jpy|yen|-yen|¥|yens|japanese yens|japan yen|japan yens"],["Kazakhstani tenge", "Kazakhstani tenge|kzt"],["Kenyan shilling", "kenyan shilling|sh|kes"],["North Korean won", "north korean won|kpw|north korean wons"],["South Korean won", "south korean won|krw|south korean wons"],["Korean won", "korean won|₩|korean wons"],["Kyrgyzstani som", "kyrgyzstani som|kgs"],["Uzbekitan som", "uzbekitan som|uzs"],["Lao kip", "lao kip|lak|₭n|₭"],["Att", "att"],["Lesotho loti", "lesotho loti|lsl|loti"],["Sente", "sente|lisente"],["South African rand", "south african rand|zar|south africa rand|south africa rands|south african rands"],["Macanese pataca", "macanese pataca|mop$|mop"],["Avo", "avos|avo"],["Macedonian denar", "macedonian denar|mkd|ден"],["Deni", "deni"],["Malagasy ariary", "malagasy ariary|mga"],["Iraimbilanja", "iraimbilanja"],["Malawian kwacha", "malawian kwacha|mk|mwk"],["Tambala", "tambala"],["Malaysian ringgit", "malaysian ringgit|rm|myr|malaysia ringgit|malaysia ringgits|malaysian ringgits"],["Mauritanian ouguiya", "mauritanian ouguiya|um|mro|mauritania ouguiya|mauritania ouguiyas|mauritanian ouguiyas"],["Khoums", "khoums"],["Mongolian tögrög", "mongolian tögrög|mnt|₮|mongolia tögrög|mongolia tögrögs|mongolian tögrögs|mongolian togrog|mongolian togrogs|mongolia togrog|mongolia togrogs"],["Mozambican metical", "mozambican metical|mt|mzn|mozambica metical|mozambica meticals|mozambican meticals"],["Burmese kyat", "Burmese kyat|ks|mmk"],["Pya", "pya"],["Nicaraguan córdoba", "nicaraguan córdoba|nio"],["Nigerian naira", "nigerian naira|naira|ngn|₦|nigeria naira|nigeria nairas|nigerian nairas"],["Kobo", "kobo"],["Turkish lira", "turkish lira|try|tl|turkey lira|turkey liras|turkish liras"],["Kuruş", "kuruş"],["Omani rial", "omani rial|omr|ر.ع."],["Panamanian balboa", "panamanian balboa|b/.|pab"],["Centesimo", "centesimo|céntimo"],["Papua New Guinean kina", "papua new guinean kina|kina|pgk"],["Toea", "toea"],["Paraguayan guaraní", "paraguayan guaraní|₲|pyg"],["Peruvian sol", "peruvian sol|soles|sol|peruvian nuevo sol"],["Polish złoty", "złoty|polish złoty|zł|pln|zloty|polish zloty|poland zloty|poland złoty"],["Grosz", "groszy|grosz|grosze"],["Qatari riyal", "qatari riyal|qar|qatari riyals|qatar riyal|qatar riyals"],["Saudi riyal", "saudi riyal|sar|saudi riyals"],["Riyal", "riyal|riyals|rial|﷼"],["Dirham", "dirham|dirhem|dirhm"],["Halala", "halalas|halala"],["Samoan tālā", "samoan tālā|tālā|tala|ws$|samoa|wst|samoan tala"],["Sene", "sene"],["São Tomé and Príncipe dobra", "são tomé and príncipe dobra|dobras|dobra|std"],["Sierra Leonean leone", "sierra Leonean leone|sll|leone|le"],["Peseta", "pesetas|peseta"],["Netherlands guilder", "florin|netherlands antillean guilder|ang|ƒ|nederlandse gulden|guilders|guilder|gulden|-guilders|-guilder|dutch guilders|dutch guilder|fl"],["Swazi lilangeni", "swazi lilangeni|lilangeni|szl|emalangeni"],["Tajikistani somoni", "tajikistani somoni|tjs|somoni"],["Diram", "dirams|diram"],["Thai baht", "thai baht|฿|thb|baht"],["Satang", "satang|satangs"],["Tongan paʻanga", "tongan paʻanga|paʻanga|tongan pa'anga|pa'anga"],["Seniti", "seniti"],["Ukrainian hryvnia", "ukrainian hryvnia|hyrvnia|uah|₴|ukrain hryvnia|ukrain hryvnias|ukrainian hryvnias"],["Vanuatu vatu", "vanuatu vatu|vatu|vuv"],["Venezuelan bolívar", "venezuelan bolívar|venezuelan bolívars|bs.f.|vef|bolívar fuerte|venezuelan bolivar|venezuelan bolivars|venezuela bolivar|venezuela bolivarsvenezuelan bolivar|venezuelan bolivars"],["Vietnamese dong", "vietnamese dong|vnd|đồng|vietnam dong|vietnamese dongs|vietnam dongs"],["Zambian kwacha", "zambian kwacha|zk|zmw|zambia kwacha|kwachas|zambian kwachas"],["Moroccan dirham", "moroccan dirham|mad|د.م."],["United Arab Emirates dirham", "united arab emirates dirham|د.إ|aed"],["Azerbaijani manat", "azerbaijani manat|azn"],["Turkmenistan manat", "turkmenistan manat|turkmenistan new manat|tmt"],["Manat", "manats|manat"],["Qəpik", "qəpik"],["Somali shilling", "somali shillings|somali shilling|shilin soomaali|-shilin soomaali|scellino|shilin|sh.so.|sos"],["Somaliland shilling", "somaliland shillings|somaliland shilling|soomaaliland shilin"],["Tanzanian shilling", "tanzanian shilling|tanzanian shillings|tsh|tzs|tanzania shilling|tanzania shillings"],["Ugandan shilling", "ugandan shilling|ugandan shillings|sh|ugx|uganda shilling|uganda shillings"],["Romanian leu", "romanian leu|lei|ron|romania leu"],["Moldovan leu", "moldovan leu|mdl|moldova leu"],["Leu", "leu"],["Ban", "bani|-ban|ban"],["Nepalese rupee", "nepalese rupee|npr"],["Pakistani rupee", "pakistani rupee|pkr"],["Indian rupee", "indian rupee|inr|₹|india rupee"],["Seychellois rupee", "seychellois rupee|scr|sr|sre"],["Mauritian rupee", "mauritian rupee|mur"],["Maldivian rufiyaa", "maldivian rufiyaa|rf|mvr|.ރ|maldive rufiyaa"],["Sri Lankan rupee", "sri Lankan rupee|lkr|රු|ரூ"],["Indonesian rupiah", "Indonesian rupiah|rupiah|perak|rp|idr"],["Rupee", "rupee|rs"],["Danish krone", "danish krone|dkk|denmark krone|denmark krones|danish krones"],["Norwegian krone", "norwegian krone|nok|norway krone|norway krones|norwegian krones"],["Faroese króna", "faroese króna|faroese krona"],["Icelandic króna", "icelandic króna|isk|icelandic krona|iceland króna|iceland krona"],["Swedish krona", "swedish krona|sek|swedan krona"],["Krone", "kronor|krona|króna|krone|krones|kr|-kr"],["Øre", "Øre|oyra|eyrir"],["West African CFA franc", "west african cfa franc|xof|west africa cfa franc|west africa franc|west african franc"],["Central African CFA franc", "central african cfa franc|xaf|central africa cfa franc|central african franc|central africa franc"],["Comorian franc", "comorian franc|kmf"],["Congolese franc", "congolese franc|cdf"],["Burundian franc", "burundian franc|bif"],["Djiboutian franc", "djiboutian franc|djf"],["CFP franc", "cfp franc|xpf"],["Guinean franc", "guinean franc|gnf"],["Swiss franc", "swiss francs|swiss franc|chf|sfr."],["Rwandan franc", "Rwandan franc|rwf|rf|r₣|frw"],["Belgian franc", "belgian franc|bi.|b.fr.|bef|belgium franc"],["Rappen", "rappen|-rappen"],["Franc", "francs|franc|fr.|fs"],["Centime", "centimes|centime|santim"],["Russian ruble", "russian ruble|₽|rub|russia ruble|russia ₽|russian ₽|russian rubles|russia rubles"],["New Belarusian ruble", "new belarusian ruble|byn|new belarus ruble|new belarus rubles|new belarusian rubles"],["Old Belarusian ruble", "old belarusian ruble|byr|old belarus ruble|old belarus rubles|old belarusian rubles"],["Transnistrian ruble", "transnistrian ruble|prb|р."],["Belarusian ruble", "belarusian ruble|belarus ruble|belarus rubles|belarusian rubles"],["Kopek", "kopek|kopeks"],["Kapyeyka", "kapyeyka"],["Ruble", "rubles|ruble|br"],["Algerian dinar", "algerian dinar|د.ج|dzd|algerian dinars|algeria dinar|algeria dinars"],["Bahraini dinar", "bahraini dinars|bahraini dinar|bhd|.د.ب"],["Santeem", "santeem|santeems"],["Iraqi dinar", "iraqi dinars|iraqi dinar|iraq dinars|iraq dinar|iqd|ع.د"],["Jordanian dinar", "jordanian dinars|jordanian dinar|د.ا|jod|jordan dinar|jordan dinars"],["Kuwaiti dinar", "kuwaiti dinars|kuwaiti dinar|kwd|د.ك"],["Libyan dinar", "libyan dinars|libyan dinar|libya dinars|libya dinar|lyd"],["Serbian dinar", "serbian dinars|serbian dinar|din.|rsd|дин.|serbia dinars|serbia dinar"],["Tunisian dinar", "tunisian dinars|tunisian dinar|tnd|tunisia dinars|tunisia dinar"],["Yugoslav dinar", "yugoslav dinars|yugoslav dinar|yun"],["Dinar", "dinars|dinar|denar|-dinars|-dinar"],["Fils", "fils|fulūs|-fils|-fil"],["Para", "para|napa"],["Millime", "millimes|millime"],["Argentine peso", "argentine peso|ars|argetina peso|argetina pesos|argentine pesos"],["Chilean peso", "chilean pesos|chilean peso|clp|chile peso|chile peso"],["Colombian peso", "colombian pesos|colombian peso|cop|colombia peso|colombia pesos"],["Cuban convertible peso", "cuban convertible pesos|cuban convertible peso|cuc|cuba convertible pesos|cuba convertible peso"],["Cuban peso", "cuban pesos|cuban peso|cup|cuba pesos|cuba peso"],["Dominican peso", "dominican pesos|dominican peso|dop|dominica pesos|dominica peso"],["Mexican peso", "mexican pesos|mexican peso|mxn|mexico pesos|mexico peso"],["Philippine peso", "piso|philippine pesos|philippine peso|₱|php"],["Uruguayan peso", "uruguayan pesos|uruguayan peso|uyu"],["Peso", "pesos|peso"],["Centavo", "centavos|centavo"],["Alderney pound", "alderney pounds|alderney pound|alderney £"],["British pound", "british pounds|british pound|british £|gbp|pound sterling|pound sterlings|sterling|pound scot|pound scots"],["Guernsey pound", "guernsey pounds|guernsey £|ggp"],["Ascension pound", "ascension pounds|ascension pound|ascension £"],["Saint Helena pound", "saint helena pounds|saint helena pound|saint helena £|shp"],["Egyptian pound", "egyptian pounds|egyptian pound|egyptian £|egp|ج.م|egypt pounds|egypt pound"],["Falkland Islands pound", "falkland islands pounds|falkland islands pound|falkland islands £|fkp|falkland island pounds|falkland island pound|falkland island £"],["Gibraltar pound", "gibraltar pounds|gibraltar pound|gibraltar £|gip"],["Manx pound", "manx pounds|manx pound|manx £|imp"],["Jersey pound", "jersey pounds|jersey pound|jersey £|jep"],["Lebanese pound", "lebanese pounds|lebanese pound|lebanese £|lebanan pounds|lebanan pound|lebanan £|lbp|ل.ل"],["South Georgia and the South Sandwich Islands pound", "south georgia and the south sandwich islands pounds|south georgia and the south sandwich islands pound|south georgia and the south sandwich islands £"],["South Sudanese pound", "south sudanese pounds|south sudanese pound|south sudanese £|ssp|south sudan pounds|south sudan pound|south sudan £"],["Sudanese pound", "sudanese pounds|sudanese pound|sudanese £|ج.س.|sdg|sudan pounds|sudan pound|sudan £"],["Syrian pound", "syrian pounds|syrian pound|syrian £|ل.س|syp|syria pounds|syria pound|syria £"],["Tristan da Cunha pound", "tristan da cunha pounds|tristan da cunha pound|tristan da cunha £"],["Pound", "pounds|pound|-pounds|-pound|£"],["Pence", "pence"],["Shilling", "shillings|shilling|shilingi"],["Penny", "pennies|penny"],["United States dollar", "united states dollars|united states dollar|united states $|u.s. dollars|u.s. dollar|u s dollar|u s dollars|usd|american dollars|american dollar|us$|us dollar|us dollars|u.s dollar|u.s dollars"],["East Caribbean dollar", "east caribbean dollars|east caribbean dollar|east Caribbean $|xcd"],["Australian dollar", "australian dollars|australian dollar|australian $|australian$|aud|australia dollars|australia dollar|australia $|australia$"],["Bahamian dollar", "bahamian dollars|bahamian dollar|bahamian $|bahamian$|bsd|bahamia dollars|bahamia dollar|bahamia $|bahamia$"],["Barbadian dollar", "barbadian dollars|barbadian dollar|barbadian $|bbd"],["Belize dollar", "belize dollars|belize dollar|belize $|bzd"],["Bermudian dollar", "bermudian dollars|bermudian dollar|bermudian $|bmd|bermudia dollars|bermudia dollar|bermudia $"],["British Virgin Islands dollar", "british virgin islands dollars|british virgin islands dollar|british virgin islands $|bvi$|virgin islands dollars|virgin islands dolalr|virgin islands $|virgin island dollars|virgin island dollar|virgin island $"],["Brunei dollar", "brunei dollar|brunei $|bnd"],["Sen", "sen"],["Singapore dollar", "singapore dollars|singapore dollar|singapore $|s$|sgd"],["Canadian dollar", "canadian dollars|canadian dollar|canadian $|cad|can$|c$|canada dollars|canada dolllar|canada $"],["Cayman Islands dollar", "cayman islands dollars|cayman islands dollar|cayman islands $|kyd|ci$|cayman island dollar|cayman island doolars|cayman island $"],["New Zealand dollar", "new zealand dollars|new zealand dollar|new zealand $|nz$|nzd|kiwi"],["Cook Islands dollar", "cook islands dollars|cook islands dollar|cook islands $|cook island dollars|cook island dollar|cook island $"],["Fijian dollar", "fijian dollars|fijian dollar|fijian $|fjd|fiji dollars|fiji dollar|fiji $"],["Guyanese dollar", "guyanese dollars|guyanese dollar|gyd|gy$"],["Hong Kong dollar", "hong kong dollars|hong kong dollar|hong kong $|hk$|hkd|hk dollars|hk dollar|hk $|hongkong$"],["Jamaican dollar", "jamaican dollars|jamaican dollar|jamaican $|j$|jamaica dollars|jamaica dollar|jamaica $|jmd"],["Kiribati dollar", "kiribati dollars|kiribati dollar|kiribati $"],["Liberian dollar", "liberian dollars|liberian dollar|liberian $|liberia dollars|liberia dollar|liberia $|lrd"],["Micronesian dollar", "micronesian dollars|micronesian dollar|micronesian $"],["Namibian dollar", "namibian dollars|namibian dollar|namibian $|nad|n$|namibia dollars|namibia dollar|namibia $"],["Nauruan dollar", "nauruan dollars|nauruan dollar|nauruan $"],["Niue dollar", "niue dollars|niue dollar|niue $"],["Palauan dollar", "palauan dollars|palauan dollar|palauan $"],["Pitcairn Islands dollar", "pitcairn islands dollars|pitcairn islands dollar|pitcairn islands $|pitcairn island dollars|pitcairn island dollar|pitcairn island $"],["Solomon Islands dollar", "solomon islands dollars|solomon islands dollar|solomon islands $|si$|sbd|solomon island dollars|solomon island dollar|solomon island $"],["Surinamese dollar", "surinamese dollars|surinamese dollar|surinamese $|srd"],["New Taiwan dollar", "new taiwan dollars|new taiwan dollar|nt$|twd|ntd"],["Trinidad and Tobago dollar", "trinidad and tobago dollars|trinidad and tobago dollar|trinidad and tobago $|trinidad $|trinidad dollar|trinidad dollars|trinidadian dollar|trinidadian dollars|trinidadian $|ttd"],["Tuvaluan dollar", "tuvaluan dollars|tuvaluan dollar|tuvaluan $"],["Dollar", "dollars|dollar|$"],["Chinese yuan", "yuan|kuai|chinese yuan|renminbi|cny|rmb|¥"],["Fen", "fen"],["Jiao", "jiao|mao"],["Finnish markka", "suomen markka|finnish markka|finsk mark|fim|markkaa|markka"],["Penni", "penniä|penni"]]); + export const CurrencyNameToIsoCodeMap: ReadonlyMap = new Map([["Afghan afghani", "AFN"],["Euro", "EUR"],["Albanian lek", "ALL"],["Angolan kwanza", "AOA"],["Armenian dram", "AMD"],["Aruban florin", "AWG"],["Bangladeshi taka", "BDT"],["Bhutanese ngultrum", "BTN"],["Bolivian boliviano", "BOB"],["Bosnia and Herzegovina convertible mark", "BAM"],["Botswana pula", "BWP"],["Brazilian real", "BRL"],["Bulgarian lev", "BGN"],["Cambodian riel", "KHR"],["Cape Verdean escudo", "CVE"],["Costa Rican colón", "CRC"],["Croatian kuna", "HRK"],["Czech koruna", "CZK"],["Eritrean nakfa", "ERN"],["Ethiopian birr", "ETB"],["Gambian dalasi", "GMD"],["Georgian lari", "GEL"],["Ghanaian cedi", "GHS"],["Guatemalan quetzal", "GTQ"],["Haitian gourde", "HTG"],["Honduran lempira", "HNL"],["Hungarian forint", "HUF"],["Iranian rial", "IRR"],["Yemeni rial", "YER"],["Israeli new shekel", "ILS"],["Japanese yen", "JPY"],["Kazakhstani tenge", "KZT"],["Kenyan shilling", "KES"],["North Korean won", "KPW"],["South Korean won", "KRW"],["Kyrgyzstani som", "KGS"],["Lao kip", "LAK"],["Lesotho loti", "LSL"],["South African rand", "ZAR"],["Macanese pataca", "MOP"],["Macedonian denar", "MKD"],["Malagasy ariary", "MGA"],["Malawian kwacha", "MWK"],["Malaysian ringgit", "MYR"],["Mauritanian ouguiya", "MRO"],["Mongolian tögrög", "MNT"],["Mozambican metical", "MZN"],["Burmese kyat", "MMK"],["Nicaraguan córdoba", "NIO"],["Nigerian naira", "NGN"],["Turkish lira", "TRY"],["Omani rial", "OMR"],["Panamanian balboa", "PAB"],["Papua New Guinean kina", "PGK"],["Paraguayan guaraní", "PYG"],["Peruvian sol", "PEN"],["Polish złoty", "PLN"],["Qatari riyal", "QAR"],["Saudi riyal", "SAR"],["Samoan tālā", "WST"],["São Tomé and Príncipe dobra", "STD"],["Sierra Leonean leone", "SLL"],["Swazi lilangeni", "SZL"],["Tajikistani somoni", "TJS"],["Thai baht", "THB"],["Ukrainian hryvnia", "UAH"],["Vanuatu vatu", "VUV"],["Venezuelan bolívar", "VEF"],["Zambian kwacha", "ZMW"],["Moroccan dirham", "MAD"],["United Arab Emirates dirham", "AED"],["Azerbaijani manat", "AZN"],["Turkmenistan manat", "TMT"],["Somali shilling", "SOS"],["Tanzanian shilling", "TZS"],["Ugandan shilling", "UGX"],["Romanian leu", "RON"],["Moldovan leu", "MDL"],["Nepalese rupee", "NPR"],["Pakistani rupee", "PKR"],["Indian rupee", "INR"],["Seychellois rupee", "SCR"],["Mauritian rupee", "MUR"],["Maldivian rufiyaa", "MVR"],["Sri Lankan rupee", "LKR"],["Indonesian rupiah", "IDR"],["Danish krone", "DKK"],["Norwegian krone", "NOK"],["Icelandic króna", "ISK"],["Swedish krona", "SEK"],["West African CFA franc", "XOF"],["Central African CFA franc", "XAF"],["Comorian franc", "KMF"],["Congolese franc", "CDF"],["Burundian franc", "BIF"],["Djiboutian franc", "DJF"],["CFP franc", "XPF"],["Guinean franc", "GNF"],["Swiss franc", "CHF"],["Rwandan franc", "RWF"],["Russian ruble", "RUB"],["Transnistrian ruble", "PRB"],["Belarusian ruble", "BYN"],["Algerian dinar", "DZD"],["Bahraini dinar", "BHD"],["Iraqi dinar", "IQD"],["Jordanian dinar", "JOD"],["Kuwaiti dinar", "KWD"],["Libyan dinar", "LYD"],["Serbian dinar", "RSD"],["Tunisian dinar", "TND"],["Argentine peso", "ARS"],["Chilean peso", "CLP"],["Colombian peso", "COP"],["Cuban convertible peso", "CUC"],["Cuban peso", "CUP"],["Dominican peso", "DOP"],["Mexican peso", "MXN"],["Uruguayan peso", "UYU"],["British pound", "GBP"],["Saint Helena pound", "SHP"],["Egyptian pound", "EGP"],["Falkland Islands pound", "FKP"],["Gibraltar pound", "GIP"],["Manx pound", "IMP"],["Jersey pound", "JEP"],["Lebanese pound", "LBP"],["South Sudanese pound", "SSP"],["Sudanese pound", "SDG"],["Syrian pound", "SYP"],["United States dollar", "USD"],["Australian dollar", "AUD"],["Bahamian dollar", "BSD"],["Barbadian dollar", "BBD"],["Belize dollar", "BZD"],["Bermudian dollar", "BMD"],["Brunei dollar", "BND"],["Singapore dollar", "SGD"],["Canadian dollar", "CAD"],["Cayman Islands dollar", "KYD"],["New Zealand dollar", "NZD"],["Fijian dollar", "FJD"],["Guyanese dollar", "GYD"],["Hong Kong dollar", "HKD"],["Jamaican dollar", "JMD"],["Liberian dollar", "LRD"],["Namibian dollar", "NAD"],["Solomon Islands dollar", "SBD"],["Surinamese dollar", "SRD"],["New Taiwan dollar", "TWD"],["Trinidad and Tobago dollar", "TTD"],["Tuvaluan dollar", "TVD"],["Chinese yuan", "CNY"],["Rial", "__RI"],["Shiling", "__S"],["Som", "__SO"],["Dirham", "__DR"],["Dinar", "_DN"],["Dollar", "__D"],["Manat", "__MA"],["Rupee", "__R"],["Krone", "__K"],["Krona", "__K"],["Crown", "__K"],["Frank", "__F"],["Mark", "__M"],["Ruble", "__RB"],["Peso", "__PE"],["Pound", "__P"],["Tristan da Cunha pound", "_TP"],["South Georgia and the South Sandwich Islands pound", "_SP"],["Somaliland shilling", "_SS"],["Pitcairn Islands dollar", "_PND"],["Palauan dollar", "_PD"],["Niue dollar", "_NID"],["Nauruan dollar", "_ND"],["Micronesian dollar", "_MD"],["Kiribati dollar", "_KID"],["Guernsey pound", "_GGP"],["Faroese króna", "_FOK"],["Cook Islands dollar", "_CKD"],["British Virgin Islands dollar", "_BD"],["Ascension pound", "_AP"],["Alderney pound", "_ALP"],["Abkhazian apsar", "_AA"]]); + export const FractionalUnitNameToCodeMap: ReadonlyMap = new Map([["Jiao", "JIAO"],["Kopek", "KOPEK"],["Pul", "PUL"],["Cent", "CENT"],["Qindarkë", "QINDARKE"],["Penny", "PENNY"],["Santeem", "SANTEEM"],["Cêntimo", "CENTIMO"],["Centavo", "CENTAVO"],["Luma", "LUMA"],["Qəpik", "QƏPIK"],["Fils", "FILS"],["Poisha", "POISHA"],["Kapyeyka", "KAPYEYKA"],["Centime", "CENTIME"],["Chetrum", "CHETRUM"],["Paisa", "PAISA"],["Fening", "FENING"],["Thebe", "THEBE"],["Sen", "SEN"],["Stotinka", "STOTINKA"],["Fen", "FEN"],["Céntimo", "CENTIMO"],["Lipa", "LIPA"],["Haléř", "HALER"],["Øre", "ØRE"],["Piastre", "PIASTRE"],["Santim", "SANTIM"],["Oyra", "OYRA"],["Butut", "BUTUT"],["Tetri", "TETRI"],["Pesewa", "PESEWA"],["Fillér", "FILLER"],["Eyrir", "EYRIR"],["Dinar", "DINAR"],["Agora", "AGORA"],["Tïın", "TIIN"],["Chon", "CHON"],["Jeon", "JEON"],["Tyiyn", "TYIYN"],["Att", "ATT"],["Sente", "SENTE"],["Dirham", "DIRHAM"],["Rappen", "RAPPEN"],["Avo", "AVO"],["Deni", "DENI"],["Iraimbilanja", "IRAIMBILANJA"],["Tambala", "TAMBALA"],["Laari", "LAARI"],["Khoums", "KHOUMS"],["Ban", "BAN"],["Möngö", "MONGO"],["Pya", "PYA"],["Kobo", "KOBO"],["Kuruş", "KURUS"],["Baisa", "BAISA"],["Centésimo", "CENTESIMO"],["Toea", "TOEA"],["Sentimo", "SENTIMO"],["Grosz", "GROSZ"],["Sene", "SENE"],["Halala", "HALALA"],["Para", "PARA"],["Öre", "ORE"],["Diram", "DIRAM"],["Satang", "SATANG"],["Seniti", "SENITI"],["Millime", "MILLIME"],["Tennesi", "TENNESI"],["Kopiyka", "KOPIYKA"],["Tiyin", "TIYIN"],["Hào", "HAO"],["Ngwee", "NGWEE"]]); + export const CompoundUnitConnectorRegex = `(?and)`; export const CurrencyPrefixList: ReadonlyMap = new Map([["Dollar", "$"],["United States dollar", "united states $|us$|us $|u.s. $|u.s $"],["East Caribbean dollar", "east caribbean $"],["Australian dollar", "australian $|australia $"],["Bahamian dollar", "bahamian $|bahamia $"],["Barbadian dollar", "barbadian $|barbadin $"],["Belize dollar", "belize $"],["Bermudian dollar", "bermudian $"],["British Virgin Islands dollar", "british virgin islands $|bvi$|virgin islands $|virgin island $|british virgin island $"],["Brunei dollar", "brunei $|b$"],["Sen", "sen"],["Singapore dollar", "singapore $|s$"],["Canadian dollar", "canadian $|can$|c$|c $|canada $"],["Cayman Islands dollar", "cayman islands $|ci$|cayman island $"],["New Zealand dollar", "new zealand $|nz$|nz $"],["Cook Islands dollar", "cook islands $|cook island $"],["Fijian dollar", "fijian $|fiji $"],["Guyanese dollar", "gy$|gy $|g$|g $"],["Hong Kong dollar", "hong kong $|hk$|hkd|hk $"],["Jamaican dollar", "jamaican $|j$|jamaica $"],["Kiribati dollar", "kiribati $"],["Liberian dollar", "liberian $|liberia $"],["Micronesian dollar", "micronesian $"],["Namibian dollar", "namibian $|nad|n$|namibia $"],["Nauruan dollar", "nauruan $"],["Niue dollar", "niue $"],["Palauan dollar", "palauan $"],["Pitcairn Islands dollar", "pitcairn islands $|pitcairn island $"],["Solomon Islands dollar", "solomon islands $|si$|si $|solomon island $"],["Surinamese dollar", "surinamese $|surinam $"],["New Taiwan dollar", "nt$|nt $"],["Trinidad and Tobago dollar", "trinidad and tobago $|trinidad $|trinidadian $"],["Tuvaluan dollar", "tuvaluan $"],["Samoan tālā", "ws$"],["Chinese yuan", "¥"],["Japanese yen", "¥"],["Euro", "€"],["Pound", "£"],["Costa Rican colón", "₡"],["Turkish lira", "₺"]]); export const AmbiguousCurrencyUnitList = [ 'din.','kiwi','kina','kobo','lari','lipa','napa','para','sfr.','taka','tala','toea','vatu','yuan','ang','ban','bob','btn','byr','cad','cop','cup','dop','gip','jod','kgs','lak','lei','mga','mop','nad','omr','pul','sar','sbd','scr','sdg','sek','sen','sol','sos','std','try','yer','yen' ]; export const InformationSuffixList: ReadonlyMap = new Map([["Bit", "-bit|bit|bits"],["Kilobit", "kilobit|kilobits|kb|kbit"],["Megabit", "megabit|megabits|Mb|Mbit"],["Gigabit", "gigabit|gigabits|Gb|Gbit"],["Terabit", "terabit|terabits|Tb|Tbit"],["Petabit", "petabit|petabits|Pb|Pbit"],["Byte", "-byte|byte|bytes"],["Kilobyte", "-kilobyte|-kilobytes|kilobyte|kB|kilobytes|kilo byte|kilo bytes|kByte"],["Megabyte", "-megabyte|-megabytes|megabyte|mB|megabytes|mega byte|mega bytes|MByte"],["Gigabyte", "-gigabyte|-gigabytes|gigabyte|gB|gigabytes|giga byte|giga bytes|GByte"],["Terabyte", "-terabyte|-terabytes|terabyte|tB|terabytes|tera byte|tera bytes|TByte"],["Petabyte", "-petabyte|-petabytes|petabyte|pB|petabytes|peta byte|peta bytes|PByte"]]); diff --git a/JavaScript/packages/recognizers-number-with-unit/src/resources/frenchNumericWithUnit.ts b/JavaScript/packages/recognizers-number-with-unit/src/resources/frenchNumericWithUnit.ts index 133209bec0..12c355674d 100644 --- a/JavaScript/packages/recognizers-number-with-unit/src/resources/frenchNumericWithUnit.ts +++ b/JavaScript/packages/recognizers-number-with-unit/src/resources/frenchNumericWithUnit.ts @@ -11,6 +11,7 @@ export namespace FrenchNumericWithUnit { export const AgeSuffixList: ReadonlyMap = new Map([["Ans", "ans"],["Mois", "mois d'âge|mois d'age|mois"],["Semaines", "semaine|semaines|semaines d'âge|semaines d'age"],["Jour", "jours|jour"]]); export const AreaSuffixList: ReadonlyMap = new Map([["Kilomètre carré", "km2|km^2|km²|kilomètres carrés|kilomètre carré"],["Hectomètre carré", "hm2|hm^2|hm²|hectomètre carré|hectomètres carrés"],["Décamètre carré", "dam2|dam^2|dam²|décamètre carré|décamètres carrés"],["Mètre carré", "m2|m^2|m²|mètre carré|mètres carrés"],["Décimètre carré", "dm2|dm^2|dm²|décimètre carré|décimètres carrés"],["Centimètre carré", "cm2|cm^2|cm²|centimètre carré|centimètres carrés"],["Millimètre carré", "mm2|mm^2|mm²|millimètre carré|millimètres carrés"],["Pouce carré", "pouces2|po2|pouce carré|pouces carrés|in^2|in²|in2"],["Pied carré", "pied carré|pieds carrés|pi2|pi^2|pi²"],["Mile carré", "mile carré|miles carrés|mi2|mi^2|mi²"],["Acre", "acre|acres"]]); export const CurrencySuffixList: ReadonlyMap = new Map([["Abkhazie apsar", "abkhazie apsar|apsars"],["Afghan afghani", "afghan afghani|؋|afn|afghanis|afghani"],["Pul", "pul"],["Euro", "euros|euro|€|eur|d'euros"],["Cent", "cents|cent|-cents|-cent|sen"],["lek Albanais", "lek albanais|leks|lek"],["Qindarkë", "qindarkë|qindarkës|qindarke|qindarkes"],["Kwanza angolais", "kwanza angolais|kz|aoa|kwanza|kwanzas"],["Dram arménien", "dram arménien|drams arméniens"],["Florins d'Aruba", "florins aruba|ƒ|awg"],["Bangladeshi taka", "bangladeshi taka|৳|bdt|taka|takas|bangladeshi takas"],["Paisa", "poisha|paisa"],["Ngultrum bhoutanais", "ngultrum bhoutanais|nu.|btn"],["Chetrum", "chetrums|chetrum"],["Boliviano bolivien", "boliviano bolivien|bolivianos bolivien|bolivianos bolivie|boliviano bolivie|bob|bs."],["Bosnie-Herzégovine mark convertible", "bosnie-herzégovine mark convertible|bosnie-et-herzégovine mark convertible|bam"],["Fening", "fening|fenings"],["Pula", "pula|bwp"],["Thebe", "thebe"],["Réal brésilien", "réal brésilien|réals brésilien|r$|brl|real bresil|reals bresilien"],["Lev bulgare", "lev bulgare|levs bulgare|lv|bgn"],["Stotinki búlgaro", "stotinki bulgare"],["Riel cambodgien", "riel cambodgien|khr|៛"],["Escudo du cap-vert", "escudo cap-verdien|cve"],["Colon du costa rica", "colon du costa rica|colons du costa rica|crc|₡"],["Colon du salvador", "colon du salvador|colons du salvador|svc"],["Kuna croate", "kuna croate|kunas croate|kn|hrk"],["Lipa", "lipa"],["Couronne tchèque", "couronne tchèque|couronnes tchèque|czk|Kč"],["Haléř", "haléř"],["Nakfas érythréens", "nakfas érythréens|nfk|ern|nakfa érythréens"],["Birr éthiopien", "birr éthiopien|birrs éthiopien|etb"],["Dalasi gambienne", "gmd"],["Butut", "bututs|butut"],["Lari géorgien", "lari géorgie|lari géorgiens|gel|₾"],["Tetri géorgien", "tetri géorgie|tetris géorgiens"],["Cedi", "cedi|ghs|cedi ghanéen|gh₵"],["Pesewa", "pesewa|pesewas"],["Quetzal guatémaltèque", "quetzal guatémaltèque|gtq|quetzal|quetzales"],["Gourdes haïtiennes", "gourdes haïtiennes|gourdes|htg|gourde haïtienne"],["Lempira hondurien", "lempira hondurien|hnl"],["Forint hongrois", "forint hongrois|huf|fg|forints hongrois"],["Fillér", "fillér"],["Rial iranien", "rial iranien|irr|rials iranien|rials iraniens"],["Litas lituanien", "litas lituanien|ltl|lit lithuanien|litas lithuanie"],["Yen Japonais", "yen japonais|yen japon|yens|jpy|yen|¥|-yen"],["Tenge kazakh", "tenge kazakh|kzt"],["Shilling kényan", "shilling kényan|sh|kes|shillings kényans"],["Won coréen", "won coréen|won coréens|₩"],["Won sud-coréen", "won sud-coréen|won sud coréen|won sud-coréens|krw"],["Corée du nord won", "corée du nord won|corée nord won|kpw"],["Som Kirghizie", "som kirghizie|kgs"],["Sum Ouzbékistan", "sum ouzbékistan|sum ouzbeks|sum ouzbéks|uzs"],["Kip laotien", "kip laotien|lak|₭n|₭"],["Att", "att"],["Loti", "loti|maloti|lsl"],["Sente", "sente|lisente"],["Rand sud-africain", "rand sud-africain|zar"],["Pataca macanais", "pataca macanais|mop$|mop"],["Avo", "avos|avo"],["Dinar macédonien", "dinar macédonien|mkd|ден"],["Deni", "deni"],["Ariary malagache", "ariary malagache|mga"],["Iraimbilanja", "Iraimbilanja"],["Kwacha malawien", "kwacha malawien|mk|mwk"],["Tambala", "Tambala"],["Ringitt malaisien", "ringitt malaisien|rm|myr|ringitts malaisien"],["Ouguiya mauritanienne", "ouguiya|um|mro|ouguiya mauritanien|ouguiya mauritanienne"],["Khoums", "khoums"],["Togrogs mongoles", "togrogs mongoles|togrogs|tugriks|tögrög|mnt|₮|tögrög mongoles|tögrög mongolie|togrogs mongolie"],["Metical mozambique", "metical du mozambique|metical mozambique|mt|mzn|meticals mozambique"],["Kyat birmanie", "kyat birmanie|ks|mmk"],["Pya", "pya"],["Cordoba nicaraguayen", "cordoba nicaraguayen|córdoba nicaraguayen|nio|córdoba oro|cordoba oro nicaraguayen"],["Naira nigérians", "naira nigérians|naira|ngm|₦|nairas nigérians"],["Livre turque", "livre turque|try|tl|livre turques"],["Kuruş", "kuruş"],["Rials omanais", "rials omanais|omr|ر.ع.|rial omanais"],["Balboa panaméennes", "balboa panaméennes|balboa|pab"],["Kina", "kina|pkg|pgk"],["Toea", "toea"],["Guaraní paraguayen", "guaraní paraguayen|₲|pyg"],["Sol péruvien", "nuevo sol péruvien|soles|sol|sol péruvien"],["Złoty polonais", "złoty polonais|złoty|zł|pln|zloty|zloty polonais"],["Groxz", "groszy|grosz|grosze"],["Riyal qatari", "riyal qatari|qar|riyals qatari"],["Riayl saudi", "riyal saudi|sar|riyals saudi"],["Riyal", "riyal|riyals|rial|﷼"],["Dirham", "dirham|dirhem|dirhm"],["Halala", "halalas|halala"],["Tala", "tala|tālā|ws$|sat|wst"],["Sene", "sene"],["Dobra", "dobra|db|std"],["Leone", "leone|sll"],["Florins Néerlandais", "florins hollandais|florins néerlandais|florins|ang|ƒ|florin|fl |"],["Lilangeni", "lilangeni|szl"],["Somoni tadjikistan", "somoni tadjikistan|tjs|somoni"],["Diram", "dirams|diram"],["Baht thaïlandais", "baht thaïlandais|baht thailandais|baht thaï|baht thai|baht|฿|thb"],["Satang", "satang|satangs"],["Paʻanga", "paʻanga|pa'anga|top"],["Hryvnia ukrainien", "hryvnia ukrainien|hyrvnia|uah|₴|hryvnias ukrainien|hryvnia ukrainienne"],["Vanuatu vatu", "vanuatu vatu|vatu|vuv"],["Bolívar vénézuélien", "bolívar vénézuélien|bolivar venezuelien|bs.f.|vef|bolívars vénézuélien|bolivars venezuelien"],["Dong vietnamien", "dong vietnamien|dongs vietnamiens|dong|đồng|vnd|dông|dông vietnamiens"],["Kwacha de Zambie", "kwacha de zambie|zk|zmw|kwachas"],["Dirham marocain", "dirham marocain|mad|د.م."],["Dirham des Émirats arabes unis", "dirham des Émirats arabes unis|د.إ|aed"],["Manat azerbaïdjanais", "manat azerbaïdjanais|manat azerbaidjanais|azn"],["Manat turkmène", "manat turkmène|tmt|manat turkmene"],["Manat", "manats|manat"],["Qəpik", "qəpik"],["Shilling somalien", "shilling somalien|shillings somalien|sos"],["Shilling tanzanien", "shilling tanzanien|shillings tanzanien|tzs|tsh|shilling tanzanienne|shillings tanzanienne"],["Shilling ougandais", "shilling ougandais|shillings ougandais|sh|ugx"],["Leu roumain", "leu roumain|lei|leu roumaine|ron"],["Leu moldave", "leu meoldave|mdl"],["Leu", "leu"],["Ban", "bani|-ban|ban"],["Roupie népalaise", "roupie népalaise|roupie nepalaise|npr"],["Roupie pakistanaise", "roupie pakistanaise|pkr"],["Roupie indienne", "roupie indienne|inr|roupie indien|inr|₹"],["Roupie seychelloise", "roupie seychelloise|scr|sr|sre"],["Roupie mauricienne", "roupie mauricienne|mur"],["Rufiyaa maldives", "rufiyaa maldives|mvr|.ރ|rf"],["Roupie srilankaise", "roupie srilankaise|lrk|රු|ரூ"],["Rupiah Indonésie", "rupia indonésie|rupia indonesie|rupiah|rp|idr"],["Roupie", "roupie"],["Couronne danoise", "couronne danoise|dkk|couronnes danoise|couronne danemark|couronnes danemark"],["Couronne norvégienne", "couronne norvégienne|couronne norvegienne|couronnes norvégienne|couronnes norvegienne|nok"],["Couronne féroïenne", "couronne féroïenne|couronne feroienne"],["Couronne suédoise", "couronne suédoise|couronne suéde|sek|couronnes suédoise|couronne suedoise"],["Couronne", "couronne|couronnes"],["Øre", "Øre|oyra|eyrir"],["Franc CFA de l'Afrique de l'Ouest", "franc cfa de l''afrique de l''ouest|franc cfa ouest africain|franc cfa|francs cfa|fcfa|frs cfa|cfa francs|xof"],["Franc CFA d'Afrique centrale", "franc cfa d''afrique centrale|franc cfa centrale|frs cfa centrale|xaf"],["Franc comorien", "franc comorien|kmf"],["Franc congolais", "franc congolais|cdf"],["Franc burundais", "franc burundais|bif"],["Franc djiboutienne", "franc djiboutienne|djf"],["Franc CFP", "franc cfp|xpf"],["Franc guinéen", "franc guinéen|gnf"],["Franc Suisse", "franc suisse|chf|sfr.|francs suisses"],["Franc rwandais", "franc rwandais|rwf|rw|r₣|frw"],["Franc belge", "franc belge|bi.|b.fr.|bef"],["Rappen", "rappen|-rappen"],["Franc", "francs|franc|fr.|fs"],["Centimes", "centimes|centime|santim"],["Rouble russe", "rouble russe|rub|₽|₽ russe|roubles russe|roubles russes|₽ russes"],["Nouveau rouble biélorusse", "nouveau rouble biélorusse|byn|nouveau roubles biélorusse|nouveau rouble bielorusse|nouveau roubles biélorusse"],["Rouble transnistriens", "rouble transnistriens|prb"],["Rouble biélorusses", "rouble biélorusses|roubles biélorusses|rouble bielorusses|roubles bielorusses"],["Kopek", "kopek|kopeks"],["Kapyeyka", "kapyeyka"],["Rouble", "roubles|rouble|br"],["Dinar algérien", "dinar algérien|د.ج|dzd|dinars algérien|dinar algerien|dinars algerien"],["Dinar de bahreïn", "dinar de bahreïn|bhd|.د.ب|dinar de bahrein"],["Santeem", "santeem|santeems"],["Dinar iraquien", "dinar iraquien|dinars iraquien|iqd|ع.د|dinar iraquienne|dinars iraquienne"],["Dinar jordanien", "dinar jordanien|dinars jordanien|د.ا|jod"],["Dinar koweïtien", "dinar koweïtien|dinar koweitien|dinars koweïtien|kwd|د.ك"],["Dinar libyen", "dinar libyen|dinars libyen|lyd"],["Dinar serbe", "dinar serbe|dinars serbe|rsd|дин."],["Dinar tunisien", "dinar tunisien|dinars tunisien|tnd"],["Dinar yougoslave", "dinar yougoslave|dinars yougoslave|yun"],["Dinar", "dinars|dinar|denar|-dinars|-dinar"],["Fils", "fils|fulūs|-fils|-fil"],["Para", "para|napa"],["Millime", "millimes|millime"],["Peso argentin", "peso argentin|ars|pesos argentin|peso argentine|pesos argentine"],["Peso chilien", "peso chilien|pesos chilien|clp"],["Peso colombien", "peso colombien|pesos colombien|cop|peso colombie|pesos colombien"],["Peso cubains convertibles", "peso cubains convertibles|pesos cubains convertibles|cuc"],["Peso cubains", "peso cubaines|pesos cubaines|peso cubaine|pesos cubaines|cup"],["Peso dominicain", "peso dominicain|pesos dominicain|dop|peso dominicaine|pesos dominicaine"],["Peso philippin", "peso philippin|pesos philippin|piso|₱|php"],["Peso uruguayen", "peso uruguayen|pesos uruguayen|uyu"],["Peso", "pesos|Peso"],["Centavo", "centavos|Centavo"],["Livre britannique", "livre britannique|livres britannique|gbp|£ britannique"],["Livre guernesey", "livre guernesey|£ guernesey|ggp"],["Livre ascension", "livre ascension|livres ascension|£ ascension"],["Livre sainte-hélène", "livre de sainte-hélène|livre sainte-hélène|livre sainte-helene|livre de sainte hélène|shp"],["Livre égyptienne", "livre égyptienne|livre egyptienne|egp|ج.م"],["Livre des îles falkland", "livre des îles falkland|livre des iles falkland|fkp|£ iles falkland"],["Livre gibraltar", "livre gibraltar|livre de gibraltar|£ gibraltar|gip"],["Livre manx", "imp|livre manx|£ manx"],["Livre jersey", "livre de jersey|livre jersey|jep|£ jersey"],["Livre libanaise", "livre libanaise|£ libanaise|livres libanaise|lbp|ل.ل"],["Livre des îles malouines", "livre des îles malouines|livre des iles malouines|£ iles malouines"],["Livre sud-soudanaise", "livre sud-soudanaise|livre sud soudanaise|livre du soudan du sud|livres sud-soudanaises|livre sud soudan|livre soudan sud"],["Livre soudanaise", "livre soudanaise|livres soudanaise|sdg|£ soudan|ج.س.|livre soudan|livres soudan"],["Livre syrienne", "livre syrienne|ل.س|syp|livre syrie|livres syrie|£ syrie"],["Livre", "livre|livres|-livre|-livres|£"],["Pence", "pence"],["Shilling", "shilling|shillings"],["Penny", "penny|sou|centime"],["Dollar Américain", "dollar américain|$ américain|$ americain|usd|$usd|$ usd|dollar americain|dollar États-Unis|dollar des États-Unis|dollar États Unis|dollar etats unis|dollar etats-unis|$ etats-unis|$ États-Unis"],["Dollar des Caraïbes orientales", "dollar des caraïbes orientales|dollar des caraibes orientales|xcd|$ caraibes orientales|$ caraïbes orientales"],["Dollar Australien", "dollar australien|dollars australiens|$ australien|aud|$australien|australien $|$ australie|dollar australie"],["Dollar des bahamas", "dollar des bahamas|dollar bahamas|$ bahamas|bsd|bahama $|dollar bahama|$ bahamas"],["Dollar bermudes", "dollar des bermudes|dollar bermude|dollar bermudes|$ bermudes|bmd"],["Dollar belize", "dollar de Belize|dollar belizien|bzd|$ belize"],["Dollar îles Vierges britanniques", "dollar îles vierges britanniques|dollar iles vierges britanniques|$ iles vierges britanniques"],["Dollar brunei", "dollar de brunei|$ brunei|bnd|dollar brunei"],["Sen", "sen"],["Dollar singapour", "dollar de singapour|dollar singapour|$ sinapour|sgd|$s"],["Dollar Canadien", "dollar canadien|dollars canadien|$ canadien|cad|$can|$c|$ c|dollar canada|dollar canadienne|$ canada|$cad|cad$"],["Dollar iles caimanes", "dollars des îles caïmanes|dollar des îles caïmanes|dollars des iles caimanes|dollar iles caimanes|kyd|$ci"],["Dollar néo-zélandais", "dollar néo-zélandais|dollar néo zélandais|dollar neo-zelandais|dollar neo zelandais|$nz|$ néo-zélandais|$ neo zelandais"],["Dollar îles cook", "dollar îles cook|dollar iles cook|$ iles cook"],["Dollar des fidji", "dollar des fidji|$ fidji|dollar fidji|dollar de fidji|dollars des fidji|dollars de fidji"],["Dollar guyanien", "dollar guyanien|dollar du guyana|dollar dre guyana|$ guayana|gyd|$gy"],["Dollar de Hong Kong", "dollar hong kong|dollar hongkong|dollar de hong kong|dollar de hongkong|$hk|$ hk|hkd|hk $|hk$|dollar hk|$hongkong|dollars hongkong|dollars hong kong"],["Dollar jamaïcain", "dollar jamaïcain|dollars jamaïcain|dollar jamaicain|dollars jamaicain|$j|$ jamaïque|dollar jamaïque|jmd"],["Dollar libérien", "dollar libérien|dollars libérien|dollar liberien|dollars liberien|lrd|$ libérien|$ liberia|$ liberien"],["Dollar namibien", "dollar namibien|dollars namibien|$ namibien|nad|$n|dollar namibie|dollars namibie|$ namibie"],["Dollar des îles salomon", "dollar des îles Salomon|dollar des iles salomon|$si|sbd|$ iles salomon|$ îles salomon"],["Dollar du suriname", "dollar du suriname|srd|$ du suriname|$ suriname|dollar suriname|dollars suriname|dollars du suriname"],["Nouveau dollar de Taïwan", "nouveau dollar de taïwan|nouveau dollar de taiwan|twd|ntd|$nt"],["Dollar trinidadien", "dollar trinidadien|dollars trinidadien|ttd|$ trinidadien"],["Dollar", "dollar|$|dollars"],["Yuan Chinois", "yuan|yuans|yuan chinois|renminbi|cny|rmb|¥"],["Fen", "fen"],["Jiao", "jiao"],["Mark Finlandais", "marks finlandais|mark finlandais|fim|mark"]]); + export const CompoundUnitConnectorRegex = `(?[^.])`; export const CurrencyPrefixList: ReadonlyMap = new Map([["Dollar", "$"],["Dollar États-Unis", "$us|usd|us$"],["Dollar Caraïbes orientales", "xcd|$ec"],["Dollar australien", "a$|$a|aud"],["Dollar bahamas", "bsd|b$"],["Dollar barbadien", "bbd|bds$"],["Dollar de belize", "bz$|bzd"],["Dollar des bermudes", "bd$|bmd"],["Dollar de brunei", "brunei $|bnd"],["Dollar de Singapour", "s$|sgd"],["Dollar Canadien", "cad|$ ca|$ca|$ c"],["Dollar des îles Caïmans", "ci$|kyd"],["Dollar néo-zélandais", "nz$|nzd"],["Dollar de Fidji", "$fj|fjd"],["Dolar guyanien", "g$|gyd"],["Dollar de Hong Kong", "hkd|hk$"],["Dollar jamaïcain", "j$|jmd"],["Dollar libérien", "lrd|l$"],["Dollar namibien", "nad|n$"],["Dollar des îles Salomon", "$ si|$si|sbd"],["Nouveau dollar de Taïwan", "nt$|twd"],["Réal brésilien", "r$|brl|reais"],["Guaraní paraguayen", "₲|gs.|pyg"],["Dollar trinidadien", "ttd|titis"],["Yuan renminbi", "cny|rmb|¥|元"],["Yen", "¥|jpy"],["Euro", "€|eur"],["Pound", "£"],["Florín", "ƒ"],["Livre", "£|gbp"]]); export const AmbiguousCurrencyUnitList = [ 'din.','kina','lari','taka','tala','vatu','yuan','bob','btn','cop','cup','dop','gip','jod','kgs','lak','mga','mop','nad','omr','sar','sbd','scr','sdg','sek','sos','std','try','yer' ]; export const InformationSuffixList: ReadonlyMap = new Map([["Bit", "-bit|bit|bits"],["Kilobit", "kilobit|kilobits|kb|kbit|kbits"],["Megabit", "megabit|megabits|Mb|Mbit|mégabit|mégabits"],["Gigabit", "gigabit|gigabits|Gb|Gbit"],["Terabit", "terabit|terabits|Tb|Tbit|térabit|térabits"],["Petabit", "petabit|petabits|Pb|Pbit|pétabit|pétabits"],["octet", "octet|octets|-octet"],["Kilooctet", "kilo-octet|kilo-octets|kilooctet|kilooctets|ko|kio|kB|KiB|kilobyte|kilobytes"],["Mégaoctet", "mégaoctet|mégaoctets|méga-octet|méga-octets|Mo|Mio|MB|mégabyte|mégabytes"],["Gigaoctet", "gigaoctet|gigaoctets|Go|Gio|GB|GiB|gigabyte|gigabytes"],["Téraoctet", "téraoctet|téraoctets|To|Tio|TB|TiB|térabyte|térabytes"],["Pétaoctet", "pétaoctet|pétaoctets|Po|Pio|PB|PiB|pétabyte|pétabytes"]]); diff --git a/JavaScript/packages/recognizers-number-with-unit/src/resources/portugueseNumericWithUnit.ts b/JavaScript/packages/recognizers-number-with-unit/src/resources/portugueseNumericWithUnit.ts index bb18bf1bc8..17e1e9f0a4 100644 --- a/JavaScript/packages/recognizers-number-with-unit/src/resources/portugueseNumericWithUnit.ts +++ b/JavaScript/packages/recognizers-number-with-unit/src/resources/portugueseNumericWithUnit.ts @@ -11,6 +11,7 @@ export namespace PortugueseNumericWithUnit { export const AgeSuffixList: ReadonlyMap = new Map([["Ano", "anos|ano"],["Mês", "meses|mes|mês"],["Semana", "semanas|semana"],["Dia", "dias|dia"]]); export const AreaSuffixList: ReadonlyMap = new Map([["Quilômetro quadrado", "quilômetro quadrado|quilómetro quadrado|quilometro quadrado|quilômetros quadrados|quilómetros quadrados|quilomeros quadrados|km2|km^2|km²"],["Hectare", "hectômetro quadrado|hectómetro quadrado|hectômetros quadrados|hectómetros cuadrados|hm2|hm^2|hm²|hectare|hectares"],["Decâmetro quadrado", "decâmetro quadrado|decametro quadrado|decâmetros quadrados|decametro quadrado|dam2|dam^2|dam²|are|ares"],["Metro quadrado", "metro quadrado|metros quadrados|m2|m^2|m²"],["Decímetro quadrado", "decímetro quadrado|decimentro quadrado|decímetros quadrados|decimentros quadrados|dm2|dm^2|dm²"],["Centímetro quadrado", "centímetro quadrado|centimetro quadrado|centímetros quadrados|centrimetros quadrados|cm2|cm^2|cm²"],["Milímetro quadrado", "milímetro quadrado|milimetro quadrado|milímetros quadrados|militmetros quadrados|mm2|mm^2|mm²"],["Polegada quadrada", "polegada quadrada|polegadas quadradas|in2|in^2|in²"],["Pé quadrado", "pé quadrado|pe quadrado|pés quadrados|pes quadrados|pé2|pé^2|pé²|sqft|sq ft|ft2|ft^2|ft²"],["Jarda quadrada", "jarda quadrada|jardas quadradas|yd2|yd^2|yd²"],["Milha quadrada", "milha quadrada|milhas quadradas|mi2|mi^2|mi²"],["Acre", "acre|acres"]]); export const CurrencySuffixList: ReadonlyMap = new Map([["Dólar", "dólar|dolar|dólares|dolares"],["Peso", "peso|pesos"],["Coroa", "coroa|coroas"],["Rublo", "rublo|rublos"],["Libra", "libra|libras"],["Florim", "florim|florins|ƒ"],["Dinar", "dinar|dinares"],["Franco", "franco|francos"],["Rupia", "rúpia|rupia|rúpias|rupias"],["Escudo", "escudo|escudos"],["Xelim", "xelim|xelins|xelims"],["Lira", "lira|liras"],["Centavo", "centavo|cêntimo|centimo|centavos|cêntimos|centimo"],["Centésimo", "centésimo|centésimos"],["Pêni", "pêni|péni|peni|penies|pennies"],["Manat", "manat|manate|mánate|man|manats|manates|mánates"],["Euro", "euro|euros|€|eur"],["Centavo de Euro", "centavo de euro|cêntimo de euro|centimo de euro|centavos de euro|cêntimos de euro|centimos de euro"],["Dólar do Caribe Oriental", "dólar do Caribe Oriental|dolar do Caribe Oriental|dólares do Caribe Oriental|dolares do Caribe Oriental|dólar das Caraíbas Orientais|dolar das Caraibas Orientais|dólares das Caraíbas Orientais|dolares das Caraibas Orientais|ec$|xcd"],["Centavo do Caribe Oriental", "centavo do Caribe Oriental|centavo das Caraíbas Orientais|cêntimo do Caribe Oriental|cêntimo das Caraíbas Orientais|centavos do Caribe Oriental|centavos das Caraíbas Orientais|cêntimos do Caribe Oriental|cêntimos das Caraíbas Orientais"],["Franco CFA da África Ocidental", "franco CFA da África Ocidental|franco CFA da Africa Ocidental|francos CFA da África Occidental|francos CFA da Africa Occidental|franco CFA Ocidental|xof"],["Centavo de CFA da África Ocidental", "centavo de CFA da Africa Occidental|centavos de CFA da África Ocidental|cêntimo de CFA da Africa Occidental|cêntimos de CFA da África Ocidental"],["Franco CFA da África Central", "franco CFA da África Central|franco CFA da Africa Central|francos CFA da África Central|francos CFA da Africa Central|franco CFA central|xaf"],["Centavo de CFA da África Central", "centavo de CFA de África Central|centavos de CFA da África Central|cêntimo de CFA de África Central|cêntimos de CFA da África Central"],["Apsar abcásio", "apsar abcásio|apsar abecásio|apsar abcasio|apsar|apsares"],["Afegani afegão", "afegani afegão|afegane afegão|؋|afn|afegane|afgane|afegâni|afeganis|afeganes|afganes|afegânis"],["Pul", "pul|pules|puls"],["Lek albanês", "lek|lekë|lekes|lek albanês|leque|leques|all"],["Qindarke", "qindarka|qindarkë|qindarke|qindarkas"],["Kwanza angolano", "kwanza angolano|kwanzas angolanos|kwanza|kwanzas|aoa|kz"],["Cêntimo angolano", "cêntimo angolano|cêntimo|cêntimos"],["Florim das Antilhas Holandesas", "florim das antilhas holandesas|florim das antilhas neerlandesas|ang"],["Rial saudita", "rial saudita|riais sauditas|riyal saudita|riyals sauditas|riyal|riyals|sar"],["Halala saudita", "halala saudita|halala|hallalah"],["Dinar argelino", "dinar argelino|dinares argelinos|dzd"],["Cêntimo argelino", "centimo argelino|centimos argelinos|cêntimo argelino|cêntimos argelinos|centavo argelino|centavos argelinos"],["Peso argentino", "peso argentino|pesos argentinos|peso|pesos|ar$|ars"],["Centavo argentino", "centavo argentino|centavos argentinos|centavo|ctvo.|ctvos."],["Dram armênio", "dram armênio|dram armênios|dram arménio|dram arménios|dram armenio|dram armenios|dram|drame|drames|դր."],["Luma armênio", "luma armênio|lumas armênios|luma arménio|lumas arménios|luma armenio|lumas armenios|luma|lumas"],["Florim arubano", "florín arubeño|florines arubeños|ƒ arubeños|aƒ|awg"],["Dólar australiano", "dólar australiano|dólares australianos|dolar australiano|dolares australianos|a$|aud"],["Centavo australiano", "centavo australiano|centavos australianos"],["Manat azeri", "manat azeri|manats azeris|azn|manat azerbaijanês|manat azerbaijano|manats azerbaijaneses|manats azerbaijanos"],["Qəpik azeri", "qəpik azeri|qəpik|qəpiks"],["Dólar bahamense", "dólar bahamense|dólares bahamense|dolar bahamense|dolares bahamense|dólar baamiano|dólares baamiano|dolar baamiano|dolares baamiano|b$|bsd"],["Centavo bahamense", "centavo bahamense|centavos bahamense"],["Dinar bareinita", "dinar bareinita|dinar baremita|dinares bareinitas|dinares baremitas|bhd"],["Fil bareinita", "fil bareinita|fil baremita|fils bareinitas|fils baremitas"],["Taka bengali", "taka bengali|takas bengalis|taca|tacas|taka|takas|bdt"],["Poisha bengali", "poisha bengali|poishas bengalis"],["Dólar de Barbados", "dólar de barbados|dólares de barbados|dolar de barbados|dolares de barbados|dólar dos barbados|dólares dos barbados|bbd"],["Centavo de Barbados", "centavo de barbados|centavos de barbados|centavo dos barbados|centavos dos barbados"],["Dólar de Belize", "dólar de belize|dólares de belize|dolar de belize|dolares de belize|dólar do belize|dólares do belize|dolar do belize|dolares do belize|bz$|bzd"],["Centavo de Belize", "centavo de belize|centavos de belize|cêntimo do belize|cêntimos do belize"],["Dólar bermudense", "dólar bermudense|dólares bermudenses|bd$|bmd"],["Centavo bermudense", "centavo bermudense|centavos bermudenses|cêntimo bermudense| cêntimos bermudenses"],["Rublo bielorrusso", "rublo bielorrusso|rublos bielorrussos|br|byr"],["Copeque bielorusso", "copeque bielorrusso|copeques bielorrussos|kopek bielorrusso|kopeks bielorrussos|kap"],["Quiate mianmarense", "quiate mianmarense|quiates mianmarenses|kyat mianmarense|kyates mianmarenses|quiate myanmarense|quiates myanmarenses|kyat myanmarense|kyates myanmarenses|quiate birmanês|quite birmanes|quiates birmaneses|kyat birmanês|kyat birmanes|kyates birmaneses|mmk"],["Pya mianmarense", "pya mianmarense|pyas mianmarenses|pya myanmarense|pyas myanmarenses|pya birmanês|pya birmanes|pyas birmaneses"],["Boliviano", "boliviano|bolivianos|bob|bs"],["Centavo Boliviano", "centavo boliviano|centavos bolivianos"],["Marco da Bósnia e Herzegovina", "marco conversível|marco conversivel|marco convertível|marco convertivel|marcos conversíveis|marcos conversiveis|marcos convertíveis|marcos convertivies|bam"],["Fening da Bósnia e Herzegovina", "fening conversível|fening conversivel|fening convertível|fening convertivel|fenings conversíveis|fenings conversiveis|fenings convertíveis|fenings convertiveis"],["Pula", "pula|pulas|bwp"],["Thebe", "thebe|thebes"],["Real brasileiro", "real brasileiro|real do brasil|real|reais brasileiros|reais do brasil|reais|r$|brl"],["Centavo brasileiro", "centavo de real|centavo brasileiro|centavos de real|centavos brasileiros"],["Dólar de Brunei", "dólar de brunei|dolar de brunei|dólar do brunei|dolar do brunei|dólares de brunéi|dolares de brunei|dólares do brunei|dolares do brunei|bnd"],["Sen de Brunei", "sen de brunei|sen do brunei|sens de brunei|sens do brunei"],["Lev búlgaro", "lev búlgaro|leve búlgaro|leves búlgaros|lev bulgaro|leve bulgaro|leves bulgaros|lv|bgn"],["Stotinka búlgaro", "stotinka búlgaro|stotinki búlgaros|stotinka bulgaro|stotinki bulgaros"],["Franco do Burundi", "franco do burundi|francos do burundi|fbu|fib"],["Centavo Burundi", "centavo burundi|cêntimo burundi|centimo burundi|centavos burundi|cêntimo burundi|centimo burundi"],["Ngultrum butanês", "ngultrum butanês|ngultrum butanes|ngúltrume butanês|ngultrume butanes|ngultrum butaneses|ngúltrumes butaneses|ngultrumes butaneses|btn"],["Chetrum butanês", "chetrum butanês|chetrum butanes|chetrum butaneses"],["Escudo cabo-verdiano", "escudo cabo-verdiano|escudos cabo-verdianos|cve"],["Riel cambojano", "riel cambojano|riéis cambojanos|rieis cambojanos|khr"],["Dólar canadense", "dólar canadense|dolar canadense|dólares canadenses|dolares canadenses|c$|cad"],["Centavo canadense", "centavo canadense|centavos canadenses"],["Peso chileno", "peso chileno|pesos chilenos|cpl"],["Yuan chinês", "yuan chinês|yuan chines|yuans chineses|yuan|yuans|renminbi|rmb|cny|¥"],["Peso colombiano", "peso colombiano|pesos colombianos|cop|col$"],["Centavo colombiano", "centavo colombiano|centavos colombianos"],["Franco comorense", "franco comorense|francos comorenses|kmf|₣"],["Franco congolês", "franco congolês|franco congoles|francos congoleses|cdf"],["Centavo congolês", "centavo congolês|centavo congoles|centavos congoleses|cêntimo congolês|centimo congoles|cêntimos congoleses|cêntimos congoleses"],["Won norte-coreano", "won norte-coreano|wŏn norte-coreano|won norte-coreanos|wŏn norte-coreanos|kpw"],["Chon norte-coreano", "chon norte-coreano|chŏn norte-coreano|chŏn norte-coreanos|chon norte-coreanos"],["Won sul-coreano", "wŏn sul-coreano|won sul-coreano|wŏnes sul-coreanos|wones sul-coreanos|krw"],["Jeon sul-coreano", "jeons sul-coreano|jeons sul-coreanos"],["Colón costarriquenho", "colón costarriquenho|colon costarriquenho|colons costarriquenho|colones costarriquenhos|crc"],["Kuna croata", "kuna croata|kunas croatas|hrk"],["Lipa croata", "lipa croata|lipas croatas"],["Peso cubano", "peso cubano|pesos cubanos|cup"],["Peso cubano convertível", "peso cubano conversível|pesos cubanos conversíveis|peso cubano conversivel|pesos cubanos conversiveis|peso cubano convertível|pesos cubanos convertíveis|peso cubano convertivel|pesos cubanos convertiveis|cuc"],["Coroa dinamarquesa", "coroa dinamarquesa|coroas dinamarquesas|dkk"],["Libra egípcia", "libra egípcia|libra egipcia|libras egípcias|libras egipcias|egp|le"],["Piastra egípcia", "piastra egípcia|piastra egipcia|pisastras egípcias|piastras egipcias"],["Dirham dos Emirados Árabes Unidos", "dirham|dirhams|dirham dos emirados arabes unidos|aed|dhs"],["Nakfa", "nakfa|nfk|ern"],["Centavo de Nakfa", "cêntimo de nakfa|cêntimos de nakfa|centavo de nafka|centavos de nafka"],["Peseta", "peseta|pesetas|pts.|ptas.|esp"],["Dólar estadunidense", "dólar dos estados unidos|dolar dos estados unidos|dólar estadunidense|dólar americano|dólares dos estados unidos|dolares dos estados unidos|dólares estadunidenses|dólares americanos|dolar estadunidense|dolar americano|dolares estadunidenses|dolares americanos|usd|u$d|us$"],["Coroa estoniana", "coroa estoniana|coroas estonianas|eek"],["Senti estoniano", "senti estoniano|senti estonianos"],["Birr etíope", "birr etíope|birr etiope|birr etíopes|birr etiopes|br|etb"],["Santim etíope", "santim etíope|santim etiope|santim etíopes|santim etiopes"],["Peso filipino", "peso filipino|pesos filipinos|php"],["Marco finlandês", "marco finlandês|marco finlandes|marcos finlandeses"],["Dólar fijiano", "dólar fijiano|dolar fijiano|dólares fijianos|dolares fijianos|fj$|fjd"],["Centavo fijiano", "centavo fijiano|centavos fijianos"],["Dalasi gambiano", "dalasi|gmd"],["Bututs", "butut|bututs"],["Lari georgiano", "lari georgiano|lari georgianos|gel"],["Tetri georgiano", "tetri georgiano|tetri georgianos"],["Cedi", "cedi|ghs|gh₵"],["Pesewa", "pesewa"],["Libra de Gibraltar", "libra de gibraltar|libras de gibraltar|gip"],["Peni de Gibraltar", "peni de gibraltar|penies de gibraltar"],["Quetzal guatemalteco", "quetzal guatemalteco|quetzales guatemaltecos|quetzal|quetzales|gtq"],["Centavo guatemalteco", "centavo guatemalteco|centavos guatemaltecos"],["Libra de Guernsey", "libra de Guernsey|libras de Guernsey|ggp"],["Peni de Guernsey", "peni de Guernsey|penies de Guernsey"],["Franco da Guiné", "franco da guiné|franco da guine| franco guineense|francos da guiné|francos da guine|francos guineense|gnf|fg"],["Centavo da Guiné", "cêntimo guineense|centimo guineense|centavo guineense|cêntimos guineenses|centimos guineenses|centavos guineenses"],["Dólar guianense", "dólar guianense|dólares guianense|dolar guianense|dolares guianense|gyd|gy"],["Gurde haitiano", "gurde haitiano|gourde|gurdes haitianos|htg"],["Centavo haitiano", "cêntimo haitiano|cêntimos haitianos|centavo haitiano|centavos haitianos"],["Lempira hondurenha", "lempira hondurenha|lempiras hondurenhas|lempira|lempiras|hnl"],["Centavo hondurenho", "centavo hondurenho|centavos hondurehos|cêntimo hondurenho|cêntimos hondurenhos"],["Dólar de Hong Kong", "dólar de hong kong|dolar de hong kong|dólares de hong kong|dolares de hong kong|hk$|hkd"],["Florim húngaro", "florim húngaro|florim hungaro|florins húngaros|florins hungaros|forinte|forintes|huf"],["Filér húngaro", "fillér|filér|filler|filer"],["Rupia indiana", "rúpia indiana|rupia indiana|rupias indianas|inr"],["Paisa indiana", "paisa indiana|paisas indianas"],["Rupia indonésia", "rupia indonesia|rupia indonésia|rupias indonesias|rupias indonésias|idr"],["Sen indonésio", "send indonésio|sen indonesio|sen indonésios|sen indonesios"],["Rial iraniano", "rial iraniano|riais iranianos|irr"],["Dinar iraquiano", "dinar iraquiano|dinares iraquianos|iqd"],["Fil iraquiano", "fil iraquiano|fils iraquianos|files iraquianos"],["Libra manesa", "libra manesa|libras manesas|imp"],["Peni manês", "peni manes|peni manês|penies maneses"],["Coroa islandesa", "coroa islandesa|coroas islandesas|isk|íkr"],["Aurar islandês", "aurar islandês|aurar islandes|aurar islandeses|eyrir"],["Dólar das Ilhas Cayman", "dólar das ilhas cayman|dolar das ilhas cayman|dólar das ilhas caimão|dólares das ilhas cayman|dolares das ilhas cayman|dólares das ilhas caimão|ci$|kyd"],["Dólar das Ilhas Cook", "dólar das ilhas cook|dolar das ilhas cook|dólares das ilhas cook|dolares das ilhas cook"],["Coroa feroesa", "coroa feroesa|coroas feroesas|fkr"],["Libra das Malvinas", "libra das malvinas|libras das malvinas|fk£|fkp"],["Dólar das Ilhas Salomão", "dólar das ilhas salomão|dolar das ilhas salomao|dólares das ilhas salomão|dolares das ilhas salomao|sbd"],["Novo shekel israelense", "novo shekel|novos shekeles|novo shequel|novo siclo|novo xéquel|shekeles novos|novos sheqalim|sheqalim novos|ils"],["Agora", "agora|agorot"],["Dólar jamaicano", "dólar jamaicano|dolar jamaicano|dólares jamaicanos|dolares jamaicanos|j$|ja$|jmd"],["Yen", "yen|iene|yenes|ienes|jpy"],["Libra de Jersey", "libra de Jersey|libras de Jersey|jep"],["Dinar jordaniano", "dinar jordaniano|dinar jordano|dinares jordanianos|dinares jordanos|jd|jod"],["Piastra jordaniana", "piastra jordaniana|piastra jordano|piastras jordanianas|piastra jordaniano|piastras jordanianos|piastras jordanos"],["Tengue cazaque", "tenge|tengue|tengué|tengue cazaque|kzt"],["Tiyin", "tiyin|tiyins"],["Xelim queniano", "xelim queniano|xelins quenianos|ksh|kes"],["Som quirguiz", "som quirguiz|som quirguizes|soms quirguizes|kgs"],["Tyiyn", "tyiyn|tyiyns"],["Dólar de Kiribati", "dólar de kiribati|dolar de kiribati|dólares de kiribati|dolares de kiribati"],["Dinar kuwaitiano", "dinar kuwaitiano|dinar cuaitiano|dinares kuwaitiano|dinares cuaitianos|kwd"],["Quipe laosiano", "quipe|quipes|kipe|kipes|kip|kip laosiano|kip laociano|kips laosianos|kips laocianos|lak"],["Att laosiano", "at|att|att laosiano|att laosianos"],["Loti do Lesoto", "loti|lóti|maloti|lotis|lótis|lsl"],["Sente", "sente|lisente"],["Libra libanesa", "libra libanesa|libras libanesas|lbp"],["Dólar liberiano", "dólar liberiano|dolar liberiano|dólares liberianos|dolares liberianos|l$|lrd"],["Dinar libio", "dinar libio|dinar líbio|dinares libios|dinares líbios|ld|lyd"],["Dirham libio", "dirham libio|dirhams libios|dirham líbio|dirhams líbios"],["Litas lituana", "litas lituana|litai lituanas|ltl"],["Pataca macaense", "pataca macaense|patacas macaenses|mop$|mop"],["Avo macaense", "avo macaense|avos macaenses"],["Ho macaense", "ho macaense|ho macaenses"],["Dinar macedônio", "denar macedonio|denare macedonios|denar macedônio|denar macedónio|denare macedônio|denare macedónio|dinar macedonio|dinar macedônio|dinar macedónio|dinares macedonios|dinares macedônios|dinares macedónios|den|mkd"],["Deni macedônio", "deni macedonio|deni macedônio|deni macedónio|denis macedonios|denis macedônios|denis macedónios"],["Ariary malgaxe", "ariai malgaxe|ariary malgaxe|ariary malgaxes|ariaris|mga"],["Iraimbilanja", "iraimbilanja|iraimbilanjas"],["Ringuite malaio", "ringgit malaio|ringgit malaios|ringgits malaios|ringuite malaio|ringuites malaios|rm|myr"],["Sen malaio", "sen malaio|sen malaios|centavo malaio|centavos malaios|cêntimo malaio|cêntimos malaios"],["Kwacha do Malawi", "kwacha|cuacha|quacha|mk|mwk"],["Tambala", "tambala|tambalas|tambala malawi"],["Rupia maldiva", "rupia maldiva|rupias maldivas|rupia das maldivas| rupias das maldivas|mvr"],["Dirame marroquino", "dirame marroquino|dirham marroquinho|dirhams marroquinos|dirames marroquinos|mad"],["Rupia maurícia", "rupia maurícia|rupia de Maurício|rupia mauricia|rupia de mauricio|rupias de mauricio|rupias de maurício|rupias mauricias|rupias maurícias|mur"],["Uguia", "uguia|uguias|oguia|ouguiya|oguias|mro"],["Kume", "kumes|kume|khoums"],["Peso mexicano", "peso mexicano|pesos mexicanos|mxn"],["Centavo mexicano", "centavo mexicano|centavos mexicanos"],["Leu moldávio", "leu moldavo|lei moldavos|leu moldávio|leu moldavio|lei moldávios|lei moldavios|leus moldavos|leus moldavios|leus moldávios|mdl"],["Ban moldávio", "ban moldavo|bani moldavos"],["Tugrik mongol", "tugrik mongol|tugrik|tugriks mongóis|tugriks mongois|tug|mnt"],["Metical moçambicao", "metical|metical moçambicano|metical mocambicano|meticais|meticais moçambicanos|meticais mocambicanos|mtn|mzn"],["Dólar namibiano", "dólar namibiano|dólares namibianos|dolar namibio|dolares namibios|n$|nad"],["Centavo namibiano", "centavo namibiano|centavos namibianos|centavo namibio|centavos namibianos"],["Rupia nepalesa", "rupia nepalesa|rupias nepalesas|npr"],["Paisa nepalesa", "paisa nepalesa|paisas nepalesas"],["Córdova nicaraguense", "córdova nicaraguense|cordova nicaraguense|cordova nicaraguana|córdoba nicaragüense|córdobas nicaragüenses|cordobas nicaraguenses|córdovas nicaraguenses|cordovas nicaraguenses|córdovas nicaraguanasc$|nio"],["Centavo nicaraguense", "centavo nicaragüense|centavos nicaraguenses|centavo nicaraguano|centavos nicaraguenses|centavo nicaraguano|centavos nicaraguanos"],["Naira", "naira|ngn"],["Kobo", "kobo"],["Coroa norueguesa", "coroa norueguesa|coroas norueguesas|nok"],["Franco CFP", "franco cfp|francos cfp|xpf"],["Dólar neozelandês", "dólar neozelandês|dolar neozelandes|dólares neozelandeses|dolares neozelandeses|dólar da nova zelândia|dolar da nova zelandia|dólares da nova zelândia|dolares da nova zelandia|nz$|nzd"],["Centavo neozelandês", "centavo neozelandês|centavo neozelandes|centavo da nova zelandia|centavo da nova zelândia|centavos da nova zelandia|centavos neozelandeses|centavos da nova zelândia"],["Rial omanense", "rial omani|riais omanis|rial omanense|riais omanenses|omr"],["Baisa omanense", "baisa omani|baisas omanis|baisa omanense|baisas omanenses"],["Florim holandês", "florim holandês|florim holandes|florins holandeses|nlg"],["Rupia paquistanesa", "rupia paquistanesa|rupias paquistanesas|pkr"],["Paisa paquistanesa", "paisa paquistanesa|paisas paquistanesasas"],["Balboa panamenho", "balboa panamenho|balboas panamenhos|balboa|pab|balboa panamense|balboas panamenses"],["Centavo panamenho", "centavo panamenho|cêntimo panamenho|centavos panamenhos|cêntimos panamenhos|cêntimo panamense|cêntimos panamenses"],["Kina", "kina|kina papuásia|kinas|kinas papuásias|pkg|pgk"],["Toea", "toea"],["Guarani", "guarani|guaranis|gs|pyg"],["Novo Sol", "novo sol peruano|novos sóis peruanos|sol|soles|sóis|nuevo sol|pen|s#."],["Centavo de sol", "cêntimo de sol|cêntimos de sol|centavo de sol|centavos de sol"],["Złoty", "złoty|złotys|zloty|zlotys|zloti|zlotis|zlóti|zlótis|zlote|zł|pln"],["Groszy", "groszy|grosz"],["Rial catariano", "rial qatari|riais qataris|rial catarense|riais catarenses|rial catariano|riais catarianos|qr|qar"],["Dirame catariano", "dirame catariano|dirames catarianos|dirame qatari|dirames qataris|dirame catarense|dirames catarenses|dirham qatari|dirhams qataris|dirham catarense|dirhams catarenses|dirham catariano|dirhams catariano"],["Libra esterlina", "libra esterlina|libras esterlinas|gbp"],["Coroa checa", "coroa checa|coroas checas|kc|czk"],["Peso dominicano", "peso dominicano|pesos dominicanos|rd$|dop"],["Centavo dominicano", "centavo dominicano|centavos dominicanos"],["Franco ruandês", "franco ruandês|franco ruandes|francos ruandeses|rf|rwf"],["Céntimo ruandês", "cêntimo ruandês|centimo ruandes|centavo ruandês|centavo ruandes|cêntimos ruandeses|centimos ruandeses|centavos ruandeses"],["Leu romeno", "leu romeno|lei romenos|leus romenos|ron"],["Ban romeno", "ban romeno|bani romeno|bans romenos"],["Rublo russo", "rublo russo|rublos russos|rub|р."],["Copeque ruso", "copeque russo|copeques russos|kopek ruso|kopeks rusos|copeque|copeques|kopek|kopeks"],["Tala samoano", "tala|tālā|talas|tala samonano|talas samoanos|ws$|sat|wst"],["Sene samoano", "sene"],["Libra de Santa Helena", "libra de santa helena|libras de santa helena|shp"],["Pêni de Santa Helena", "peni de santa helena|penies de santa helena"],["Dobra", "dobra|dobras|db|std"],["Dinar sérvio", "dinar sérvio|dinar servio|dinar serbio|dinares sérvios|dinares servios|dinares serbios|rsd"],["Para sérvio", "para sérvio|para servio|para serbio|paras sérvios|paras servios|paras serbios"],["Rupia seichelense", "rupia de seicheles|rupias de seicheles|rupia seichelense|rupias seichelenses|scr"],["Centavo seichelense", "centavo de seicheles|centavos de seicheles|centavo seichelense|centavos seichelenses"],["Leone serra-leonino", "leone|leones|leone serra-leonino|leones serra-leoninos|le|sll"],["Dólar de Cingapura", "dólar de singapura|dolar de singapura|dórar de cingapura|dolar de cingapura|dólares de singapura|dolares de singapura|dólares de cingapura|dolares de cingapura|sgb"],["Centavo de Cingapura", "centavo de singapura|centavos de singapura|centavo de cingapura|centavos de cingapura"],["Libra síria", "libra síria|libra siria|libras sírias|libras sirias|s£|syp"],["Piastra síria", "piastra siria|piastras sirias|piastra síria|piastras sírias"],["Xelim somali", "xelim somali|xelins somalis|xelim somaliano|xelins somalianos|sos"],["Centavo somali", "centavo somapli|centavos somalis|centavo somaliano|centavos somalianos"],["Xelim da Somalilândia", "xelim da somalilândia|xelins da somalilândia|xelim da somalilandia|xelins da somalilandia"],["Centavo da Somalilândia", "centavo da somalilândia|centavos da somalilândia|centavo da somalilandia|centavos da somalilandia"],["Rupia do Sri Lanka", "rupia do sri lanka|rupia do sri lanca|rupias do sri lanka|rupias do sri lanca|rupia cingalesa|rupias cingalesas|lkr"],["Lilangeni", "lilangeni|lilangenis|emalangeni|szl"],["Rand sul-africano", "rand|rand sul-africano|rands|rands sul-africanos|zar"],["Libra sudanesa", "libra sudanesa|libras sudanesas|sdg"],["Piastra sudanesa", "piastra sudanesa|piastras sudanesas"],["Libra sul-sudanesa", "libra sul-sudanesa|libras sul-sudanesas|ssp"],["Piastra sul-sudanesa", "piastra sul-sudanesa|piastras sul-sudanesas"],["Coroa sueca", "coroa sueca|coroas suecas|sek"],["Franco suíço", "franco suíço|franco suico|francos suíços|francos suicos|sfr|chf"],["Rappen suíço", "rappen suíço|rappen suico|rappens suíços|rappens suicos"],["Dólar surinamês", "dólar surinamês|dolar surinames|dólar do Suriname|dolar do Suriname|dólares surinameses|dolares surinameses|dólares do Suriname|dolares do Suriname|srd"],["Centavo surinamês", "centavo surinamês|centavo surinames|centavos surinameses"],["Baht tailandês", "baht tailandês|bath tailandes|baht tailandeses|thb"],["Satang tailandês", "satang tailandês|satang tailandes|satang tailandeses"],["Novo dólar taiwanês", "novo dólar taiwanês|novo dolar taiwanes|dólar taiwanês|dolar taiwanes|dólares taiwaneses|dolares taiwaneses|twd"],["Centavo taiwanês", "centavo taiwanês|centavo taiwanes|centavos taiwaneses"],["Xelim tanzaniano", "xelim tanzaniano|xelins tanzanianos|tzs"],["Centavo tanzaniano", "centavo tanzaniano|centavos tanzanianos"],["Somoni tajique", "somoni tajique|somoni|somonis tajiques|somonis|tjs"],["Diram tajique", "diram tajique|dirams tajiques|dirames tajiques"],["Paʻanga", "paanga|paangas|paʻanga|pa'anga|top"],["Seniti", "seniti"],["Rublo transdniestriano", "rublo transdniestriano|rublos transdniestriano"],["Copeque transdniestriano", "copeque transdniestriano|copeques transdniestriano"],["Dólar de Trinidade e Tobago", "dólar de trinidade e tobago|dólares trinidade e tobago|dolar de trinidade e tobago|dolares trinidade e tobago|dólar de trinidad e tobago|dólares trinidad e tobago|ttd"],["Centavo de Trinidade e Tobago", "centavo de trinidade e tobago|centavos de trinidade e tobago|centavo de trinidad e tobago|centavos de trinidad e tobago"],["Dinar tunisiano", "dinar tunisiano|dinares tunisianos|dinar tunisino|dinares tunisinos|tnd"],["Milim tunisiano", "milim tunisiano|milim tunesianos|millime tunisianos|millimes tunisianos|milim tunisino|milim tunisinos|millime tunisinos|millimes tunisinos"],["Lira turca", "lira turca|liras turcas|try"],["Kuruş turco", "kuruş turco|kuruş turcos"],["Manat turcomeno", "manat turcomeno|manats turcomenos|tmt"],["Tennesi turcomeno", "tennesi turcomeno|tennesis turcomenos|tenge turcomenos|tenges turcomenos"],["Dólar tuvaluano", "dólar tuvaluano|dolar tuvaluano|dólares tuvaluanos|dolares tuvaluanos"],["Centavo tuvaluano", "centavo tuvaluano|centavos tuvaluanos"],["Grívnia", "grívnia|grivnia|grívnias|grivnias|grivna|grivnas|uah"],["Copeque ucraniano", "kopiyka|copeque ucraniano|copeques ucranianos"],["Xelim ugandês", "xelim ugandês|xelim ugandes|xelins ugandeses|ugx"],["Centavo ugandês", "centavo ugandês|centavo ugandes|centavos ugandeses"],["Peso uruguaio", "peso uruguaio|pesos uruguayis|uyu"],["Centésimo uruguayo", "centésimo uruguaio|centesimo uruguaio|centésimos uruguaios|centesimos uruguaios"],["Som uzbeque", "som uzbeque|som uzbeques|soms uzbeques|somes uzbeques|som usbeque|som usbeques|soms usbeques|somes usbeques|uzs"],["Tiyin uzbeque", "tiyin uzbeque|tiyin uzbeques|tiyins uzbeques|tiyin usbeque|tiyin usbeques|tiyins usbeques"],["Vatu", "vatu|vatus|vuv"],["Bolívar forte venezuelano", "bolívar forte|bolivar forte|bolívar|bolivar|bolívares|bolivares|vef"],["Centavo de bolívar", "cêntimo de bolívar|cêntimos de bolívar|centavo de bolívar|centavo de bolivar|centavos de bolívar|centavos de bolivar"],["Dongue vietnamita", "dongue vietnamita|Đồng vietnamita|dong vietnamita|dongues vietnamitas|dongs vietnamitas|vnd"],["Hào vietnamita", "hào vietnamita|hao vietnamita|hào vietnamitas|hàos vietnamitas|haos vietnamitas"],["Rial iemenita", "rial iemenita|riais iemenitas|yer"],["Fils iemenita", "fils iemenita|fils iemenitas"],["Franco djibutiano", "franco djibutiano|francos djibutianos|franco jibutiano|francos jibutianos|djf"],["Dinar iugoslavo", "dinar iugoslavo|dinares iugoslavos|dinar jugoslavo|dinares jugoslavos|yud"],["Kwacha zambiano", "kwacha zambiano|kwacha zambianos|kwachas zambianos|zmw"],["Ngwee zambiano", "ngwee zambiano|ngwee zambianos|ngwees zambianos"]]); + export const CompoundUnitConnectorRegex = `(?[^.])`; export const CurrencyPrefixList: ReadonlyMap = new Map([["Dólar", "$"],["Dólar estadunidense", "us$|u$d|usd"],["Dólar do Caribe Oriental", "ec$|xcd"],["Dólar australiano", "a$|aud"],["Dólar bahamense", "b$|bsd"],["Dólar de Barbados", "bds$|bbd"],["Dólar de Belizebe", "bz$|bzd"],["Dólar bermudense", "bd$|bmd"],["Dólar de Brunebi", "brunéi $|bnd"],["Dólar de Cingapura", "s$|sgd"],["Dólar canadense", "c$|can$|cad"],["Dólar das Ilhas Cayman", "ci$|kyd"],["Dólar neozelandês", "nz$|nzd"],["Dólar fijgiano", "fj$|fjd"],["Dólar guianense", "gy$|gyd"],["Dólar de Hong Kong", "hk$|hkd"],["Dólar jamaicano", "j$|ja$|jmd"],["Dólar liberiano", "l$|lrd"],["Dólar namibiano", "n$|nad"],["Dólar das Ilhas Salomão", "si$|sbd"],["Novo dólar taiwanês", "nt$|twd"],["Real brasileiro", "r$|brl"],["Guarani", "₲|gs.|pyg"],["Dólar de Trinidade e Tobago", "tt$|ttd"],["Yuan chinês", "¥|cny|rmb"],["Yen", "¥|jpy"],["Euro", "€|eur"],["Florim", "ƒ"],["Libra", "£|gbp"],["Colón costarriquenho", "₡"],["Lira turca", "₺"]]); export const AmbiguousCurrencyUnitList = [ 'le' ]; export const InformationSuffixList: ReadonlyMap = new Map([["bit", "bit|bits"],["kilobit", "kilobit|kilobits|kb|kbit"],["megabit", "megabit|megabits|Mb|Mbit"],["gigabit", "gigabit|gigabits|Gb|Gbit"],["terabit", "terabit|terabits|Tb|Tbit"],["petabit", "petabit|petabits|Pb|Pbit"],["kibibit", "kibibit|kibibits|kib|kibit"],["mebibit", "mebibit|mebibits|Mib|Mibit"],["gibibit", "gibibit|gibibits|Gib|Gibit"],["tebibit", "tebibit|tebibits|Tib|Tibit"],["pebibit", "pebibit|pebibits|Pib|Pibit"],["byte", "byte|bytes"],["kilobyte", "kilobyte|kilobytes|kB|kByte"],["megabyte", "megabyte|megabytes|MB|MByte"],["gigabyte", "gigabyte|gigabytes|GB|GByte"],["terabyte", "terabyte|terabytes|TB|TByte"],["petabyte", "petabyte|petabytes|PB|PByte"],["kibibyte", "kibibyte|kibibytes|kiB|kiByte"],["mebibyte", "mebibyte|mebibytes|MiB|MiByte"],["gibibyte", "gibibyte|gibibytes|GiB|GiByte"],["tebibyte", "tebibyte|tebibytes|TiB|TiByte"],["pebibyte", "pebibyte|pebibytes|PiB|PiByte"]]); diff --git a/JavaScript/packages/recognizers-number-with-unit/src/resources/spanishNumericWithUnit.ts b/JavaScript/packages/recognizers-number-with-unit/src/resources/spanishNumericWithUnit.ts index f9bdb39c43..03d5d954d1 100644 --- a/JavaScript/packages/recognizers-number-with-unit/src/resources/spanishNumericWithUnit.ts +++ b/JavaScript/packages/recognizers-number-with-unit/src/resources/spanishNumericWithUnit.ts @@ -12,6 +12,7 @@ export namespace SpanishNumericWithUnit { export const AreaSuffixList: ReadonlyMap = new Map([["Kilómetro cuadrado", "kilómetro cuadrado|kilómetros cuadrados|km2|km^2|km²"],["Hectómetro cuadrado", "hectómetro cuadrado|hectómetros cuadrados|hm2|hm^2|hm²|hectárea|hectáreas"],["Decámetro cuadrado", "decámetro cuadrado|decámetros cuadrados|dam2|dam^2|dam²|área|áreas"],["Metro cuadrado", "metro cuadrado|metros cuadrados|m2|m^2|m²"],["Decímetro cuadrado", "decímetro cuadrado|decímetros cuadrados|dm2|dm^2|dm²"],["Centímetro cuadrado", "centímetro cuadrado|centímetros cuadrados|cm2|cm^2|cm²"],["Milímetro cuadrado", "milímetro cuadrado|milímetros cuadrados|mm2|mm^2|mm²"],["Pulgada cuadrado", "pulgada cuadrada|pulgadas cuadradas"],["Pie cuadrado", "pie cuadrado|pies cuadrados|pie2|pie^2|pie²|ft2|ft^2|ft²"],["Yarda cuadrado", "yarda cuadrada|yardas cuadradas|yd2|yd^2|yd²"],["Acre", "acre|acres"]]); export const AreaAmbiguousValues = [ 'área','áreas' ]; export const CurrencySuffixList: ReadonlyMap = new Map([["Dólar", "dólar|dólares"],["Peso", "peso|pesos"],["Rublo", "rublo|rublos"],["Libra", "libra|libras"],["Florín", "florín|florines"],["Dinar", "dinar|dinares"],["Franco", "franco|francos"],["Rupia", "rupia|rupias"],["Escudo", "escudo|escudos"],["Chelín", "chelín|chelines"],["Lira", "lira|liras"],["Centavo", "centavo|centavos"],["Céntimo", "céntimo|céntimos"],["Centésimo", "centésimo|centésimos"],["Penique", "penique|peniques"],["Euro", "euro|euros|€|eur"],["Céntimo de Euro", "céntimo de euro|céntimos de euros"],["Dólar del Caribe Oriental", "dólar del Caribe Oriental|dólares del Caribe Oriental|ec$|xcd"],["Centavo del Caribe Oriental", "centavo del Caribe Oriental|centavos del Caribe Oriental"],["Franco CFA de África Occidental", "franco CFA de África Occidental|francos CFA de África Occidental|fcfa|xof"],["Céntimo de CFA de África Occidental", "céntimo de CFA de África Occidental|céntimos de CFA de África Occidental"],["Franco CFA de África Central", "franco CFA de África Central|francos CFA de África Central|xaf"],["Céntimo de CFA de África Central", "céntimo de CFA de África Central|céntimos de CFA de África Central"],["Apsar", "apsar|apsares"],["Afgani afgano", "afgani afgano|؋|afn|afganis|afgani"],["Pul", "pul|puls"],["Lek albanés", "lek|lekë|lekes|lek albanés"],["Qindarka", "qindarka|qindarkë|qindarkas"],["Kwanza angoleño", "kwanza angoleño|kwanzas angoleños|kwanza angoleños|kwanzas angoleño|kwanzas|aoa|kz"],["Cêntimo angoleño", "cêntimo angoleño|cêntimo|cêntimos"],["Florín antillano neerlandés", "florín antillano neerlandés|florínes antillano neerlandés|ƒ antillano neerlandés|ang|naƒ"],["Cent antillano neerlandés", "cent|centen"],["Riyal saudí", "riyal saudí|riyales saudí|sar"],["Halalá saudí", "halalá saudí|hallalah"],["Dinar argelino", "dinar argelino|dinares argelinos|dzd"],["Céntimo argelino", "centimo argelino|centimos argelinos|"],["Peso argentino", "peso argentino|pesos argentinos|peso|pesos|ar$|ars"],["Centavo argentino", "centavo argentino|centavos argentinos|centavo|ctvo.|ctvos."],["Dram armenio", "dram armenio|dram armenios|dram|դր."],["Luma armenio", "luma armenio|luma armenios"],["Florín arubeño", "florín arubeño|florines arubeños|ƒ arubeños|aƒ|awg"],["Yotin arubeño", "yotin arubeño|yotines arubeños"],["Dólar australiano", "dólar australiano|dólares australianos|a$|aud"],["Centavo australiano", "centavo australiano|centavos australianos"],["Manat azerí", "manat azerí|man|azn"],["Qəpik azerí", "qəpik azerí|qəpik"],["Dólar bahameño", "dólar bahameño|dólares bahameños|b$|bsd"],["Centavo bahameño", "centavo bahameño|centavos bahameños"],["Dinar bahreiní", "dinar bahreiní|dinares bahreinies|bhd"],["Fil bahreiní", "fil bahreiní|fils bahreinies"],["Taka bangladeshí", "taka bangladeshí|takas bangladeshí|bdt"],["Poisha bangladeshí", "poisha bangladeshí|poishas bangladeshí"],["Dólar de Barbados", "dólar de barbados|dólares de barbados|bbd"],["Centavo de Barbados", "centavo de barbados|centavos de barbados"],["Dólar beliceño", "dólar beliceño|dólares beliceños|bz$|bzd"],["Centavo beliceño", "centavo beliceño|centavos beliceños"],["Dólar bermudeño", "dólar bermudeño|dólares bermudeños|bd$|bmd"],["Centavo bermudeño", "centavo bermudeño|centavos bermudeños"],["Rublo bielorruso", "rublo bielorruso|rublos bielorrusos|br|byr"],["Kópek bielorruso", "kópek bielorruso|kópeks bielorrusos|kap"],["Kyat birmano", "kyat birmano|kyats birmanos|mmk"],["Pya birmano", "pya birmano|pyas birmanos"],["Boliviano", "boliviano|bolivianos|bob|bs"],["Centésimo Boliviano", "centésimo boliviano|centésimos bolivianos"],["Marco bosnioherzegovino", "marco convertible|marco bosnioherzegovino|marcos convertibles|marcos bosnioherzegovinos|bam"],["Feningas bosnioherzegovino", "feninga convertible|feninga bosnioherzegovina|feningas convertibles"],["Pula", "pula|bwp"],["Thebe", "thebe"],["Real brasileño", "real brasileño|reales brasileños|r$|brl"],["Centavo brasileño", "centavo brasileño|centavos brasileños"],["Dólar de Brunéi", "dólar de brunei|dólares de brunéi|bnd"],["Sen de Brunéi", "sen|sen de brunéi"],["Lev búlgaro", "lev búlgaro|leva búlgaros|lv|bgn"],["Stotinki búlgaro", "stotinka búlgaro|stotinki búlgaros"],["Franco de Burundi", "franco de burundi|francos de burundi|fbu|fib"],["Céntimo Burundi", "céntimo burundi|céntimos burundies"],["Ngultrum butanés", "ngultrum butanés|ngultrum butaneses|btn"],["Chetrum butanés", "chetrum butanés|chetrum butaneses"],["Escudo caboverdiano", "escudo caboverdiano|escudos caboverdianos|cve"],["Riel camboyano", "riel camboyano|rieles camboyanos|khr"],["Dólar canadiense", "dólar canadiense|dólares canadienses|c$|cad"],["Centavo canadiense", "centavo canadiense|centavos canadienses"],["Peso chileno", "peso chileno|pesos chilenos|cpl"],["Yuan chino", "yuan chino|yuanes chinos|yuan|yuanes|renminbi|rmb|cny|¥"],["Peso colombiano", "peso colombiano|pesos colombianos|cop|col$"],["Centavo colombiano", "centavo colombiano|centavos colombianos"],["Franco comorano", "franco comorano|francos comoranos|kmf|₣"],["Franco congoleño", "franco congoleño|francos congoleños|cdf"],["Céntimo congoleño", "céntimo congoleño|céntimos congoleños"],["Won norcoreano", "won norcoreano|wŏn norcoreano|wŏn norcoreanos|kpw"],["Chon norcoreano", "chon norcoreano|chŏn norcoreano|chŏn norcoreanos|chon norcoreanos"],["Won surcoreano", "wŏn surcoreano|won surcoreano|wŏnes surcoreanos|wones surcoreanos|krw"],["Chon surcoreano", "chon surcoreano|chŏn surcoreano|chŏn surcoreanos|chon surcoreanos"],["Colón costarricense", "colón costarricense|colones costarricenses|crc"],["Kuna croata", "kuna croata|kuna croatas|hrk"],["Lipa croata", "lipa croata|lipa croatas"],["Peso cubano", "peso cubano|pesos cubanos|cup"],["Peso cubano convertible", "peso cubano convertible|pesos cubanos convertible|cuc"],["Corona danesa", "corona danesa|coronas danesas|dkk"],["Libra egipcia", "libra egipcia|libras egipcias|egp|le"],["Piastra egipcia", "piastra egipcia|piastras egipcias"],["Colón salvadoreño", "colón salvadoreño|colones salvadoreños|svc"],["Dirham de los Emiratos Árabes Unidos", "dirham|dirhams|dirham de los Emiratos Árabes Unidos|aed|dhs"],["Nakfa", "nakfa|nfk|ern"],["Céntimo de Nakfa", "céntimo de nakfa|céntimos de nakfa"],["Peseta", "peseta|pesetas|pts.|ptas.|esp"],["Dólar estadounidense", "dólar estadounidense|dólares estadounidenses|usd|u$d|us$"],["Corona estonia", "corona estonia|coronas estonias|eek"],["Senti estonia", "senti estonia|senti estonias"],["Birr etíope", "birr etíope|birr etíopes|br|etb"],["Santim etíope", "santim etíope|santim etíopes"],["Peso filipino", "peso filipino|pesos filipinos|php"],["Marco finlandés", "marco finlandés|marcos finlandeses"],["Dólar fiyiano", "dólar fiyiano|dólares fiyianos|fj$|fjd"],["Centavo fiyiano", "centavo fiyiano|centavos fiyianos"],["Dalasi", "dalasi|gmd"],["Bututs", "butut|bututs"],["Lari georgiano", "lari georgiano|lari georgianos|gel"],["Tetri georgiano", "tetri georgiano|tetri georgianos"],["Cedi", "cedi|ghs|gh₵"],["Pesewa", "pesewa"],["Libra gibraltareña", "libra gibraltareña|libras gibraltareñas|gip"],["Penique gibraltareña", "penique gibraltareña|peniques gibraltareñas"],["Quetzal guatemalteco", "quetzal guatemalteco|quetzales guatemaltecos|quetzal|quetzales|gtq"],["Centavo guatemalteco", "centavo guatemalteco|centavos guatemaltecos"],["Libra de Guernsey", "libra de Guernsey|libras de Guernsey|ggp"],["Penique de Guernsey", "penique de Guernsey|peniques de Guernsey"],["Franco guineano", "franco guineano|francos guineanos|gnf|fg"],["Céntimo guineano", "céntimo guineano|céntimos guineanos"],["Dólar guyanés", "dólar guyanés|dólares guyaneses|gyd|gy"],["Gourde haitiano", "gourde haitiano|gourde haitianos|htg"],["Céntimo haitiano", "céntimo haitiano|céntimos haitianos"],["Lempira hondureño", "lempira hondureño|lempira hondureños|hnl"],["Centavo hondureño", "centavo hondureño|centavos hondureño"],["Dólar de Hong Kong", "dólar de hong kong|dólares de hong kong|hk$|hkd"],["Forinto húngaro", "forinto húngaro|forinto húngaros|huf"],["Rupia india", "rupia india|rupias indias|inr"],["Paisa india", "paisa india|paise indias"],["Rupia indonesia", "rupia indonesia|rupias indonesias|idr"],["Sen indonesia", "sen indonesia|sen indonesias"],["Rial iraní", "rial iraní|rial iranies|irr"],["Dinar iraquí", "dinar iraquí|dinares iraquies|iqd"],["Fil iraquí", "fil iraquí|fils iraquies"],["Libra manesa", "libra manesa|libras manesas|imp"],["Penique manes", "penique manes|peniques maneses"],["Corona islandesa", "corona islandesa|coronas islandesas|isk|íkr"],["Aurar islandes", "aurar islandes|aurar islandeses"],["Dólar de las Islas Caimán", "dólar de las Islas Caimán|dólares de las Islas Caimán|ci$|kyd"],["Dólar de las Islas Cook", "dólar de las Islas Cook|dólares de las Islas Cook"],["Corona feroesa", "corona feroesa|coronas feroesas|fkr"],["Libra malvinense", "libra malvinense|libras malvinenses|fk£|fkp"],["Dólar de las Islas Salomón", "dólar de las Islas Salomón|dólares de las Islas Salomón|sbd"],["Nuevo shéquel", "nuevo shéquel|nuevos shéquel|ils"],["Agorot", "agorot"],["Dólar jamaiquino", "dólar jamaiquino|dólares jamaiquinos|j$|ja$|jmd"],["Yen", "yen|yenes|jpy"],["Libra de Jersey", "libra de Jersey|libras de Jersey|jep"],["Dinar jordano", "dinar jordano|dinares jordanos|jd|jod"],["Piastra jordano", "piastra jordano|piastras jordanos"],["Tenge kazajo", "tenge|tenge kazajo|kzt"],["Chelín keniano", "chelín keniano|chelines kenianos|ksh|kes"],["Som kirguís", "som kirguís|kgs"],["Tyiyn", "tyiyn"],["Dólar de Kiribati", "dólar de Kiribati|dólares de Kiribati"],["Dinar kuwaití", "dinar kuwaití|dinares kuwaití"],["Kip laosiano", "kip|kip laosiano|kip laosianos|lak"],["Att laosiano", "att|att laosiano|att laosianos"],["Loti", "loti|maloti|lsl"],["Sente", "sente|lisente"],["Libra libanesa", "libra libanesa|libras libanesas|lbp"],["Dólar liberiano", "dólar liberiano|dólares liberianos|l$|lrd"],["Dinar libio", "dinar libio|dinares libios|ld|lyd"],["Dirham libio", "dirham libio|dirhams libios"],["Litas lituana", "litas lituana|litai lituanas|ltl"],["Pataca macaense", "pataca macaense|patacas macaenses|mop$|mop"],["Avo macaense", "avo macaense|avos macaenses"],["Ho macaense", "ho macaense|ho macaenses"],["Denar macedonio", "denar macedonio|denare macedonios|den|mkd"],["Deni macedonio", "deni macedonio|deni macedonios"],["Ariary malgache", "ariary malgache|ariary malgaches|mga"],["Iraimbilanja malgache", "iraimbilanja malgache|iraimbilanja malgaches"],["Ringgit malayo", "ringgit malayo|ringgit malayos|rm|myr"],["Sen malayo", "sen malayo|sen malayos"],["Kwacha malauí", "kwacha malauí|mk|mwk"],["Támbala malauí", "támbala malauí"],["Rupia de Maldivas", "rupia de Maldivas|rupias de Maldivas|mvr"],["Dirham marroquí", "dirham marroquí|dirhams marroquies|mad"],["Rupia de Mauricio", "rupia de Mauricio|rupias de Mauricio|mur"],["Uguiya", "uguiya|uguiyas|mro"],["Jum", "jum|jums"],["Peso mexicano", "peso mexicano|pesos mexicanos|mxn"],["Centavo mexicano", "centavo mexicano|centavos mexicanos"],["Leu moldavo", "leu moldavo|lei moldavos|mdl"],["Ban moldavo", "ban moldavo|bani moldavos"],["Tugrik mongol", "tugrik mongol|tugrik|tugrik mongoles|tug|mnt"],["Metical mozambiqueño", "metical|metical mozambiqueño|meticales|meticales mozambiqueños|mtn|mzn"],["Dram de Nagorno Karabaj", "dram de Nagorno Karabaj|drams de Nagorno Karabaj|"],["Luma de Nagorno Karabaj", "luma de Nagorno Karabaj"],["Dólar namibio", "dólar namibio|dólares namibios|n$|nad"],["Centavo namibio", "centavo namibio|centavos namibios"],["Rupia nepalí", "rupia nepalí|rupias nepalies|npr"],["Paisa nepalí", "paisa nepalí|paisas nepalies"],["Córdoba nicaragüense", "córdoba nicaragüense|córdobas nicaragüenses|c$|nio"],["Centavo nicaragüense", "centavo nicaragüense|centavos nicaragüenses"],["Naira", "naira|ngn"],["Kobo", "kobo"],["Corona noruega", "corona noruega|coronas noruegas|nok"],["Franco CFP", "franco cfp|francos cfp|xpf"],["Dólar neozelandés", "dólar neozelandés|dólares neozelandeses|dólar de Nueva Zelanda|dólares de Nueva Zelanda|nz$|nzd"],["Centavo neozelandés", "centavo neozelandés|centavo de Nueva Zelanda|centavos de Nueva Zelanda|centavos neozelandeses"],["Rial omaní", "rial omaní|riales omanies|omr"],["Baisa omaní", "baisa omaní|baisa omanies"],["Florín neerlandés", "florín neerlandés|florines neerlandeses|nlg"],["Rupia pakistaní", "rupia pakistaní|rupias pakistanies|pkr"],["Paisa pakistaní", "paisa pakistaní|paisas pakistanies"],["Balboa panameño", "balboa panameño|balboa panameños|pab"],["Centésimo panameño", "centésimo panameño|centésimos panameños"],["Kina", "kina|pkg|pgk"],["Toea", "toea"],["Guaraní", "guaraní|guaranies|gs|pyg"],["Sol", "sol|soles|nuevo sol|pen|s#."],["Céntimo de sol", "céntimo de sol|céntimos de sol"],["Złoty", "złoty|esloti|eslotis|zł|pln"],["Groszy", "groszy"],["Riyal qatarí", "riyal qatarí|riyal qataries|qr|qar"],["Dirham qatarí", "dirham qatarí|dirhams qataries"],["Libra esterlina", "libra esterlina|libras esterlinas|gbp"],["Corona checa", "corona checa|coronas checas|kc|czk"],["Peso dominicano", "peso dominicano|pesos dominicanos|rd$|dop"],["Centavo dominicano", "centavo dominicano|centavos dominicanos"],["Franco ruandés", "franco ruandés|francos ruandeses|rf|rwf"],["Céntimo ruandés", "céntimo ruandés|céntimos ruandeses"],["Leu rumano", "leu rumano|lei rumanos|ron"],["Ban rumano", "ban rumano|bani rumanos"],["Rublo ruso", "rublo ruso|rublos rusos|rub"],["Kopek ruso", "kopek ruso|kopeks rusos"],["Tala", "tala|tālā|ws$|sat|wst"],["Sene", "sene"],["Libra de Santa Helena", "libra de Santa Helena|libras de Santa Helena|shp"],["Penique de Santa Helena", "penique de Santa Helena|peniques de Santa Helena"],["Dobra", "dobra|db|std"],["Dinar serbio", "dinar serbio|dinares serbios|rsd"],["Para serbio", "para serbio|para serbios"],["Rupia de Seychelles", "rupia de Seychelles|rupias de Seychelles|scr"],["Centavo de Seychelles", "centavo de Seychelles|centavos de Seychelles"],["Leone", "leone|le|sll"],["Dólar de Singapur", "dólar de singapur|dólares de singapur|sgb"],["Centavo de Singapur", "centavo de Singapur|centavos de Singapur"],["Libra siria", "libra siria|libras sirias|s£|syp"],["Piastra siria", "piastra siria|piastras sirias"],["Chelín somalí", "chelín somalí|chelines somalies|sos"],["Centavo somalí", "centavo somalí|centavos somalies"],["Chelín somalilandés", "chelín somalilandés|chelines somalilandeses"],["Centavo somalilandés", "centavo somalilandés|centavos somalilandeses"],["Rupia de Sri Lanka", "rupia de Sri Lanka|rupias de Sri Lanka|lkr"],["Céntimo de Sri Lanka", "céntimo de Sri Lanka|céntimos de Sri Lanka"],["Lilangeni", "lilangeni|emalangeni|szl"],["Rand sudafricano", "rand|rand sudafricano|zar"],["Libra sudanesa", "libra sudanesa|libras sudanesas|sdg"],["Piastra sudanesa", "piastra sudanesa|piastras sudanesas"],["Libra sursudanesa", "libra sursudanesa|libras sursudanesa|ssp"],["Piastra sursudanesa", "piastra sursudanesa|piastras sursudanesas"],["Corona sueca", "corona sueca|coronas suecas|sek"],["Franco suizo", "franco suizo|francos suizos|sfr|chf"],["Rappen suizo", "rappen suizo|rappens suizos"],["Dólar surinamés", "óolar surinamés|dólares surinameses|srd"],["Centavo surinamés", "centavo surinamés|centavos surinamés"],["Baht tailandés", "baht tailandés|baht tailandeses|thb"],["Satang tailandés", "satang tailandés|satang tailandeses"],["Nuevo dólar taiwanés", "nuevo dólar taiwanés|dólar taiwanés|dólares taiwaneses|twd"],["Centavo taiwanés", "centavo taiwanés|centavos taiwaneses"],["Chelín tanzano", "chelín tanzano|chelines tanzanos|tzs"],["Centavo tanzano", "centavo tanzano|centavos tanzanos"],["Somoni tayiko", "somoni tayiko|somoni|tjs"],["Diram", "diram|dirams"],["Paʻanga", "dólar tongano|dólares tonganos|paʻanga|pa'anga|top"],["Seniti", "seniti"],["Rublo de Transnistria", "rublo de Transnistria|rublos de Transnistria"],["Kopek de Transnistria", "kopek de Transnistria|kopeks de Transnistria"],["Dólar trinitense", "dólar trinitense|dólares trinitenses|ttd"],["Centavo trinitense", "centavo trinitense|centavos trinitenses"],["Dinar tunecino", "dinar tunecino|dinares tunecinos|tnd"],["Millime tunecino", "millime tunecino|millimes tunecinos"],["Lira turca", "lira turca|liras turcas|try"],["Kuruş turca", "kuruş turca|kuruş turcas"],["Manat turkmeno", "manat turkmeno|manat turkmenos|tmt"],["Tennesi turkmeno", "tennesi turkmeno|tenge turkmeno"],["Dólar tuvaluano", "dólar tuvaluano|dólares tuvaluanos"],["Centavo tuvaluano", "centavo tuvaluano|centavos tuvaluanos"],["Grivna", "grivna|grivnas|uah"],["Kopiyka", "kopiyka|kópeks"],["Chelín ugandés", "chelín ugandés|chelines ugandeses|ugx"],["Centavo ugandés", "centavo ugandés|centavos ugandeses"],["Peso uruguayo", "peso uruguayo|pesos uruguayos|uyu"],["Centésimo uruguayo", "centésimo uruguayo|centésimos uruguayos"],["Som uzbeko", "som uzbeko|som uzbekos|uzs"],["Tiyin uzbeko", "tiyin uzbeko|tiyin uzbekos"],["Vatu", "vatu|vuv"],["Bolívar fuerte", "bolívar fuerte|bolívar|bolívares|vef"],["Céntimo de bolívar", "céntimo de bolívar|céntimos de bolívar"],["Đồng vietnamita", "Đồng vietnamita|dong vietnamita|dong vietnamitas|vnd"],["Hào vietnamita", "Hào vietnamita|hao vietnamita|hao vietnamitas"],["Rial yemení", "rial yemení|riales yemenies|yer"],["Fils yemení", "fils yemení|fils yemenies"],["Franco yibutiano", "franco yibutiano|francos yibutianos|djf"],["Dinar yugoslavo", "dinar yugoslavo|dinares yugoslavos|yud"],["Kwacha zambiano", "kwacha zambiano|kwacha zambianos|zmw"],["Ngwee zambiano", "ngwee zambiano|ngwee zambianos"]]); + export const CompoundUnitConnectorRegex = `(?[^.])`; export const CurrencyPrefixList: ReadonlyMap = new Map([["Dólar", "$"],["Dólar estadounidense", "us$|u$d|usd"],["Dólar del Caribe Oriental", "ec$|xcd"],["Dólar australiano", "a$|aud"],["Dólar bahameño", "b$|bsd"],["Dólar de Barbados", "bds$|bbd"],["Dólar beliceño", "bz$|bzd"],["Dólar bermudeño", "bd$|bmd"],["Dólar de Brunéi", "brunéi $|bnd"],["Dólar de Singapur", "s$|sgd"],["Dólar canadiense", "c$|can$|cad"],["Dólar de las Islas Caimán", "ci$|kyd"],["Dólar neozelandés", "nz$|nzd"],["Dólar fiyiano", "fj$|fjd"],["Dólar guyanés", "gy$|gyd"],["Dólar de Hong Kong", "hk$|hkd"],["Dólar jamaiquino", "j$|ja$|jmd"],["Dólar liberiano", "l$|lrd"],["Dólar namibio", "n$|nad"],["Dólar de las Islas Salomón", "si$|sbd"],["Nuevo dólar taiwanés", "nt$|twd"],["Real brasileño", "r$|brl"],["Guaraní", "₲|gs.|pyg"],["Dólar trinitense", "tt$|ttd"],["Yuan chino", "¥|cny|rmb"],["Yen", "¥|jpy"],["Euro", "€|eur"],["Florín", "ƒ"],["Libra", "£|gbp"],["Colón costarricense", "₡"],["Lira turca", "₺"]]); export const AmbiguousCurrencyUnitList = [ 'le' ]; export const DimensionSuffixList: ReadonlyMap = new Map([["Kilómetro", "km|kilometro|kilómetro|kilometros|kilómetros"],["Hectómetro", "hm|hectometro|hectómetro|hectometros|hectómetros"],["Decámetro", "decametro|decámetro|decametros|decámetros|dam"],["Metro", "m|m.|metro|metros"],["Decímetro", "dm|decimetro|decímetro|decimetros|decímetros"],["Centímetro", "cm|centimetro|centímetro|centimetros|centimetros"],["Milímetro", "mm|milimetro|milímetro|milimetros|milímetros"],["Micrómetro", "µm|um|micrometro|micrómetro|micrometros|micrómetros|micrón|micrónes"],["Nanómetro", "nm|nanometro|nanómetro|nanometros|nanómetros"],["Picómetro", "pm|picometro|picómetro|picometros|picometros"],["Milla", "mi|milla|millas"],["Yarda", "yd|yarda|yardas"],["Pulgada", "pulgada|pulgadas|\\\""],["Pie", "pie|pies|ft"],["Año luz", "año luz|años luz|al"],["Metro por segundo", "metro/segundo|m/s|metro por segundo|metros por segundo|metros por segundos"],["Kilómetro por hora", "km/h|kilómetro por hora|kilometro por hora|kilómetros por hora|kilometros por hora|kilómetro/hora|kilometro/hora|kilómetros/hora|kilometros/hora"],["Kilómetro por minuto", "km/min|kilómetro por minuto|kilometro por minuto|kilómetros por minuto|kilometros por minuto|kilómetro/minuto|kilometro/minuto|kilómetros/minuto|kilometros/minuto"],["Kilómetro por segundo", "km/seg|kilómetro por segundo|kilometro por segundo|kilómetros por segundo|kilometros por segundo|kilómetro/segundo|kilometro/segundo|kilómetros/segundo|kilometros/segundo"],["Milla por hora", "mph|milla por hora|mi/h|milla/hora|millas/hora|millas por hora"],["Nudo", "kt|nudo|nudos|kn"],["Pie por segundo", "ft/s|pie/s|ft/seg|pie/seg|pie por segundo|pies por segundo"],["Pie por minuto", "ft/min|pie/min|pie por minuto|pies por minuto"],["Yarda por minuto", "yardas por minuto|yardas/minuto|yardas/min"],["Yarda por segundo", "yardas por segundo|yardas/segundo|yardas/seg"],["Kilómetro cuadrado", "kilómetro cuadrado|kilómetros cuadrados|km2|km^2|km²"],["Hectómetro cuadrado", "hectómetro cuadrado|hectómetros cuadrados|hm2|hm^2|hm²|hectárea|hectáreas"],["Decámetro cuadrado", "decámetro cuadrado|decámetros cuadrados|dam2|dam^2|dam²|área|áreas"],["Metro cuadrado", "metro cuadrado|metros cuadrados|m2|m^2|m²"],["Decímetro cuadrado", "decímetro cuadrado|decímetros cuadrados|dm2|dm^2|dm²"],["Centímetro cuadrado", "centímetro cuadrado|centímetros cuadrados|cm2|cm^2|cm²"],["Milímetro cuadrado", "milímetro cuadrado|milímetros cuadrados|mm2|mm^2|mm²"],["Pulgada cuadrado", "pulgada cuadrada|pulgadas cuadradas"],["Pie cuadrado", "pie cuadrado|pies cuadrados|pie2|pie^2|pie²|ft2|ft^2|ft²"],["Yarda cuadrado", "yarda cuadrada|yardas cuadradas|yd2|yd^2|yd²"],["Acre", "acre|acres"],["Kilómetro cúbico", "kilómetro cúbico|kilómetros cúbico|km3|km^3|km³"],["Hectómetro cúbico", "hectómetro cúbico|hectómetros cúbico|hm3|hm^3|hm³"],["Decámetro cúbico", "decámetro cúbico|decámetros cúbico|dam3|dam^3|dam³"],["Metro cúbico", "metro cúbico|metros cúbico|m3|m^3|m³"],["Decímetro cúbico", "decímetro cúbico|decímetros cúbico|dm3|dm^3|dm³"],["Centímetro cúbico", "centímetro cúbico|centímetros cúbico|cc|cm3|cm^3|cm³"],["Milímetro cúbico", "milímetro cúbico|milímetros cúbico|mm3|mm^3|mm³"],["Pulgada cúbica", "pulgada cúbics|pulgadas cúbicas"],["Pie cúbico", "pie cúbico|pies cúbicos|pie3|pie^3|pie³|ft3|ft^3|ft³"],["Yarda cúbica", "yarda cúbica|yardas cúbicas|yd3|yd^3|yd³"],["Hectolitro", "hectolitro|hectolitros|hl"],["Litro", "litro|litros|lts|l"],["Mililitro", "mililitro|mililitros|ml"],["Galón", "galón|galones"],["Pinta", "pinta|pintas"],["Barril", "barril|barriles"],["Onza líquida", "onza líquida|onzas líquidas"],["Tonelada métrica", "tonelada métrica|toneladas métricas"],["Tonelada", "ton|tonelada|toneladas"],["Kilogramo", "kg|kilogramo|kilogramos"],["Hectogramo", "hg|hectogramo|hectogramos"],["Decagramo", "dag|decagramo|decagramos"],["Gramo", "g|gr|gramo|gramos"],["Decigramo", "dg|decigramo|decigramos"],["Centigramo", "cg|centigramo|centigramos"],["Miligramo", "mg|miligramo|miligramos"],["Microgramo", "µg|ug|microgramo|microgramos"],["Nanogramo", "ng|nanogramo|nanogramos"],["Picogramo", "pg|picogramo|picogramos"],["Libra", "lb|libra|libras"],["Onza", "oz|onza|onzas"],["Grano", "grano|granos"],["Quilate", "ct|kt|quilate|quilates"],["bit", "bit|bits"],["kilobit", "kilobit|kilobits|kb|kbit"],["megabit", "megabit|megabits|Mb|Mbit"],["gigabit", "gigabit|gigabits|Gb|Gbit"],["terabit", "terabit|terabits|Tb|Tbit"],["petabit", "petabit|petabits|Pb|Pbit"],["kibibit", "kibibit|kibibits|kib|kibit"],["mebibit", "mebibit|mebibits|Mib|Mibit"],["gibibit", "gibibit|gibibits|Gib|Gibit"],["tebibit", "tebibit|tebibits|Tib|Tibit"],["pebibit", "pebibit|pebibits|Pib|Pibit"],["byte", "byte|bytes"],["kilobyte", "kilobyte|kilobytes|kB|kByte"],["megabyte", "megabyte|megabytes|MB|MByte"],["gigabyte", "gigabyte|gigabytes|GB|GByte"],["terabyte", "terabyte|terabytes|TB|TByte"],["petabyte", "petabyte|petabytes|PB|PByte"],["kibibyte", "kibibyte|kibibytes|kiB|kiByte"],["mebibyte", "mebibyte|mebibytes|MiB|MiByte"],["gibibyte", "gibibyte|gibibytes|GiB|GiByte"],["tebibyte", "tebibyte|tebibytes|TiB|TiByte"],["pebibyte", "pebibyte|pebibytes|PiB|PiByte"]]); diff --git a/Patterns/Base-Currency.yaml b/Patterns/Base-Currency.yaml new file mode 100644 index 0000000000..4dd448748f --- /dev/null +++ b/Patterns/Base-Currency.yaml @@ -0,0 +1,247 @@ +CurrencyFractionMapping: !dictionary + types: [ string, string ] + entries: + CNY: FEN|JIAO + __D: CENT + RUB: KOPEK + AFN: PUL + EUR: CENT + ALL: QINDARKE + _ALP: PENNY + GBP: PENNY + _GGP: PENNY + DZD: SANTEEM + AOA: CENTIMO + ARS: CENTAVO + AMD: LUMA + AWG: CENT + _AP: PENNY + SHP: PENNY + AUD: CENT + AZN: QƏPIK + BSD: CENT + BHD: FILS + BDT: POISHA + BBD: CENT + BYN: KAPYEYKA + BZD: CENT + XOF: CENTIME + BMD: CENT + BTN: CHETRUM + INR: PAISA + BOB: CENTAVO + USD: CENT + BAM: FENING + BWP: THEBE + BRL: CENTAVO + _BD: CENT + BND: SEN + SGD: CENT + BGN: STOTINKA + BIF: CENTIME + KHR: SEN + XAF: CENTIME + CAD: CENT + CVE: CENTAVO + KYD: CENT + CLP: CENTAVO + COP: CENTAVO + KMF: CENTIME + CDF: CENTIME + NZD: CENT + _CKD: CENT + CRC: CENTIMO + HRK: LIPA + CUC: CENTAVO + CUP: CENTAVO + CZK: HALER + DKK: ØRE + DJF: CENTIME + DOP: CENTAVO + EGP: PIASTRE + ERN: CENT + ETB: SANTIM + FKP: PENNY + _FOK: OYRA + FJD: CENT + XPF: CENTIME + GMD: BUTUT + GEL: TETRI + GHS: PESEWA + GIP: PENNY + GTQ: CENTAVO + GNF: CENTIME + GYD: CENT + HTG: CENTIME + HNL: CENTAVO + HKD: CENT + HUF: FILLER + ISK: EYRIR + IDR: SEN + IRR: DINAR + IQD: FILS + IMP: PENNY + ILS: AGORA + JMD: CENT + JPY: SEN + JEP: PENNY + JOD: PIASTRE + KZT: TIIN + KES: CENT + _KID: CENT + KPW: CHON + KRW: JEON + KWD: FILS + KGS: TYIYN + LAK: ATT + LBP: PIASTRE + LSL: SENTE + ZAR: CENT + LRD: CENT + LYD: DIRHAM + CHF: RAPPEN + MOP: AVO + MKD: DENI + MGA: IRAIMBILANJA + MWK: TAMBALA + MYR: SEN + MVR: LAARI + MRO: KHOUMS + MUR: CENT + MXN: CENTAVO + _MD: CENT + MDL: BAN + MNT: MONGO + MAD: CENTIME + MZN: CENTAVO + MMK: PYA + NAD: CENT + _ND: CENT + NPR: PAISA + NIO: CENTAVO + NGN: KOBO + _NID: CENT + TRY: KURUS + NOK: ØRE + OMR: BAISA + PKR: PAISA + _PD: CENT + PAB: CENTESIMO + PGK: TOEA + PYG: CENTIMO + PEN: CENTIMO + _PND: CENT + PLN: GROSZ + QAR: DIRHAM + RON: BAN + RWF: CENTIME + WST: SENE + STD: CENTIMO + SAR: HALALA + RSD: PARA + SCR: CENT + SLL: CENT + SBD: CENT + SOS: CENT + _SS: CENT + _SP: PENNY + SSP: PIASTRE + LKR: CENT + SDG: PIASTRE + SRD: CENT + SZL: CENT + SEK: ORE + SYP: PIASTRE + TWD: CENT + TJS: DIRAM + TZS: CENT + THB: SATANG + PRB: KOPEK + TTD: CENT + _TP: PENNY + TND: MILLIME + TMT: TENNESI + TVD: CENT + UGX: CENT + UAH: KOPIYKA + AED: FILS + UYU: CENTESIMO + VEF: CENTIMO + YER: FILS + ZMW: NGWEE +CurrencyFractionalRatios: !dictionary + types: [ string, long ] + entries: + Kopek: 100 + Pul: 100 + Cent: 100 + Qindarkë: 100 + Penny: 100 + Santeem: 100 + Cêntimo: 100 + Centavo: 100 + Luma: 100 + Qəpik: 100 + Fils: 1000 + Poisha: 100 + Kapyeyka: 100 + Centime: 100 + Chetrum: 100 + Paisa: 100 + Fening: 100 + Thebe: 100 + Sen: 100 + Stotinka: 100 + Jiao: 10 + Fen: 100 + Céntimo: 100 + Lipa: 100 + Haléř: 100 + Øre: 100 + Piastre: 100 + Santim: 100 + Oyra: 100 + Butut: 100 + Tetri: 100 + Pesewa: 100 + Fillér: 100 + Eyrir: 100 + Dinar: 100 + Agora: 100 + Tïın: 100 + Chon: 100 + Jeon: 100 + Tyiyn: 100 + Att: 100 + Sente: 100 + Dirham: 1000 + Rappen: 100 + Avo: 100 + Deni: 100 + Iraimbilanja: 5 + Tambala: 100 + Laari: 100 + Khoums: 5 + Ban: 100 + Möngö: 100 + Pya: 100 + Kobo: 100 + Kuruş: 100 + Baisa: 1000 + Centésimo: 100 + Toea: 100 + Sentimo: 100 + Grosz: 100 + Sene: 100 + Halala: 100 + Para: 100 + Öre: 100 + Diram: 100 + Satang: 100 + Seniti: 100 + Millime: 1000 + Tennesi: 100 + Kopiyka: 100 + Tiyin: 100 + Hào: 10 + Ngwee: 100 \ No newline at end of file diff --git a/Patterns/Chinese/Chinese-NumbersWithUnit.yaml b/Patterns/Chinese/Chinese-NumbersWithUnit.yaml index 0a5df9a1a8..c2f202c57c 100644 --- a/Patterns/Chinese/Chinese-NumbersWithUnit.yaml +++ b/Patterns/Chinese/Chinese-NumbersWithUnit.yaml @@ -310,6 +310,8 @@ CurrencySuffixList: !dictionary #Additional Finnish markka: 芬兰马克 Penni: 盆尼 +CompoundUnitConnectorRegex: !simpleRegex + def: (?又|再) CurrencyPrefixList: !dictionary types: [string, string] entries: diff --git a/Patterns/English/English-NumbersWithUnit.yaml b/Patterns/English/English-NumbersWithUnit.yaml index bbe7dbca1a..e056a63d65 100644 --- a/Patterns/English/English-NumbersWithUnit.yaml +++ b/Patterns/English/English-NumbersWithUnit.yaml @@ -362,12 +362,281 @@ CurrencySuffixList: !dictionary Tuvaluan dollar: tuvaluan dollars|tuvaluan dollar|tuvaluan $ Dollar: dollars|dollar|$ #Chinese yuan - Chinese yuan: yuan|chinese yuan|renminbi|cny|rmb|¥ + Chinese yuan: yuan|kuai|chinese yuan|renminbi|cny|rmb|¥ Fen: fen - Jiao: jiao + Jiao: jiao|mao #Additional Finnish markka: suomen markka|finnish markka|finsk mark|fim|markkaa|markka Penni: penniä|penni +CurrencyNameToIsoCodeMap: !dictionary + types: [ string, string ] + entries: + Afghan afghani: AFN + Euro: EUR + Albanian lek: ALL + Angolan kwanza: AOA + Armenian dram: AMD + Aruban florin: AWG + Bangladeshi taka: BDT + Bhutanese ngultrum: BTN + Bolivian boliviano: BOB + Bosnia and Herzegovina convertible mark: BAM + Botswana pula: BWP + Brazilian real: BRL + Bulgarian lev: BGN + Cambodian riel: KHR + Cape Verdean escudo: CVE + Costa Rican colón: CRC + Croatian kuna: HRK + Czech koruna: CZK + Eritrean nakfa: ERN + Ethiopian birr: ETB + Gambian dalasi: GMD + Georgian lari: GEL + Ghanaian cedi: GHS + Guatemalan quetzal: GTQ + Haitian gourde: HTG + Honduran lempira: HNL + Hungarian forint: HUF + Iranian rial: IRR + Yemeni rial: YER + Israeli new shekel: ILS + Japanese yen: JPY + Kazakhstani tenge: KZT + Kenyan shilling: KES + North Korean won: KPW + South Korean won: KRW + Kyrgyzstani som: KGS + Lao kip: LAK + Lesotho loti: LSL + South African rand: ZAR + Macanese pataca: MOP + Macedonian denar: MKD + Malagasy ariary: MGA + Malawian kwacha: MWK + Malaysian ringgit: MYR + Mauritanian ouguiya: MRO + Mongolian tögrög: MNT + Mozambican metical: MZN + Burmese kyat: MMK + Nicaraguan córdoba: NIO + Nigerian naira: NGN + Turkish lira: TRY + Omani rial: OMR + Panamanian balboa: PAB + Papua New Guinean kina: PGK + Paraguayan guaraní: PYG + Peruvian sol: PEN + Polish złoty: PLN + Qatari riyal: QAR + Saudi riyal: SAR + Samoan tālā: WST + São Tomé and Príncipe dobra: STD + Sierra Leonean leone: SLL + Swazi lilangeni: SZL + Tajikistani somoni: TJS + Thai baht: THB + Ukrainian hryvnia: UAH + Vanuatu vatu: VUV + Venezuelan bolívar: VEF + Zambian kwacha: ZMW + Moroccan dirham: MAD + United Arab Emirates dirham: AED + Azerbaijani manat: AZN + Turkmenistan manat: TMT + Somali shilling: SOS + Tanzanian shilling: TZS + Ugandan shilling: UGX + Romanian leu: RON + Moldovan leu: MDL + Nepalese rupee: NPR + Pakistani rupee: PKR + Indian rupee: INR + Seychellois rupee: SCR + Mauritian rupee: MUR + Maldivian rufiyaa: MVR + Sri Lankan rupee: LKR + Indonesian rupiah: IDR + Danish krone: DKK + Norwegian krone: NOK + Icelandic króna: ISK + Swedish krona: SEK + West African CFA franc: XOF + Central African CFA franc: XAF + Comorian franc: KMF + Congolese franc: CDF + Burundian franc: BIF + Djiboutian franc: DJF + CFP franc: XPF + Guinean franc: GNF + Swiss franc: CHF + Rwandan franc: RWF + Russian ruble: RUB + Transnistrian ruble: PRB + Belarusian ruble: BYN + Algerian dinar: DZD + Bahraini dinar: BHD + Iraqi dinar: IQD + Jordanian dinar: JOD + Kuwaiti dinar: KWD + Libyan dinar: LYD + Serbian dinar: RSD + Tunisian dinar: TND + Argentine peso: ARS + Chilean peso: CLP + Colombian peso: COP + Cuban convertible peso: CUC + Cuban peso: CUP + Dominican peso: DOP + Mexican peso: MXN + Uruguayan peso: UYU + British pound: GBP + Saint Helena pound: SHP + Egyptian pound: EGP + Falkland Islands pound: FKP + Gibraltar pound: GIP + Manx pound: IMP + Jersey pound: JEP + Lebanese pound: LBP + South Sudanese pound: SSP + Sudanese pound: SDG + Syrian pound: SYP + United States dollar: USD + Australian dollar: AUD + Bahamian dollar: BSD + Barbadian dollar: BBD + Belize dollar: BZD + Bermudian dollar: BMD + Brunei dollar: BND + Singapore dollar: SGD + Canadian dollar: CAD + Cayman Islands dollar: KYD + New Zealand dollar: NZD + Fijian dollar: FJD + Guyanese dollar: GYD + Hong Kong dollar: HKD + Jamaican dollar: JMD + Liberian dollar: LRD + Namibian dollar: NAD + Solomon Islands dollar: SBD + Surinamese dollar: SRD + New Taiwan dollar: TWD + Trinidad and Tobago dollar: TTD + Tuvaluan dollar: TVD + Chinese yuan: CNY + # Fake ISO code + # Special main unit + Rial: __RI + Shiling: __S + Som: __SO + Dirham: __DR + Dinar: _DN + Dollar: __D + Manat: __MA + Rupee: __R + Krone: __K + Krona: __K + Crown: __K + Frank: __F + Mark: __M + Ruble: __RB + Peso: __PE + Pound: __P + # Currencies we extract, but that don't have an official ISO code + Tristan da Cunha pound: _TP + South Georgia and the South Sandwich Islands pound: _SP + Somaliland shilling: _SS + Pitcairn Islands dollar: _PND + Palauan dollar: _PD + Niue dollar: _NID + Nauruan dollar: _ND + Micronesian dollar: _MD + Kiribati dollar: _KID + Guernsey pound: _GGP + Faroese króna: _FOK + Cook Islands dollar: _CKD + British Virgin Islands dollar: _BD + Ascension pound: _AP + Alderney pound: _ALP + Abkhazian apsar: _AA +FractionalUnitNameToCodeMap: !dictionary + types: [ string, string ] + entries: + Jiao: JIAO + Kopek: KOPEK + Pul: PUL + Cent: CENT + Qindarkë: QINDARKE + Penny: PENNY + Santeem: SANTEEM + Cêntimo: CENTIMO + Centavo: CENTAVO + Luma: LUMA + Qəpik: QƏPIK + Fils: FILS + Poisha: POISHA + Kapyeyka: KAPYEYKA + Centime: CENTIME + Chetrum: CHETRUM + Paisa: PAISA + Fening: FENING + Thebe: THEBE + Sen: SEN + Stotinka: STOTINKA + Fen: FEN + Céntimo: CENTIMO + Lipa: LIPA + Haléř: HALER + Øre: ØRE + Piastre: PIASTRE + Santim: SANTIM + Oyra: OYRA + Butut: BUTUT + Tetri: TETRI + Pesewa: PESEWA + Fillér: FILLER + Eyrir: EYRIR + Dinar: DINAR + Agora: AGORA + Tïın: TIIN + Chon: CHON + Jeon: JEON + Tyiyn: TYIYN + Att: ATT + Sente: SENTE + Dirham: DIRHAM + Rappen: RAPPEN + Avo: AVO + Deni: DENI + Iraimbilanja: IRAIMBILANJA + Tambala: TAMBALA + Laari: LAARI + Khoums: KHOUMS + Ban: BAN + Möngö: MONGO + Pya: PYA + Kobo: KOBO + Kuruş: KURUS + Baisa: BAISA + Centésimo: CENTESIMO + Toea: TOEA + Sentimo: SENTIMO + Grosz: GROSZ + Sene: SENE + Halala: HALALA + Para: PARA + Öre: ORE + Diram: DIRAM + Satang: SATANG + Seniti: SENITI + Millime: MILLIME + Tennesi: TENNESI + Kopiyka: KOPIYKA + Tiyin: TIYIN + Hào: HAO + Ngwee: NGWEE +CompoundUnitConnectorRegex: !simpleRegex + def: (?and) CurrencyPrefixList: !dictionary types: [ string, string ] entries: diff --git a/Patterns/French/French-NumbersWithUnit.yaml b/Patterns/French/French-NumbersWithUnit.yaml index 70f788a2cd..6cd21c1293 100644 --- a/Patterns/French/French-NumbersWithUnit.yaml +++ b/Patterns/French/French-NumbersWithUnit.yaml @@ -349,6 +349,8 @@ CurrencySuffixList: !dictionary Jiao: jiao #Additional Mark Finlandais: marks finlandais|mark finlandais|fim|mark +CompoundUnitConnectorRegex: !simpleRegex + def: (?[^.]) CurrencyPrefixList: !dictionary types: [ string, string ] entries: diff --git a/Patterns/German/German-NumbersWithUnit.yaml b/Patterns/German/German-NumbersWithUnit.yaml index db929267a8..d954c88b0f 100644 --- a/Patterns/German/German-NumbersWithUnit.yaml +++ b/Patterns/German/German-NumbersWithUnit.yaml @@ -369,6 +369,8 @@ CurrencySuffixList: !dictionary #Additional Finnish markka: suomen markka|finnish markka|finsk mark|fim|markkaa|markka|finnische mark|finnischen mark Penni: penniä|penni +CompoundUnitConnectorRegex: !simpleRegex + def: (?[^.]) CurrencyPrefixList: !dictionary types: [ string, string ] entries: diff --git a/Patterns/Italian/Italian-NumbersWithUnit.yaml b/Patterns/Italian/Italian-NumbersWithUnit.yaml index c196b23316..501daa04a9 100644 --- a/Patterns/Italian/Italian-NumbersWithUnit.yaml +++ b/Patterns/Italian/Italian-NumbersWithUnit.yaml @@ -368,6 +368,8 @@ CurrencySuffixList: !dictionary #Additional Finnish markka: suomen markka|finnish markka|finsk mark|fim|markkaa|markka Penni: penniä|penni +CompoundUnitConnectorRegex: !simpleRegex + def: (?[^.]) CurrencyPrefixList: !dictionary types: [ string, string ] entries: diff --git a/Patterns/Portuguese/Portuguese-NumbersWithUnit.yaml b/Patterns/Portuguese/Portuguese-NumbersWithUnit.yaml index 46282dadcc..89f98796e0 100644 --- a/Patterns/Portuguese/Portuguese-NumbersWithUnit.yaml +++ b/Patterns/Portuguese/Portuguese-NumbersWithUnit.yaml @@ -504,6 +504,8 @@ CurrencySuffixList: !dictionary #Zâmbia Kwacha zambiano: kwacha zambiano|kwacha zambianos|kwachas zambianos|zmw Ngwee zambiano: ngwee zambiano|ngwee zambianos|ngwees zambianos +CompoundUnitConnectorRegex: !simpleRegex + def: (?[^.]) CurrencyPrefixList: !dictionary types: [ string, string ] entries: diff --git a/Patterns/Spanish/Spanish-NumbersWithUnit.yaml b/Patterns/Spanish/Spanish-NumbersWithUnit.yaml index 1cc0188e0f..c90cfa559a 100644 --- a/Patterns/Spanish/Spanish-NumbersWithUnit.yaml +++ b/Patterns/Spanish/Spanish-NumbersWithUnit.yaml @@ -580,6 +580,8 @@ CurrencySuffixList: !dictionary Kwacha zambiano: kwacha zambiano|kwacha zambianos|zmw Ngwee zambiano: ngwee zambiano|ngwee zambianos #Zimbabue -> Dólar Estadounidense +CompoundUnitConnectorRegex: !simpleRegex + def: (?[^.]) CurrencyPrefixList: !dictionary types: [ string, string ] entries: diff --git a/Specs/NumberWithUnit/English/CurrencyModel.json b/Specs/NumberWithUnit/English/CurrencyModel.json index 6cba720c4f..1019e6ce77 100644 --- a/Specs/NumberWithUnit/English/CurrencyModel.json +++ b/Specs/NumberWithUnit/English/CurrencyModel.json @@ -62,7 +62,8 @@ "TypeName": "currency", "Resolution": { "value": "16400000", - "unit": "Canadian dollar" + "unit": "Canadian dollar", + "isoCurrency": "CAD" } } ] @@ -440,7 +441,8 @@ "TypeName": "currency", "Resolution": { "value": "10050000000", - "unit": "Hong Kong dollar" + "unit": "Hong Kong dollar", + "isoCurrency": "HKD" } } ] @@ -664,7 +666,8 @@ "TypeName": "currency", "Resolution": { "value": "150000000", - "unit": "United States dollar" + "unit": "United States dollar", + "isoCurrency": "USD" } } ] @@ -748,7 +751,8 @@ "TypeName": "currency", "Resolution": { "value": "125000000", - "unit": "Australian dollar" + "unit": "Australian dollar", + "isoCurrency": "AUD" } } ] @@ -762,7 +766,8 @@ "TypeName": "currency", "Resolution": { "value": "5000000", - "unit": "Japanese yen" + "unit": "Japanese yen", + "isoCurrency": "JPY" } } ] @@ -776,7 +781,8 @@ "TypeName": "currency", "Resolution": { "value": "450000", - "unit": "Japanese yen" + "unit": "Japanese yen", + "isoCurrency": "JPY" } } ] @@ -804,7 +810,8 @@ "TypeName": "currency", "Resolution": { "value": "309381", - "unit": "Japanese yen" + "unit": "Japanese yen", + "isoCurrency": "JPY" } } ] @@ -832,7 +839,8 @@ "TypeName": "currency", "Resolution": { "value": "300000000", - "unit": "Canadian dollar" + "unit": "Canadian dollar", + "isoCurrency": "CAD" } } ] @@ -846,7 +854,8 @@ "TypeName": "currency", "Resolution": { "value": "1.34", - "unit": "Canadian dollar" + "unit": "Canadian dollar", + "isoCurrency": "CAD" } } ] @@ -902,7 +911,8 @@ "TypeName": "currency", "Resolution": { "value": "1", - "unit": "Japanese yen" + "unit": "Japanese yen", + "isoCurrency": "JPY" } } ] @@ -986,7 +996,8 @@ "TypeName": "currency", "Resolution": { "value": "100000000000", - "unit": "Chinese yuan" + "unit": "Chinese yuan", + "isoCurrency": "CNY" } } ] @@ -1014,7 +1025,8 @@ "TypeName": "currency", "Resolution": { "value": "323000000", - "unit": "Euro" + "unit": "Euro", + "isoCurrency": "EUR" } } ] @@ -1028,7 +1040,8 @@ "TypeName": "currency", "Resolution": { "value": "10000", - "unit": "Swiss franc" + "unit": "Swiss franc", + "isoCurrency": "CHF" } } ] @@ -1098,7 +1111,8 @@ "TypeName": "currency", "Resolution": { "value": "2000000", - "unit": "Euro" + "unit": "Euro", + "isoCurrency": "EUR" } } ] @@ -1112,7 +1126,8 @@ "TypeName": "currency", "Resolution": { "value": "10000000000", - "unit": "United States dollar" + "unit": "United States dollar", + "isoCurrency": "USD" } } ] @@ -1310,7 +1325,8 @@ "value": "20000", "unit": "Dollar" } - }, + } + , { "Text": "dollar", "TypeName": "currency", @@ -1324,23 +1340,182 @@ , { "Input": "dollar : 143.80 yen , up 0 . 95 ; 1 . 8500 marks , up 0 . 0085 .", + "NotSupported": "javascript, python", "Results": [ + { + "Text": "dollar", + "TypeName": "currency", + "Resolution": { + "value": null, + "unit": "Dollar" + } + } + , { "Text": "143.80 yen", "TypeName": "currency", "Resolution": { "value": "143.8", - "unit": "Japanese yen" + "unit": "Japanese yen", + "isoCurrency": "JPY" } - }, + } + ] +} +, +{ + "Input": "it only cost 3 dollars 50 cents.", + "NotSupported": "javascript, python", + "Results": [ { - "Text": "dollar", + "Text": "3 dollars 50 cents", "TypeName": "currency", "Resolution": { - "value": null, + "value": "3.5", + "unit": "Dollar" + } + } + ] +} +, +{ + "Input": "it only cost thirteen dollars and forty-five cents", + "NotSupported": "javascript, python", + "Results": [ + { + "Text": "thirteen dollars and forty-five cents", + "TypeName": "currency", + "Resolution": { + "value": "13.45", + "unit": "Dollar" + } + } + ] +} +, +{ + "Input": "it only cost thirteen dollars forty-five cents", + "NotSupported": "javascript, python", + "Results": [ + { + "Text": "thirteen dollars forty-five cents", + "TypeName": "currency", + "Resolution": { + "value": "13.45", + "unit": "Dollar" + } + } + ] +} +, +{ + "Input": "it only cost thirteen dollars forty five", + "NotSupported": "javascript, python", + "Results": [ + { + "Text": "thirteen dollars forty five", + "TypeName": "currency", + "Resolution": { + "value": "13.45", "unit": "Dollar" } } ] } +, +{ + "Input": "It costs one dollar and one and one point of your credit points.", + "NotSupported": "javascript, python", + "Results": [ + { + "Text": "one dollar and one", + "Start": 9, + "End": 26, + "TypeName": "currency", + "Resolution": { + "unit": "Dollar", + "value": "1.01" + } + } + ] +} +, +{ + "Input": "It costs you 10 us dollar and me 100 chinese yuan.", + "NotSupported": "javascript", + "Results": [ + { + "Text": "10 us dollar", + "Start": 13, + "End": 24, + "TypeName": "currency", + "Resolution": { + "isoCurrency": "USD", + "unit": "United States dollar", + "value": "10" + } + } + , + { + "Text": "100 chinese yuan", + "Start": 33, + "End": 48, + "TypeName": "currency", + "Resolution": { + "isoCurrency": "CNY", + "unit": "Chinese yuan", + "value": "100" + } + } + ] +} +, +{ + "Input": "It costs you 10 us dollar and me c $ 100.34 and fifty.", + "NotSupported": "javascript, python", + "Results": [ + { + "Text": "10 us dollar", + "Start": 13, + "End": 24, + "TypeName": "currency", + "Resolution": { + "isoCurrency": "USD", + "unit": "United States dollar", + "value": "10" + } + } + , + { + "Text": "c $ 100.34 and fifty", + "Start": 33, + "End": 52, + "TypeName": "currency", + "Resolution": { + "isoCurrency": "CAD", + "unit": "Canadian dollar", + "value": "100.84" + } + } + ] +} +, +{ + "Input": "It may need one kuai and five mao five.", + "NotSupportedByDesign": "python", + "NotSupported": "javascript", + "Results": [ + { + "Text": "one kuai and five mao five", + "Start": 12, + "End": 37, + "TypeName": "currency", + "Resolution": { + "isoCurrency": "CNY", + "unit": "Chinese yuan", + "value": "1.55" + } + } + ] +} ] \ No newline at end of file