diff --git a/src/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.approve_public_api.approved.txt b/src/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.approve_public_api.approved.txt index 2a2dc31ec..53cfd1a1c 100644 --- a/src/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.approve_public_api.approved.txt +++ b/src/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.approve_public_api.approved.txt @@ -657,6 +657,7 @@ namespace Humanizer { public static string ToOrdinalWords(this int number, System.Globalization.CultureInfo culture = null) { } public static string ToOrdinalWords(this int number, Humanizer.GrammaticalGender gender, System.Globalization.CultureInfo culture = null) { } + public static string ToTuple(this int number, System.Globalization.CultureInfo culture = null) { } public static string ToWords(this int number, System.Globalization.CultureInfo culture = null) { } public static string ToWords(this int number, bool addAnd, System.Globalization.CultureInfo culture = null) { } public static string ToWords(this int number, Humanizer.GrammaticalGender gender, System.Globalization.CultureInfo culture = null) { } @@ -1921,6 +1922,7 @@ namespace Humanizer.Localisation.NumberToWords string Convert(long number, Humanizer.GrammaticalGender gender, bool addAnd = True); string ConvertToOrdinal(int number); string ConvertToOrdinal(int number, Humanizer.GrammaticalGender gender); + string ConvertToTuple(int number); } } namespace Humanizer.Localisation.Ordinalizers diff --git a/src/Humanizer/Localisation/NumberToWords/EnglishNumberToWordsConverter.cs b/src/Humanizer/Localisation/NumberToWords/EnglishNumberToWordsConverter.cs index 47f01e99c..5899a48e2 100644 --- a/src/Humanizer/Localisation/NumberToWords/EnglishNumberToWordsConverter.cs +++ b/src/Humanizer/Localisation/NumberToWords/EnglishNumberToWordsConverter.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; namespace Humanizer.Localisation.NumberToWords @@ -166,5 +166,38 @@ private static bool ExceptionNumbersToWords(long number, out string words) { return OrdinalExceptions.TryGetValue(number, out words); } + + public override string ConvertToTuple(int number) + { + switch (number) + { + case 1: + return "single"; + case 2: + return "double"; + case 3: + return "triple"; + case 4: + return "quadruple"; + case 5: + return "quintuple"; + case 6: + return "sextuple"; + case 7: + return "septuple"; + case 8: + return "octuple"; + case 9: + return "nonuple"; + case 10: + return "decuple"; + case 100: + return "centuple"; + case 1000: + return "milluple"; + default: + return $"{number}-tuple"; + } + } } } diff --git a/src/Humanizer/Localisation/NumberToWords/GenderedNumberToWordsConverter.cs b/src/Humanizer/Localisation/NumberToWords/GenderedNumberToWordsConverter.cs index 4c63afb48..eaad67fc3 100644 --- a/src/Humanizer/Localisation/NumberToWords/GenderedNumberToWordsConverter.cs +++ b/src/Humanizer/Localisation/NumberToWords/GenderedNumberToWordsConverter.cs @@ -57,5 +57,15 @@ public string ConvertToOrdinal(int number) /// /// public abstract string ConvertToOrdinal(int number, GrammaticalGender gender); + + /// + /// Converts integer to named tuple (e.g. 'single', 'double' etc.). + /// + /// + /// + public virtual string ConvertToTuple(int number) + { + return Convert(number); + } } } diff --git a/src/Humanizer/Localisation/NumberToWords/GenderlessNumberToWordsConverter.cs b/src/Humanizer/Localisation/NumberToWords/GenderlessNumberToWordsConverter.cs index 15f6989cc..ea7c4678e 100644 --- a/src/Humanizer/Localisation/NumberToWords/GenderlessNumberToWordsConverter.cs +++ b/src/Humanizer/Localisation/NumberToWords/GenderlessNumberToWordsConverter.cs @@ -50,5 +50,15 @@ public string ConvertToOrdinal(int number, GrammaticalGender gender) { return ConvertToOrdinal(number); } + + /// + /// Converts integer to named tuple (e.g. 'single', 'double' etc.). + /// + /// + /// + public virtual string ConvertToTuple(int number) + { + return Convert(number); + } } } diff --git a/src/Humanizer/Localisation/NumberToWords/INumberToWordsConverter.cs b/src/Humanizer/Localisation/NumberToWords/INumberToWordsConverter.cs index a8abb9469..52bc31268 100644 --- a/src/Humanizer/Localisation/NumberToWords/INumberToWordsConverter.cs +++ b/src/Humanizer/Localisation/NumberToWords/INumberToWordsConverter.cs @@ -43,5 +43,12 @@ public interface INumberToWordsConverter /// /// string ConvertToOrdinal(int number, GrammaticalGender gender); + + /// + /// Converts integer to named tuple (e.g. 'single', 'double' etc.). + /// + /// + /// + string ConvertToTuple(int number); } } diff --git a/src/Humanizer/Localisation/NumberToWords/TurkishNumberToWordConverter.cs b/src/Humanizer/Localisation/NumberToWords/TurkishNumberToWordConverter.cs index e36d3c942..f734194ed 100644 --- a/src/Humanizer/Localisation/NumberToWords/TurkishNumberToWordConverter.cs +++ b/src/Humanizer/Localisation/NumberToWords/TurkishNumberToWordConverter.cs @@ -19,6 +19,19 @@ internal class TurkishNumberToWordConverter : GenderlessNumberToWordsConverter {'a', "ıncı"}, }; + private static readonly Dictionary TupleSuffix = new Dictionary + { + {'ı', "lı"}, + {'i', "li"}, + {'u', "lu"}, + {'ü', "lü"}, + {'o', "lu"}, + {'ö', "lü"}, + {'e', "li"}, + {'a', "lı"}, + }; + + public override string Convert(long input) { var number = input; @@ -121,5 +134,29 @@ public override string ConvertToOrdinal(int number) return string.Format("{0}{1}", word, wordSuffix); } + + public override string ConvertToTuple(int number) + { + switch (number) + { + case 1: + return "tek"; + case 2: + return "çift"; + default: + var word = Convert(number); + var wordSuffix = string.Empty; + + for (var i = word.Length - 1; i >= 0; i--) + { + if (TupleSuffix.TryGetValue(word[i], out wordSuffix)) + { + break; + } + } + + return string.Format("{0}{1}", word, wordSuffix); + } + } } } diff --git a/src/Humanizer/NumberToWordsExtension.cs b/src/Humanizer/NumberToWordsExtension.cs index a6c6daa76..552aef519 100644 --- a/src/Humanizer/NumberToWordsExtension.cs +++ b/src/Humanizer/NumberToWordsExtension.cs @@ -118,5 +118,16 @@ public static string ToOrdinalWords(this int number, GrammaticalGender gender, C { return Configurator.GetNumberToWordsConverter(culture).ConvertToOrdinal(number, gender); } + + /// + /// 1.ToTuple() -> "single" + /// + /// Number to be turned to tuple + /// Culture to use. If null, current thread's UI culture is used. + /// + public static string ToTuple(this int number, CultureInfo culture = null) + { + return Configurator.GetNumberToWordsConverter(culture).ConvertToTuple(number); + } } }