public List <NumberModel> GetTargetFromHindiNumbers(string source, string target, string sourceLanguage) { var result = new List <NumberModel>(); try { var sb = new StringBuilder(); var easternArabicNumbers = GetEasternArabicNumbers(); var hindiNumberModel = new HindiNumberModel { SourceGroups = source.Split(' ').ToArray(), TargetGroups = target.Split(' ').ToArray(), SourceLanguage = sourceLanguage, TargetDictionary = new Dictionary <string, string>(), HindiDictionary = new Dictionary <string, string>(), TextGroups = new string[] { } }; if (sourceLanguage.Equals(Constants.HindiLanguage)) { var sourceResult = string.Empty; var sourceGroupResult = new List <string>(); foreach (var sourceGroup in hindiNumberModel.SourceGroups) { foreach (var s in sourceGroup) { sourceResult = easternArabicNumbers.ContainsValue(s.ToString()) ? sb.Append(easternArabicNumbers.FirstOrDefault(h => h.Value == s.ToString()).Key).ToString() : sb.Append(s.ToString()).ToString(); } if (!string.IsNullOrEmpty(sourceResult) && !string.IsNullOrEmpty(sourceGroup)) { hindiNumberModel.HindiDictionary.Add(sourceResult, sourceGroup); sourceGroupResult.Add(sourceResult); } sourceResult = string.Empty; hindiNumberModel.TextGroups = sourceGroupResult.ToArray(); sb.Clear(); } result = GetFormatedNumbers(hindiNumberModel); } else { var targetResult = string.Empty; foreach (var targetGroup in hindiNumberModel.TargetGroups) { foreach (var t in targetGroup) { targetResult = easternArabicNumbers.ContainsValue(t.ToString()) ? sb.Append(easternArabicNumbers.FirstOrDefault(h => h.Value == t.ToString()).Key).ToString() : sb.Append(t.ToString()).ToString(); } if (!string.IsNullOrEmpty(source) && !string.IsNullOrEmpty(targetResult)) { hindiNumberModel.HindiDictionary.Add(source, targetResult); } if (!string.IsNullOrEmpty(targetResult) && !string.IsNullOrEmpty(targetGroup)) { hindiNumberModel.TargetDictionary.Add(targetResult, targetGroup); } targetResult = string.Empty; hindiNumberModel.TextGroups = hindiNumberModel.SourceGroups; sb.Clear(); } result = GetFormatedNumbers(hindiNumberModel); } } catch (Exception ex) { _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); } return(result); }
public List <NumberModel> GetFormatedNumbers(HindiNumberModel hindiNumberModel) { var result = new List <NumberModel>(); try { var res = hindiNumberModel.TextGroups.Zip(hindiNumberModel.TargetGroups, (s, t) => new NumberModel { SourceText = s, TargetText = t }).ToList(); // add thousand separator or decimal separtor in the target text as it is in the source text where needed foreach (var numberRes in res) { if (!string.IsNullOrEmpty(numberRes.TargetText)) { // add . separator in the translated number as it is in the source number(this change will work only for valid verification) // source: the converted hindi to arabic/just arabic(depending on source langauge) and target; (arabic/converted hindi to arabic) // valid ex: source: 1234,56 => target: 1.234,56/1,234.56 or source: 1.234,56 => target: 1.234,56 // invalid ex: soruce: 1234,56 => target: 12.34,56 if (numberRes.SourceText.Contains(".")) { var sourceTextIndex = numberRes.SourceText.IndexOf("."); if (!numberRes.TargetText.Contains(".")) { numberRes.TargetText = numberRes.TargetText.Insert(sourceTextIndex, "."); } } if (numberRes.SourceText.Contains(",")) { var sourceTextIndex = numberRes.SourceText.IndexOf(","); if (!numberRes.TargetText.Contains(",")) { numberRes.TargetText = numberRes.TargetText.Insert(sourceTextIndex, ","); } else { // Scenario of translation from Hindi to Arabic: ١٢٣٤,٨٩ => 1.234,56 or 1,234.56 should be valid. // in scenario: ١٢٣٤,٨٩ => 1,234.56, the Hindi number is converted to 1234,56 // in the above code the . separator is added where it should be // in the the bellow code, the , separator is moved at the right place // so the target result it will be 1,234.56 for verification. if (numberRes.TargetText.IndexOf(",.") != -1) { numberRes.TargetText = Regex.Replace(numberRes.TargetText, ",+\\.+", "."); numberRes.TargetText = numberRes.TargetText.Insert(sourceTextIndex, ","); } } } if (numberRes.TargetText.IndexOf(".,") != -1) { numberRes.TargetText = Regex.Replace(numberRes.TargetText, "\\.+\\,+", "."); } } if (hindiNumberModel.SourceLanguage.Equals(Constants.HindiLanguage)) { var sourceText = hindiNumberModel.HindiDictionary.FirstOrDefault(s => s.Key.Equals(numberRes.SourceText)); result.Add(new NumberModel { SourceText = !string.IsNullOrEmpty(sourceText.Value) ? sourceText.Value : numberRes.SourceText, SourceArabicText = numberRes.SourceText, TargetText = numberRes.TargetText, TargetArabicText = sourceText.Key }); } // map to the corresponding source text for the Hindi target numbers found with issues if (hindiNumberModel.TargetDictionary.Count > 0) { var sourceText = hindiNumberModel.HindiDictionary.FirstOrDefault(s => s.Key.Contains(numberRes.SourceText)); var targetText = hindiNumberModel.TargetDictionary.FirstOrDefault(t => t.Key.Contains(sourceText.Value)); result.Add(new NumberModel { SourceText = !string.IsNullOrEmpty(sourceText.Key) ? sourceText.Key : numberRes.SourceText, SourceArabicText = numberRes.SourceText, TargetText = targetText.Value, TargetArabicText = targetText.Key }); } } } catch (Exception ex) { _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); } return(result); }