using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Chrosey.Extensions
{
public static class StringExtensions
{
///
/// Vergleicht 2 Strings Phonetisch und gibt wahr zurück, wenn sich der erste im zweiten befindet
///
///
///
///
public static bool ComparePhonetic(this string lookFor, string source)
{
if (string.IsNullOrEmpty(lookFor))
{
return true;
}
if (string.IsNullOrEmpty(source))
{
return false;
}
var a = lookFor.KoelnPhonetic();
var b = source.KoelnPhonetic();
return b.IndexOf(a) >= 0;
}
///
/// Erstellt aus dem String die Kölner Phonetic Folge
///
///
///
public static string KoelnPhonetic(this string input)
{
var trimmed = input.Trim();
var lower = trimmed.ToLower();
var replacedSpecialChars = lower
.Replace('ä', 'a')
.Replace('ö', 'o')
.Replace('u', 'u')
.Replace("ß", "ss")
.Replace('é', 'e')
.Replace('è', 'e')
.Replace('à', 'a');
var withMarkers = "#" + replacedSpecialChars + "#";
var codeh = new[] { "h" };
var code0 = new[] { "a", "e", "i", "j", "o", "u", "y" };
var code1 = new[] { "b", "p" };
var code2 = new[] { "d", "t" };
var code3 = new[] { "f", "v", "w" };
var code4 = new[] { "g", "k", "q" };
var code5 = new[] { "l" };
var code6 = new[] { "m", "n" };
var code7 = new[] { "r" };
var code8 = new[] { "c", "s", "z" };
var code48 = new[] { "x" };
var code4combifirst = new[] { "a", "o", "u", "h", "k", "x", "q", "l", "r" };
var code4combi = new[] { "a", "o", "u", "h", "k", "x", "q" };
var code8combi = new[] { "c", "k", "q" };
var asNumber = string.Empty;
for (int i = 1; i < withMarkers.Length - 1; i++)
{
var prev = withMarkers[i - 1].ToString();
var curr = withMarkers[i].ToString();
var next = withMarkers[i + 1].ToString();
string number;
if (i == 1)
{
if (code0.Contains(curr)) number = "0";
else if (curr == "c" && code4combifirst.Contains(next)) number = "4";
else if (code2.Contains(curr) && code8.Contains(next)) number = "8";
else if (curr == "x") number = "48";
else if (codeh.Contains(curr)) number = "-";
else if (code1.Contains(curr)) number = "1";
else if (code2.Contains(curr)) number = "2";
else if (code3.Contains(curr)) number = "3";
else if (code4.Contains(curr)) number = "4";
else if (code5.Contains(curr)) number = "5";
else if (code6.Contains(curr)) number = "6";
else if (code7.Contains(curr)) number = "7";
else if (code8.Contains(curr)) number = "8";
else number = "?";
}
else
{
if (code2.Contains(curr) && code8.Contains(next)) number = "8";
else if (code8combi.Contains(prev) && code48.Contains(curr)) number = "8";
else if (curr == "x") number = "48";
else if (prev == "s" && (curr == "c" || curr == "z")) number = "8";
else if (curr == "c" && code4combi.Contains(next)) number = "4";
else if (curr == "h") number = "-";
else if (code0.Contains(curr)) number = "0";
else if (code1.Contains(curr)) number = "1";
else if (code2.Contains(curr)) number = "2";
else if (code3.Contains(curr)) number = "3";
else if (code4.Contains(curr)) number = "4";
else if (code5.Contains(curr)) number = "5";
else if (code6.Contains(curr)) number = "6";
else if (code7.Contains(curr)) number = "7";
else if (code8.Contains(curr)) number = "8";
else number = "?";
}
asNumber += number;
}
var withoutH = asNumber.Replace("-", "");
var zerosRemoved = withoutH[0] + withoutH.Substring(1).Replace("0", "");
var duplicatesRemoved = zerosRemoved[0].ToString();
for (int i = 1; i < zerosRemoved.Length; i++)
{
var curr = zerosRemoved[i].ToString();
var prev = zerosRemoved[i - 1].ToString();
if (curr != prev)
{
duplicatesRemoved += curr;
}
}
return duplicatesRemoved;
}
///
/// Formatiert einen Eigenschaftsnamen mit Wert zum passenden Formatierten String
///
/// der aktuelle String
/// der Wert der Eigenschaft
/// Das Format in dem die Rückgabe erfolgen soll
/// Normales Format "(propertyName=value)
public static string PropertyValueFormat(this string propertyName, object value, string format="({0}={1})")
{
return string.Format(format, propertyName, value.ToString());
}
public static string FirstUpper(this string me)
{
if (string.IsNullOrEmpty(me))
{
return string.Empty;
}
return char.ToUpper(me[0]) + me.Substring(1);
}
public static string AsFormat(this string format, params object[] args)
{
return string.Format(format, args);
}
}
}