コード例 #1
0
        public long ResolveCompositeNumber(string numberStr)
        {
            if (numberStr.Contains("-"))
            {
                var  numbers = numberStr.Split('-');
                long ret     = 0;
                foreach (var number in numbers)
                {
                    if (OrdinalNumberMap.ContainsKey(number))
                    {
                        ret += OrdinalNumberMap[number];
                    }
                    else if (CardinalNumberMap.ContainsKey(number))
                    {
                        ret += CardinalNumberMap[number];
                    }
                }

                return(ret);
            }

            if (this.OrdinalNumberMap.ContainsKey(numberStr))
            {
                return(this.OrdinalNumberMap[numberStr]);
            }

            if (this.CardinalNumberMap.ContainsKey(numberStr))
            {
                return(this.CardinalNumberMap[numberStr]);
            }

            return(0);
        }
コード例 #2
0
        public IEnumerable <string> NormalizeTokenSet(IEnumerable <string> tokens, ParseResult context)
        {
            var fracWords = new List <string>();
            var tokenList = tokens.ToList();
            var tokenLen  = tokenList.Count;

            for (var i = 0; i < tokenLen; i++)
            {
                if (tokenList[i].Contains("-"))
                {
                    var splitedTokens = tokenList[i].Split('-');
                    if (splitedTokens.Length == 2 && OrdinalNumberMap.ContainsKey(splitedTokens[1]))
                    {
                        fracWords.Add(splitedTokens[0]);
                        fracWords.Add(splitedTokens[1]);
                    }
                    else
                    {
                        fracWords.Add(tokenList[i]);
                    }
                }
                else if (i < tokenLen - 2 && tokenList[i + 1] == "-")
                {
                    if (OrdinalNumberMap.ContainsKey(tokenList[i + 2]))
                    {
                        fracWords.Add(tokenList[i]);
                        fracWords.Add(tokenList[i + 2]);
                    }
                    else
                    {
                        fracWords.Add(tokenList[i] + tokenList[i + 1] + tokenList[i + 2]);
                    }

                    i += 2;
                }
                else
                {
                    fracWords.Add(tokenList[i]);
                }
            }

            return(fracWords);
        }
コード例 #3
0
        // Same behavior as the base but also handles numbers such as tweeënhalf and tweeëneenhalf
        public override IEnumerable <string> NormalizeTokenSet(IEnumerable <string> tokens, ParseResult context)
        {
            var fracWords = new List <string>();
            var tokenList = tokens.ToList();
            var tokenLen  = tokenList.Count;

            for (var i = 0; i < tokenLen; i++)
            {
                if (tokenList[i].Contains("-"))
                {
                    var splitTokens = tokenList[i].Split('-');
                    if (splitTokens.Length == 2 && OrdinalNumberMap.ContainsKey(splitTokens[1]))
                    {
                        fracWords.Add(splitTokens[0]);
                        fracWords.Add(splitTokens[1]);
                    }
                    else
                    {
                        fracWords.Add(tokenList[i]);
                    }
                }
                else if (i < tokenLen - 2 && tokenList[i + 1] == "-")
                {
                    if (OrdinalNumberMap.ContainsKey(tokenList[i + 2]))
                    {
                        fracWords.Add(tokenList[i]);
                        fracWords.Add(tokenList[i + 2]);
                    }
                    else
                    {
                        fracWords.Add(tokenList[i] + tokenList[i + 1] + tokenList[i + 2]);
                    }

                    i += 2;
                }
                else
                {
                    fracWords.Add(tokenList[i]);
                }
            }

            // The following piece of code is needed to compute the fraction pattern number+'ënhalf'
            // e.g. 'tweeënhalf' ('two and a half'). Similarly for "ëneenhalf", e.g. tweeëneenhalf.
            int len = 2;

            fracWords.RemoveAll(item => item == "/");
            for (int i = fracWords.Count - 1; i >= 0; i--)
            {
                if (FractionHalfRegex.IsMatch(fracWords[i]))
                {
                    fracWords[i] = fracWords[i].Substring(0, fracWords[i].Length - 6);
                    fracWords.Insert(i + 1, this.WrittenFractionSeparatorTexts.ElementAt(3));
                    fracWords.Insert(i + 2, OneHalfTokens[0]);
                    fracWords.Insert(i + 3, OneHalfTokens[1]);
                    len = 4;
                }
                else if (FractionUnitsRegex.Match(fracWords[i]).Groups["onehalf"].Success)
                {
                    fracWords[i] = OneHalfTokens[0];
                    fracWords.Insert(i + 1, this.WrittenFractionSeparatorTexts.ElementAt(3));
                    fracWords.Insert(i + 2, OneHalfTokens[0]);
                    fracWords.Insert(i + 3, OneHalfTokens[1]);
                    len = 4;
                }
                else if (FractionUnitsRegex.Match(fracWords[i]).Groups["quarter"].Success)
                {
                    var tempWord = fracWords[i];
                    fracWords[i] = tempWord.Substring(0, 4);
                    fracWords.Insert(i + 1, this.WrittenFractionSeparatorTexts.ElementAt(3));
                    fracWords.Insert(i + 2, tempWord.Substring(4, 5));
                    len = 3;
                }
            }

            // In Dutch, only the last two numbers in fracWords must be considered as fraction
            var fracLen = fracWords.Count;

            if (fracLen > len && fracWords[fracLen - len - 1] != NumbersDefinitions.WordSeparatorToken)
            {
                fracWords.Insert(fracLen - len, NumbersDefinitions.WordSeparatorToken);
            }

            return(fracWords);
        }