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); }
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); }
// 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); }