From 465f885a7d31dcc9c5386e967a4bac6407229c35 Mon Sep 17 00:00:00 2001 From: Alexander Zaytsev Date: Thu, 5 Sep 2019 12:34:08 +1200 Subject: [PATCH] Support full long range for Russian ToWords --- .../Localisation/ru-RU/NumberToWordsTests.cs | 23 ++++++++++++++++++- .../RussianNumberToWordsConverter.cs | 17 ++++++-------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/Humanizer.Tests.Shared/Localisation/ru-RU/NumberToWordsTests.cs b/src/Humanizer.Tests.Shared/Localisation/ru-RU/NumberToWordsTests.cs index 100bd0ca0..c7e1d01ac 100644 --- a/src/Humanizer.Tests.Shared/Localisation/ru-RU/NumberToWordsTests.cs +++ b/src/Humanizer.Tests.Shared/Localisation/ru-RU/NumberToWordsTests.cs @@ -5,7 +5,6 @@ namespace Humanizer.Tests.Localisation.ruRU [UseCulture("ru-RU")] public class NumberToWordsTests { - [Theory] [InlineData(0, "ноль")] [InlineData(1, "один")] @@ -64,6 +63,28 @@ public class NumberToWordsTests [InlineData(4111111118, "четыре миллиарда сто одиннадцать миллионов сто одиннадцать тысяч сто восемнадцать")] [InlineData(-751633617, "минус семьсот пятьдесят один миллион шестьсот тридцать три тысячи шестьсот семнадцать")] [InlineData(999999999999, "девятьсот девяносто девять миллиардов девятьсот девяносто девять миллионов девятьсот девяносто девять тысяч девятьсот девяносто девять")] + [InlineData(1_000_000_000_000, "один триллион")] + [InlineData(3_000_000_000_000, "три триллиона")] + [InlineData(5_000_000_000_000, "пять триллионов")] + [InlineData(999_000_000_000_000, "девятьсот девяносто девять триллионов")] + [InlineData( + long.MaxValue, + "девять квинтиллионов " + + "двести двадцать три квадриллиона " + + "триста семьдесят два триллиона " + + "тридцать шесть миллиардов " + + "восемьсот пятьдесят четыре миллиона " + + "семьсот семьдесят пять тысяч " + + "восемьсот семь")] + [InlineData( + long.MinValue, + "минус девять квинтиллионов " + + "двести двадцать три квадриллиона " + + "триста семьдесят два триллиона " + + "тридцать шесть миллиардов " + + "восемьсот пятьдесят четыре миллиона " + + "семьсот семьдесят пять тысяч " + + "восемьсот восемь")] public void ToWords(long number, string expected) { Assert.Equal(expected, number.ToWords()); diff --git a/src/Humanizer/Localisation/NumberToWords/RussianNumberToWordsConverter.cs b/src/Humanizer/Localisation/NumberToWords/RussianNumberToWordsConverter.cs index 549a36511..1375cd5b8 100644 --- a/src/Humanizer/Localisation/NumberToWords/RussianNumberToWordsConverter.cs +++ b/src/Humanizer/Localisation/NumberToWords/RussianNumberToWordsConverter.cs @@ -16,11 +16,6 @@ internal class RussianNumberToWordsConverter : GenderedNumberToWordsConverter public override string Convert(long input, GrammaticalGender gender) { - if (input > 999999999999 || input < -999999999999) - { - throw new NotImplementedException(); - } - if (input == 0) { return "ноль"; @@ -31,9 +26,11 @@ public override string Convert(long input, GrammaticalGender gender) if (input < 0) { parts.Add("минус"); - input = -input; } + CollectParts(parts, ref input, 1000000000000000000, GrammaticalGender.Masculine, "квинтиллион", "квинтиллиона", "квинтиллионов"); + CollectParts(parts, ref input, 1000000000000000, GrammaticalGender.Masculine, "квадриллион", "квадриллиона", "квадриллионов"); + CollectParts(parts, ref input, 1000000000000, GrammaticalGender.Masculine, "триллион", "триллиона", "триллионов"); CollectParts(parts, ref input, 1000000000, GrammaticalGender.Masculine, "миллиард", "миллиарда", "миллиардов"); CollectParts(parts, ref input, 1000000, GrammaticalGender.Masculine, "миллион", "миллиона", "миллионов"); CollectParts(parts, ref input, 1000, GrammaticalGender.Feminine, "тысяча", "тысячи", "тысяч"); @@ -174,15 +171,15 @@ private static string GetPrefix(long number) return string.Join("", parts); } - private static void CollectParts(ICollection parts, ref long number, int divisor, GrammaticalGender gender, params string[] forms) + private static void CollectParts(ICollection parts, ref long number, long divisor, GrammaticalGender gender, params string[] forms) { - if (number < divisor) + var result = Math.Abs(number / divisor); + if (result == 0) { return; } - var result = number / divisor; - number %= divisor; + number = Math.Abs(number % divisor); CollectPartsUnderOneThousand(parts, result, gender); parts.Add(ChooseOneForGrammaticalNumber(result, forms));