From 638856b7479cf9e6d57e53820984a259af06d5b2 Mon Sep 17 00:00:00 2001 From: Vladimir Sharanin Date: Wed, 22 Jan 2020 15:36:58 +0300 Subject: [PATCH 1/3] fixes #898 Added latvian number translations --- .../NumberToWordsConverterRegistry.cs | 1 + .../LatvianNumberToWordsConverter.cs | 243 ++++++++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 src/Humanizer/Localisation/NumberToWords/LatvianNumberToWordsConverter.cs diff --git a/src/Humanizer/Configuration/NumberToWordsConverterRegistry.cs b/src/Humanizer/Configuration/NumberToWordsConverterRegistry.cs index 74a643cbf..eb31309d0 100644 --- a/src/Humanizer/Configuration/NumberToWordsConverterRegistry.cs +++ b/src/Humanizer/Configuration/NumberToWordsConverterRegistry.cs @@ -42,6 +42,7 @@ public NumberToWordsConverterRegistry() Register("vi", new VietnameseNumberToWordsConverter()); Register("zh-CN", new ChineseNumberToWordsConverter()); Register("bg", new BulgarianNumberToWordsConverter()); + Register("lv", new LatvianNumberToWordsConverter()); } } } diff --git a/src/Humanizer/Localisation/NumberToWords/LatvianNumberToWordsConverter.cs b/src/Humanizer/Localisation/NumberToWords/LatvianNumberToWordsConverter.cs new file mode 100644 index 000000000..5bfb67294 --- /dev/null +++ b/src/Humanizer/Localisation/NumberToWords/LatvianNumberToWordsConverter.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections.Generic; + +namespace Humanizer.Localisation.NumberToWords +{ + internal class LatvianNumberToWordsConverter : GenderedNumberToWordsConverter + { + private static readonly string[] UnitsMap = { "nulle", "vien", "div", "trīs", "četr", "piec", "seš", "septiņ", "astoņ", "deviņ", "desmit", "vienpadsmit", "divpadsmit", "trīspadsmit", "četrpadsmit", "piecpadsmit", "sešpadsmit", "septiņpadsmit", "astoņpadsmit", "deviņpadsmit" }; + private static readonly string[] TensMap = { "nulle", "desmit", "divdesmit", "trīsdesmit", "četrdesmit", "piecdesmit", "sešdesmit", "septiņdesmit", "astoņdesmit", "deviņdesmit" }; + private static readonly string[] HundredsMap = { "nulle", "simt", "divsimt", "trīssimt", "četrsimt", "piecsimt", "sešsimt", "septiņsimt", "astoņsimt", "deviņsimt" }; + private static readonly string[] UnitsOrdinal = { string.Empty, "pirm", "otr", "treš", "ceturt", "piekt", "sest", "septīt", "astot", "devīt", "desmit", "vienpadsmit", "divpadsmit", "trīspadsmit", "četrpadsmit", "piecpadsmit", "sešpadsmit", "septiņpadsmit", "astoņpadsmit", "deviņpadsmit", "divdesmit" }; + + public override string Convert(long input, GrammaticalGender gender) + { + if (input > int.MaxValue || input < int.MinValue) + { + throw new NotImplementedException(); + } + + var parts = new List(); + var number = (long)input; + + if ((number / 1000000) > 0) + { + var millionPart = ""; + if (number == 1000000) + { + millionPart = "miljons"; + } + else + { + millionPart = Convert(number / 1000000, GrammaticalGender.Masculine) + " miljoni"; + } + number %= 1000000; + parts.Add(millionPart); + } + + if ((number / 1000) > 0) + { + var thousandsPart = ""; + if (number == 1000) + { + thousandsPart = "tūkstotis"; + } + else if (number > 1000 && number < 2000) + { + thousandsPart = "tūkstoš"; + } + else + { + thousandsPart = Convert(number / 1000, GrammaticalGender.Masculine) + " tūkstoši"; + } + parts.Add(thousandsPart); + number %= 1000; + } + + if ((number / 100) > 0) + { + var hundredsPart = ""; + if (number == 100) + { + hundredsPart = parts.Contains("tūkstoš") ? "viens simts" : "simts"; + } + else if (number > 100 && number < 200) + { + hundredsPart = "simtu"; + } + else + { + hundredsPart = Convert(number / 100, GrammaticalGender.Masculine) + " simti"; + } + parts.Add(hundredsPart); + number %= 100; + } + + if (number > 19) + { + var tensPart = TensMap[(number / 10)]; + parts.Add(tensPart); + number %= 10; + } + + if (number > 0) + { + parts.Add(UnitsMap[number] + GetCardinalEndingForGender(gender, number)); + } + + return string.Join(" ", parts); + } + + public override string ConvertToOrdinal(int input, GrammaticalGender gender) + { + if (input == 0) + { + return "nulle"; + } + + var parts = new List(); + + if (input < 0) + { + parts.Add("mīnus"); + input = -input; + } + + var number = (long)input; + + if ((number / 1000000) > 0) + { + var millionPart = ""; + if (number == 1000000) + { + millionPart = "miljon" + GetOrdinalEndingForGender(gender); + } + else + { + millionPart = Convert(number / 1000000, GrammaticalGender.Masculine) + " miljon" + GetOrdinalEndingForGender(gender); + } + number %= 1000000; + parts.Add(millionPart); + } + + if ((number / 1000) > 0) + { + var thousandsPart = ""; + if ((number % 1000) == 0) + { + if (number == 1000) + { + thousandsPart = "tūkstoš" + GetOrdinalEndingForGender(gender); + } + else + { + thousandsPart = Convert(number / 1000, GrammaticalGender.Masculine) + " tūkstoš" + GetOrdinalEndingForGender(gender); + } + } + else + { + if (number > 1000 && number < 2000) + { + thousandsPart = "tūkstoš"; + } + else + { + thousandsPart = Convert(number / 1000, GrammaticalGender.Masculine) + " tūkstoši"; + } + } + parts.Add(thousandsPart); + number %= 1000; + } + + if ((number / 100) > 0) + { + var hundredsPart = ""; + if ((number % 100) == 0) + { + hundredsPart = HundredsMap[(number / 100)] + GetOrdinalEndingForGender(gender); + } + else + { + if (number > 100 && number < 200) + { + hundredsPart = "simtu"; + } + else + { + hundredsPart = Convert(number / 100, GrammaticalGender.Masculine) + " simti"; + } + } + parts.Add(hundredsPart); + number %= 100; + } + + if (number > 19) + { + var tensPart = TensMap[(number / 10)]; + if ((number % 10) == 0) + { + tensPart += GetOrdinalEndingForGender(gender); + } + parts.Add(tensPart); + number %= 10; + } + + if (number > 0) + { + parts.Add(UnitsOrdinal[number] + GetOrdinalEndingForGender(gender)); + } + + return string.Join(" ", parts); + } + + private static string GetOrdinalEndingForGender(GrammaticalGender gender) + { + switch (gender) + { + case GrammaticalGender.Masculine: + { + return "ais"; + } + case GrammaticalGender.Feminine: + { + return "ā"; + } + default: + throw new ArgumentOutOfRangeException(nameof(gender)); + } + } + + private static string GetCardinalEndingForGender(GrammaticalGender gender, long number) + { + switch (gender) + { + case GrammaticalGender.Masculine: + if (number == 1) + { + return "s"; + } + + if (number != 3 && number < 10) + { + return "i"; + } + + return ""; + case GrammaticalGender.Feminine: + if (number == 1) + { + return "a"; + } + + if (number != 3 && number < 10) + { + return "as"; + } + + return ""; + default: + throw new ArgumentOutOfRangeException(nameof(gender)); + } + } + } +} From f0f319a510104bcf4a70988c0e8724814735602f Mon Sep 17 00:00:00 2001 From: Vladimir Sharanin Date: Wed, 29 Jan 2020 16:33:50 +0300 Subject: [PATCH 2/3] fixes #898 Added tests for Latvian language --- .../Humanizer.Tests.Shared.projitems | 1 + .../Localisation/lv/NumberToWordsTests.cs | 407 ++++++++++++++++++ 2 files changed, 408 insertions(+) create mode 100644 src/Humanizer.Tests.Shared/Localisation/lv/NumberToWordsTests.cs diff --git a/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems b/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems index 2730edc2c..513d6d040 100644 --- a/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems +++ b/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems @@ -98,6 +98,7 @@ + diff --git a/src/Humanizer.Tests.Shared/Localisation/lv/NumberToWordsTests.cs b/src/Humanizer.Tests.Shared/Localisation/lv/NumberToWordsTests.cs new file mode 100644 index 000000000..c7d73d1cf --- /dev/null +++ b/src/Humanizer.Tests.Shared/Localisation/lv/NumberToWordsTests.cs @@ -0,0 +1,407 @@ +using Xunit; + +namespace Humanizer.Tests.Localisation.lv +{ + [UseCulture("lv-LV")] + public class NumberToWordsTests + { + [Theory] + [InlineData(21, "divdesmit viens")] + [InlineData(22, "divdesmit divi")] + [InlineData(26, "divdesmit seši")] + [InlineData(30, "trīsdesmit")] + [InlineData(31, "trīsdesmit viens")] + [InlineData(33, "trīsdesmit trīs")] + [InlineData(37, "trīsdesmit septiņi")] + [InlineData(40, "četrdesmit")] + [InlineData(41, "četrdesmit viens")] + [InlineData(44, "četrdesmit četri")] + [InlineData(48, "četrdesmit astoņi")] + [InlineData(50, "piecdesmit")] + [InlineData(51, "piecdesmit viens")] + [InlineData(55, "piecdesmit pieci")] + [InlineData(59, "piecdesmit deviņi")] + [InlineData(60, "sešdesmit")] + [InlineData(61, "sešdesmit viens")] + [InlineData(62, "sešdesmit divi")] + [InlineData(66, "sešdesmit seši")] + [InlineData(70, "septiņdesmit")] + [InlineData(71, "septiņdesmit viens")] + [InlineData(73, "septiņdesmit trīs")] + [InlineData(77, "septiņdesmit septiņi")] + [InlineData(80, "astoņdesmit")] + [InlineData(81, "astoņdesmit viens")] + [InlineData(84, "astoņdesmit četri")] + [InlineData(88, "astoņdesmit astoņi")] + [InlineData(90, "deviņdesmit")] + [InlineData(91, "deviņdesmit viens")] + [InlineData(95, "deviņdesmit pieci")] + [InlineData(99, "deviņdesmit deviņi")] + [InlineData(100, "simts")] + [InlineData(101, "simtu viens")] + [InlineData(105, "simtu pieci")] + [InlineData(110, "simtu desmit")] + [InlineData(151, "simtu piecdesmit viens")] + [InlineData(200, "divi simti")] + [InlineData(202, "divi simti divi")] + [InlineData(206, "divi simti seši")] + [InlineData(220, "divi simti divdesmit")] + [InlineData(262, "divi simti sešdesmit divi")] + [InlineData(300, "trīs simti")] + [InlineData(303, "trīs simti trīs")] + [InlineData(307, "trīs simti septiņi")] + [InlineData(330, "trīs simti trīsdesmit")] + [InlineData(373, "trīs simti septiņdesmit trīs")] + [InlineData(400, "četri simti")] + [InlineData(404, "četri simti četri")] + [InlineData(408, "četri simti astoņi")] + [InlineData(440, "četri simti četrdesmit")] + [InlineData(484, "četri simti astoņdesmit četri")] + [InlineData(500, "pieci simti")] + [InlineData(505, "pieci simti pieci")] + [InlineData(509, "pieci simti deviņi")] + [InlineData(550, "pieci simti piecdesmit")] + [InlineData(595, "pieci simti deviņdesmit pieci")] + [InlineData(600, "seši simti")] + [InlineData(601, "seši simti viens")] + [InlineData(606, "seši simti seši")] + [InlineData(616, "seši simti sešpadsmit")] + [InlineData(660, "seši simti sešdesmit")] + [InlineData(700, "septiņi simti")] + [InlineData(702, "septiņi simti divi")] + [InlineData(707, "septiņi simti septiņi")] + [InlineData(727, "septiņi simti divdesmit septiņi")] + [InlineData(770, "septiņi simti septiņdesmit")] + [InlineData(800, "astoņi simti")] + [InlineData(803, "astoņi simti trīs")] + [InlineData(808, "astoņi simti astoņi")] + [InlineData(838, "astoņi simti trīsdesmit astoņi")] + [InlineData(880, "astoņi simti astoņdesmit")] + [InlineData(900, "deviņi simti")] + [InlineData(904, "deviņi simti četri")] + [InlineData(909, "deviņi simti deviņi")] + [InlineData(949, "deviņi simti četrdesmit deviņi")] + [InlineData(990, "deviņi simti deviņdesmit")] + [InlineData(1000, "tūkstotis")] + [InlineData(1001, "tūkstoš viens")] + [InlineData(1012, "tūkstoš divpadsmit")] + [InlineData(1100, "tūkstoš viens simts")] + [InlineData(1234, "tūkstoš divi simti trīsdesmit četri")] + [InlineData(2000, "divi tūkstoši")] + [InlineData(2002, "divi tūkstoši divi")] + [InlineData(2023, "divi tūkstoši divdesmit trīs")] + [InlineData(2345, "divi tūkstoši trīs simti četrdesmit pieci")] + [InlineData(3000, "trīs tūkstoši")] + [InlineData(3003, "trīs tūkstoši trīs")] + [InlineData(3034, "trīs tūkstoši trīsdesmit četri")] + [InlineData(3456, "trīs tūkstoši četri simti piecdesmit seši")] + [InlineData(4000, "četri tūkstoši")] + [InlineData(4004, "četri tūkstoši četri")] + [InlineData(4045, "četri tūkstoši četrdesmit pieci")] + [InlineData(4567, "četri tūkstoši pieci simti sešdesmit septiņi")] + [InlineData(5000, "pieci tūkstoši")] + [InlineData(5005, "pieci tūkstoši pieci")] + [InlineData(5056, "pieci tūkstoši piecdesmit seši")] + [InlineData(5678, "pieci tūkstoši seši simti septiņdesmit astoņi")] + [InlineData(6000, "seši tūkstoši")] + [InlineData(6006, "seši tūkstoši seši")] + [InlineData(6067, "seši tūkstoši sešdesmit septiņi")] + [InlineData(6789, "seši tūkstoši septiņi simti astoņdesmit deviņi")] + [InlineData(7000, "septiņi tūkstoši")] + [InlineData(7007, "septiņi tūkstoši septiņi")] + [InlineData(7078, "septiņi tūkstoši septiņdesmit astoņi")] + [InlineData(7890, "septiņi tūkstoši astoņi simti deviņdesmit")] + [InlineData(8000, "astoņi tūkstoši")] + [InlineData(8008, "astoņi tūkstoši astoņi")] + [InlineData(8089, "astoņi tūkstoši astoņdesmit deviņi")] + [InlineData(8901, "astoņi tūkstoši deviņi simti viens")] + [InlineData(9000, "deviņi tūkstoši")] + [InlineData(9009, "deviņi tūkstoši deviņi")] + [InlineData(9012, "deviņi tūkstoši divpadsmit")] + [InlineData(9090, "deviņi tūkstoši deviņdesmit")] + [InlineData(10000, "desmit tūkstoši")] + [InlineData(10001, "desmit tūkstoši viens")] + [InlineData(20020, "divdesmit tūkstoši divdesmit")] + [InlineData(30300, "trīsdesmit tūkstoši trīs simti")] + [InlineData(44000, "četrdesmit četri tūkstoši")] + [InlineData(44231, "četrdesmit četri tūkstoši divi simti trīsdesmit viens")] + [InlineData(100000, "simts tūkstoši")] + [InlineData(500000, "pieci simti tūkstoši")] + [InlineData(1000000, "miljons")] + [InlineData(6000000, "seši miljoni")] + [InlineData(10000000, "desmit miljoni")] + [InlineData(70000000, "septiņdesmit miljoni")] + [InlineData(100000000, "simts miljoni")] + [InlineData(800000000, "astoņi simti miljoni")] + public void ToWords(int number, string expected) + { + Assert.Equal(expected, number.ToWords()); + } + + [Theory] + [InlineData(21, "divdesmit pirmais")] + [InlineData(22, "divdesmit otrais")] + [InlineData(26, "divdesmit sestais")] + [InlineData(30, "trīsdesmitais")] + [InlineData(31, "trīsdesmit pirmais")] + [InlineData(33, "trīsdesmit trešais")] + [InlineData(37, "trīsdesmit septītais")] + [InlineData(40, "četrdesmitais")] + [InlineData(41, "četrdesmit pirmais")] + [InlineData(44, "četrdesmit ceturtais")] + [InlineData(48, "četrdesmit astotais")] + [InlineData(50, "piecdesmitais")] + [InlineData(51, "piecdesmit pirmais")] + [InlineData(55, "piecdesmit piektais")] + [InlineData(59, "piecdesmit devītais")] + [InlineData(60, "sešdesmitais")] + [InlineData(61, "sešdesmit pirmais")] + [InlineData(62, "sešdesmit otrais")] + [InlineData(66, "sešdesmit sestais")] + [InlineData(70, "septiņdesmitais")] + [InlineData(71, "septiņdesmit pirmais")] + [InlineData(73, "septiņdesmit trešais")] + [InlineData(77, "septiņdesmit septītais")] + [InlineData(80, "astoņdesmitais")] + [InlineData(81, "astoņdesmit pirmais")] + [InlineData(84, "astoņdesmit ceturtais")] + [InlineData(88, "astoņdesmit astotais")] + [InlineData(90, "deviņdesmitais")] + [InlineData(91, "deviņdesmit pirmais")] + [InlineData(95, "deviņdesmit piektais")] + [InlineData(99, "deviņdesmit devītais")] + [InlineData(100, "simtais")] + [InlineData(101, "simtu pirmais")] + [InlineData(105, "simtu piektais")] + [InlineData(110, "simtu desmitais")] + [InlineData(151, "simtu piecdesmit pirmais")] + [InlineData(200, "divsimtais")] + [InlineData(202, "divi simti otrais")] + [InlineData(206, "divi simti sestais")] + [InlineData(220, "divi simti divdesmitais")] + [InlineData(262, "divi simti sešdesmit otrais")] + [InlineData(300, "trīssimtais")] + [InlineData(303, "trīs simti trešais")] + [InlineData(307, "trīs simti septītais")] + [InlineData(330, "trīs simti trīsdesmitais")] + [InlineData(373, "trīs simti septiņdesmit trešais")] + [InlineData(400, "četrsimtais")] + [InlineData(404, "četri simti ceturtais")] + [InlineData(408, "četri simti astotais")] + [InlineData(440, "četri simti četrdesmitais")] + [InlineData(484, "četri simti astoņdesmit ceturtais")] + [InlineData(500, "piecsimtais")] + [InlineData(505, "pieci simti piektais")] + [InlineData(509, "pieci simti devītais")] + [InlineData(550, "pieci simti piecdesmitais")] + [InlineData(595, "pieci simti deviņdesmit piektais")] + [InlineData(600, "sešsimtais")] + [InlineData(601, "seši simti pirmais")] + [InlineData(606, "seši simti sestais")] + [InlineData(616, "seši simti sešpadsmitais")] + [InlineData(660, "seši simti sešdesmitais")] + [InlineData(700, "septiņsimtais")] + [InlineData(702, "septiņi simti otrais")] + [InlineData(707, "septiņi simti septītais")] + [InlineData(727, "septiņi simti divdesmit septītais")] + [InlineData(770, "septiņi simti septiņdesmitais")] + [InlineData(800, "astoņsimtais")] + [InlineData(803, "astoņi simti trešais")] + [InlineData(808, "astoņi simti astotais")] + [InlineData(838, "astoņi simti trīsdesmit astotais")] + [InlineData(880, "astoņi simti astoņdesmitais")] + [InlineData(900, "deviņsimtais")] + [InlineData(904, "deviņi simti ceturtais")] + [InlineData(909, "deviņi simti devītais")] + [InlineData(949, "deviņi simti četrdesmit devītais")] + [InlineData(990, "deviņi simti deviņdesmitais")] + [InlineData(1000, "tūkstošais")] + [InlineData(1001, "tūkstoš pirmais")] + [InlineData(1012, "tūkstoš divpadsmitais")] + [InlineData(1100, "tūkstoš simtais")] + [InlineData(1234, "tūkstoš divi simti trīsdesmit ceturtais")] + [InlineData(2000, "divi tūkstošais")] + [InlineData(2002, "divi tūkstoši otrais")] + [InlineData(2023, "divi tūkstoši divdesmit trešais")] + [InlineData(2345, "divi tūkstoši trīs simti četrdesmit piektais")] + [InlineData(3000, "trīs tūkstošais")] + [InlineData(3003, "trīs tūkstoši trešais")] + [InlineData(3034, "trīs tūkstoši trīsdesmit ceturtais")] + [InlineData(3456, "trīs tūkstoši četri simti piecdesmit sestais")] + [InlineData(4000, "četri tūkstošais")] + [InlineData(4004, "četri tūkstoši ceturtais")] + [InlineData(4045, "četri tūkstoši četrdesmit piektais")] + [InlineData(4567, "četri tūkstoši pieci simti sešdesmit septītais")] + [InlineData(5000, "pieci tūkstošais")] + [InlineData(5005, "pieci tūkstoši piektais")] + [InlineData(5056, "pieci tūkstoši piecdesmit sestais")] + [InlineData(5678, "pieci tūkstoši seši simti septiņdesmit astotais")] + [InlineData(6000, "seši tūkstošais")] + [InlineData(6006, "seši tūkstoši sestais")] + [InlineData(6067, "seši tūkstoši sešdesmit septītais")] + [InlineData(6789, "seši tūkstoši septiņi simti astoņdesmit devītais")] + [InlineData(7000, "septiņi tūkstošais")] + [InlineData(7007, "septiņi tūkstoši septītais")] + [InlineData(7078, "septiņi tūkstoši septiņdesmit astotais")] + [InlineData(7890, "septiņi tūkstoši astoņi simti deviņdesmitais")] + [InlineData(8000, "astoņi tūkstošais")] + [InlineData(8008, "astoņi tūkstoši astotais")] + [InlineData(8089, "astoņi tūkstoši astoņdesmit devītais")] + [InlineData(8901, "astoņi tūkstoši deviņi simti pirmais")] + [InlineData(9000, "deviņi tūkstošais")] + [InlineData(9009, "deviņi tūkstoši devītais")] + [InlineData(9012, "deviņi tūkstoši divpadsmitais")] + [InlineData(9090, "deviņi tūkstoši deviņdesmitais")] + [InlineData(10000, "desmit tūkstošais")] + [InlineData(10001, "desmit tūkstoši pirmais")] + [InlineData(20020, "divdesmit tūkstoši divdesmitais")] + [InlineData(30300, "trīsdesmit tūkstoši trīssimtais")] + [InlineData(44000, "četrdesmit četri tūkstošais")] + [InlineData(44231, "četrdesmit četri tūkstoši divi simti trīsdesmit pirmais")] + [InlineData(100000, "simts tūkstošais")] + [InlineData(500000, "pieci simti tūkstošais")] + [InlineData(1000000, "miljonais")] + [InlineData(6000000, "seši miljonais")] + [InlineData(10000000, "desmit miljonais")] + [InlineData(70000000, "septiņdesmit miljonais")] + [InlineData(100000000, "simts miljonais")] + [InlineData(800000000, "astoņi simti miljonais")] + public void ToOrdinalWordsMasculine(int number, string expected) + { + Assert.Equal(expected, number.ToOrdinalWords(GrammaticalGender.Masculine)); + } + + [Theory] + [InlineData(21, "divdesmit pirmā")] + [InlineData(22, "divdesmit otrā")] + [InlineData(26, "divdesmit sestā")] + [InlineData(30, "trīsdesmitā")] + [InlineData(31, "trīsdesmit pirmā")] + [InlineData(33, "trīsdesmit trešā")] + [InlineData(37, "trīsdesmit septītā")] + [InlineData(40, "četrdesmitā")] + [InlineData(41, "četrdesmit pirmā")] + [InlineData(44, "četrdesmit ceturtā")] + [InlineData(48, "četrdesmit astotā")] + [InlineData(50, "piecdesmitā")] + [InlineData(51, "piecdesmit pirmā")] + [InlineData(55, "piecdesmit piektā")] + [InlineData(59, "piecdesmit devītā")] + [InlineData(60, "sešdesmitā")] + [InlineData(61, "sešdesmit pirmā")] + [InlineData(62, "sešdesmit otrā")] + [InlineData(66, "sešdesmit sestā")] + [InlineData(70, "septiņdesmitā")] + [InlineData(71, "septiņdesmit pirmā")] + [InlineData(73, "septiņdesmit trešā")] + [InlineData(77, "septiņdesmit septītā")] + [InlineData(80, "astoņdesmitā")] + [InlineData(81, "astoņdesmit pirmā")] + [InlineData(84, "astoņdesmit ceturtā")] + [InlineData(88, "astoņdesmit astotā")] + [InlineData(90, "deviņdesmitā")] + [InlineData(91, "deviņdesmit pirmā")] + [InlineData(95, "deviņdesmit piektā")] + [InlineData(99, "deviņdesmit devītā")] + [InlineData(100, "simtā")] + [InlineData(101, "simtu pirmā")] + [InlineData(105, "simtu piektā")] + [InlineData(110, "simtu desmitā")] + [InlineData(151, "simtu piecdesmit pirmā")] + [InlineData(200, "divsimtā")] + [InlineData(202, "divi simti otrā")] + [InlineData(206, "divi simti sestā")] + [InlineData(220, "divi simti divdesmitā")] + [InlineData(262, "divi simti sešdesmit otrā")] + [InlineData(300, "trīssimtā")] + [InlineData(303, "trīs simti trešā")] + [InlineData(307, "trīs simti septītā")] + [InlineData(330, "trīs simti trīsdesmitā")] + [InlineData(373, "trīs simti septiņdesmit trešā")] + [InlineData(400, "četrsimtā")] + [InlineData(404, "četri simti ceturtā")] + [InlineData(408, "četri simti astotā")] + [InlineData(440, "četri simti četrdesmitā")] + [InlineData(484, "četri simti astoņdesmit ceturtā")] + [InlineData(500, "piecsimtā")] + [InlineData(505, "pieci simti piektā")] + [InlineData(509, "pieci simti devītā")] + [InlineData(550, "pieci simti piecdesmitā")] + [InlineData(595, "pieci simti deviņdesmit piektā")] + [InlineData(600, "sešsimtā")] + [InlineData(601, "seši simti pirmā")] + [InlineData(606, "seši simti sestā")] + [InlineData(616, "seši simti sešpadsmitā")] + [InlineData(660, "seši simti sešdesmitā")] + [InlineData(700, "septiņsimtā")] + [InlineData(702, "septiņi simti otrā")] + [InlineData(707, "septiņi simti septītā")] + [InlineData(727, "septiņi simti divdesmit septītā")] + [InlineData(770, "septiņi simti septiņdesmitā")] + [InlineData(800, "astoņsimtā")] + [InlineData(803, "astoņi simti trešā")] + [InlineData(808, "astoņi simti astotā")] + [InlineData(838, "astoņi simti trīsdesmit astotā")] + [InlineData(880, "astoņi simti astoņdesmitā")] + [InlineData(900, "deviņsimtā")] + [InlineData(904, "deviņi simti ceturtā")] + [InlineData(909, "deviņi simti devītā")] + [InlineData(949, "deviņi simti četrdesmit devītā")] + [InlineData(990, "deviņi simti deviņdesmitā")] + [InlineData(1000, "tūkstošā")] + [InlineData(1001, "tūkstoš pirmā")] + [InlineData(1012, "tūkstoš divpadsmitā")] + [InlineData(1100, "tūkstoš simtā")] + [InlineData(1234, "tūkstoš divi simti trīsdesmit ceturtā")] + [InlineData(2000, "divi tūkstošā")] + [InlineData(2002, "divi tūkstoši otrā")] + [InlineData(2023, "divi tūkstoši divdesmit trešā")] + [InlineData(2345, "divi tūkstoši trīs simti četrdesmit piektā")] + [InlineData(3000, "trīs tūkstošā")] + [InlineData(3003, "trīs tūkstoši trešā")] + [InlineData(3034, "trīs tūkstoši trīsdesmit ceturtā")] + [InlineData(3456, "trīs tūkstoši četri simti piecdesmit sestā")] + [InlineData(4000, "četri tūkstošā")] + [InlineData(4004, "četri tūkstoši ceturtā")] + [InlineData(4045, "četri tūkstoši četrdesmit piektā")] + [InlineData(4567, "četri tūkstoši pieci simti sešdesmit septītā")] + [InlineData(5000, "pieci tūkstošā")] + [InlineData(5005, "pieci tūkstoši piektā")] + [InlineData(5056, "pieci tūkstoši piecdesmit sestā")] + [InlineData(5678, "pieci tūkstoši seši simti septiņdesmit astotā")] + [InlineData(6000, "seši tūkstošā")] + [InlineData(6006, "seši tūkstoši sestā")] + [InlineData(6067, "seši tūkstoši sešdesmit septītā")] + [InlineData(6789, "seši tūkstoši septiņi simti astoņdesmit devītā")] + [InlineData(7000, "septiņi tūkstošā")] + [InlineData(7007, "septiņi tūkstoši septītā")] + [InlineData(7078, "septiņi tūkstoši septiņdesmit astotā")] + [InlineData(7890, "septiņi tūkstoši astoņi simti deviņdesmitā")] + [InlineData(8000, "astoņi tūkstošā")] + [InlineData(8008, "astoņi tūkstoši astotā")] + [InlineData(8089, "astoņi tūkstoši astoņdesmit devītā")] + [InlineData(8901, "astoņi tūkstoši deviņi simti pirmā")] + [InlineData(9000, "deviņi tūkstošā")] + [InlineData(9009, "deviņi tūkstoši devītā")] + [InlineData(9012, "deviņi tūkstoši divpadsmitā")] + [InlineData(9090, "deviņi tūkstoši deviņdesmitā")] + [InlineData(10000, "desmit tūkstošā")] + [InlineData(10001, "desmit tūkstoši pirmā")] + [InlineData(20020, "divdesmit tūkstoši divdesmitā")] + [InlineData(30300, "trīsdesmit tūkstoši trīssimtā")] + [InlineData(44000, "četrdesmit četri tūkstošā")] + [InlineData(44231, "četrdesmit četri tūkstoši divi simti trīsdesmit pirmā")] + [InlineData(100000, "simts tūkstošā")] + [InlineData(500000, "pieci simti tūkstošā")] + [InlineData(1000000, "miljonā")] + [InlineData(6000000, "seši miljonā")] + [InlineData(10000000, "desmit miljonā")] + [InlineData(70000000, "septiņdesmit miljonā")] + [InlineData(100000000, "simts miljonā")] + [InlineData(800000000, "astoņi simti miljonā")] + public void ToOrdinalWordsFeminine(int number, string expected) + { + Assert.Equal(expected, number.ToOrdinalWords(GrammaticalGender.Feminine)); + } + } +} From f4bb6b4aa9bc6157674e0d381ab2c8ab74a07279 Mon Sep 17 00:00:00 2001 From: Vladimir Sharanin Date: Thu, 30 Sep 2021 12:24:49 +0300 Subject: [PATCH 3/3] fixes Humanizr#898 Added DateToOrdinalWordsTests for Latvian language --- .../Humanizer.Tests.Shared.projitems | 1 + .../Localisation/lv/DateToOrdinalWordsTests.cs | 15 +++++++++++++++ .../LatvianNumberToWordsConverter.cs | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/Humanizer.Tests.Shared/Localisation/lv/DateToOrdinalWordsTests.cs diff --git a/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems b/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems index ee024b40e..a1913997d 100644 --- a/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems +++ b/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems @@ -107,6 +107,7 @@ + diff --git a/src/Humanizer.Tests.Shared/Localisation/lv/DateToOrdinalWordsTests.cs b/src/Humanizer.Tests.Shared/Localisation/lv/DateToOrdinalWordsTests.cs new file mode 100644 index 000000000..f18817ad6 --- /dev/null +++ b/src/Humanizer.Tests.Shared/Localisation/lv/DateToOrdinalWordsTests.cs @@ -0,0 +1,15 @@ +using System; +using Xunit; + +namespace Humanizer.Tests.Localisation.lv +{ + [UseCulture("lv")] + public class DateToOrdinalWordsTests + { + [Fact] + public void OrdinalizeString() + { + Assert.Equal("1 janvāris 2015", new DateTime(2015, 1, 1).ToOrdinalWords()); + } + } +} diff --git a/src/Humanizer/Localisation/NumberToWords/LatvianNumberToWordsConverter.cs b/src/Humanizer/Localisation/NumberToWords/LatvianNumberToWordsConverter.cs index 5bfb67294..ab5e579cc 100644 --- a/src/Humanizer/Localisation/NumberToWords/LatvianNumberToWordsConverter.cs +++ b/src/Humanizer/Localisation/NumberToWords/LatvianNumberToWordsConverter.cs @@ -10,7 +10,7 @@ internal class LatvianNumberToWordsConverter : GenderedNumberToWordsConverter private static readonly string[] HundredsMap = { "nulle", "simt", "divsimt", "trīssimt", "četrsimt", "piecsimt", "sešsimt", "septiņsimt", "astoņsimt", "deviņsimt" }; private static readonly string[] UnitsOrdinal = { string.Empty, "pirm", "otr", "treš", "ceturt", "piekt", "sest", "septīt", "astot", "devīt", "desmit", "vienpadsmit", "divpadsmit", "trīspadsmit", "četrpadsmit", "piecpadsmit", "sešpadsmit", "septiņpadsmit", "astoņpadsmit", "deviņpadsmit", "divdesmit" }; - public override string Convert(long input, GrammaticalGender gender) + public override string Convert(long input, GrammaticalGender gender, bool addAnd = true) { if (input > int.MaxValue || input < int.MinValue) {