From ce0a3bfa1d671e34afd49e04c9d86cb8e2e0f29a Mon Sep 17 00:00:00 2001 From: Spyros Katsios Date: Thu, 17 Jun 2021 20:09:46 +0300 Subject: [PATCH] Add Greek for To Ordinal Words Add Greek for the method ToOrdinalWords() (from 1 to 199) and tests for it. --- .../el/NumberToOrdinalWordsTests.cs | 42 ++++++ .../GreekNumberToWordsConverter.cs | 127 +++++++++++++++++- 2 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 src/Humanizer.Tests/Localisation/el/NumberToOrdinalWordsTests.cs diff --git a/src/Humanizer.Tests/Localisation/el/NumberToOrdinalWordsTests.cs b/src/Humanizer.Tests/Localisation/el/NumberToOrdinalWordsTests.cs new file mode 100644 index 000000000..59409d754 --- /dev/null +++ b/src/Humanizer.Tests/Localisation/el/NumberToOrdinalWordsTests.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Xunit; + +namespace Humanizer.Tests.Localisation.el +{ + + [UseCulture("el")] + public class NumberToOrdinalWordsTests + { + [InlineData(-1, "")] + [InlineData(0, "")] + [InlineData(1, "πρώτος")] + [InlineData(10, "δέκατος")] + [InlineData(11, "ενδέκατος")] + [InlineData(12, "δωδέκατος")] + [InlineData(20, "εικοστός")] + [InlineData(31, "τριακοστός πρώτος")] + [InlineData(100, "εκατοστός")] + [InlineData(105, "εκατοστός πέμπτος")] + [InlineData(286, "διακοσιοστός ογδοηκοστός έκτος")] + [InlineData(530, "πεντακοσιοστός τριακοστός")] + [InlineData(912, "εννιακοσιοστός δωδέκατος")] + [InlineData(1203, "χιλιοστός διακοσιοστός τρίτος")] + [InlineData(1596, "χιλιοστός πεντακοσιοστός ενενηκοστός έκτος")] + [InlineData(1061, "χιλιοστός εξηκοστός πρώτος")] + [InlineData(1008, "χιλιοστός όγδοος")] + [InlineData(1211, "χιλιοστός διακοσιοστός ενδέκατος")] + [InlineData(1999, "χιλιοστός εννιακοσιοστός ενενηκοστός ένατος")] + [InlineData(2000, "")] + + [Theory] + public void ToOrdinalWordsInt(int number, string expected) + { + Assert.Equal(expected, number.ToOrdinalWords()); + } + } +} diff --git a/src/Humanizer/Localisation/NumberToWords/GreekNumberToWordsConverter.cs b/src/Humanizer/Localisation/NumberToWords/GreekNumberToWordsConverter.cs index 7bbe432ff..3d36cab11 100644 --- a/src/Humanizer/Localisation/NumberToWords/GreekNumberToWordsConverter.cs +++ b/src/Humanizer/Localisation/NumberToWords/GreekNumberToWordsConverter.cs @@ -18,6 +18,39 @@ internal class GreekNumberToWordsConverter : GenderlessNumberToWordsConverter private readonly string[] HundredsMap = { "", "εκατόν", "διακόσιες", "τριακόσιες", "τετρακόσιες", "πεντακόσιες", "εξακόσιες", "επτακόσιες", "οκτακόσιες", "Εενιακόσιες" }; + private static readonly Dictionary ΟrdinalMap = new() + { + { 0, string.Empty }, + { 1, "πρώτος" }, + { 2, "δεύτερος" }, + { 3, "τρίτος" }, + { 4, "τέταρτος" }, + { 5, "πέμπτος" }, + { 6, "έκτος" }, + { 7, "έβδομος" }, + { 8, "όγδοος" }, + { 9, "ένατος" }, + { 10, "δέκατος" }, + { 20, "εικοστός" }, + { 30, "τριακοστός" }, + { 40, "τεσσαρακοστός" }, + { 50, "πεντηκοστός" }, + { 60, "εξηκοστός" }, + { 70, "εβδομηκοστός" }, + { 80, "ογδοηκοστός" }, + { 90, "ενενηκοστός" }, + { 100, "εκατοστός" }, + { 200, "διακοσιοστός" }, + { 300, "τριακοσιοστός" }, + { 400, "τετρακοσιστός" }, + { 500, "πεντακοσιοστός" }, + { 600, "εξακοσιοστός" }, + { 700, "εφτακοσιοστός" }, + { 800, "οχτακοσιοστός" }, + { 900, "εννιακοσιοστός" }, + { 1000, "χιλιοστός" } + }; + public override string Convert(long number) { @@ -26,7 +59,99 @@ public override string Convert(long number) public override string ConvertToOrdinal(int number) { - return null; + if (number / 10 == 0) + { + return GetOneDigitOrdinal(number); + } + + if (number / 10 > 0 && number / 10 < 10) + { + return GetTwoDigigOrdinal(number); + + } + + if (number / 100 > 0 && number / 100 < 10) + { + return GetThreeDigitOrdinal(number); + } + + if (number / 1000 > 0 && number / 1000 < 10) + { + return GetFourDigitOrdinal(number); + } + + return string.Empty; + } + + + private string GetOneDigitOrdinal(int number) + { + if (!ΟrdinalMap.TryGetValue(number, out var output)) return string.Empty; + + return output; + } + + private string GetTwoDigigOrdinal(int number) + { + if (number == 11) return "ενδέκατος"; + if (number == 12) return "δωδέκατος"; + + var decades = number / 10; + + if (!ΟrdinalMap.TryGetValue(decades*10, out var decadesString)) return string.Empty; + + if(number -decades*10 > 0) + { + return decadesString + " " + GetOneDigitOrdinal(number - decades * 10); + } + + return decadesString; + } + + private string GetThreeDigitOrdinal(int number) + { + + var hundrends = number / 100; + + if (!ΟrdinalMap.TryGetValue(hundrends*100, out var hundrentsString)) return string.Empty; + + if (number - hundrends*100> 10) + { + return hundrentsString + " " + GetTwoDigigOrdinal(number - hundrends*100); + } + + if(number - hundrends * 100 > 0) + { + return hundrentsString + " " + GetOneDigitOrdinal(number - hundrends*100); + } + + return hundrentsString; + } + + private string GetFourDigitOrdinal(int number) + { + + var thousands = number / 1000; + + if (!ΟrdinalMap.TryGetValue(thousands*1000, out var thousandsString)) return string.Empty; + + if (number - thousands * 1000 > 100) + { + return thousandsString + " " + GetThreeDigitOrdinal(number - thousands*1000); + } + + if (number - thousands * 1000 > 10) + { + return thousandsString + " " + GetTwoDigigOrdinal(number - thousands * 1000); + } + + if (number - thousands * 1000 > 0) + { + return thousandsString + " " + GetOneDigitOrdinal(number - thousands * 1000); + } + + return thousandsString; + } private string ConvertImpl(long number, bool returnPluralized)