Skip to content

Commit

Permalink
add number to words localizer for central kurdish
Browse files Browse the repository at this point in the history
  • Loading branch information
mhmd-azeez committed Mar 23, 2021
1 parent 2ba67c0 commit 253e692
Show file tree
Hide file tree
Showing 5 changed files with 174 additions and 15 deletions.
3 changes: 2 additions & 1 deletion src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Localisation\bn-BD\DateHumanizeTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\bn-BD\NumberToWordsTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\bn-BD\TimeSpanHumanizeTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\ckb\DateHumanizeTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\ku\DateHumanizeTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\cs\DateHumanizeTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\cs\NumberToWordsTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\cs\TimeSpanHumanizeTests.cs" />
Expand Down Expand Up @@ -107,6 +107,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Localisation\ja\DateHumanizeTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\ja\NumberToWordsTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\ja\TimeSpanHumanizeTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\ku\NumberToWordsTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\mt\DateHumanizeTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\mt\NumberToWordsTests.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Localisation\mt\TimeSpanHumanizeTests.cs" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using Humanizer.Localisation;
using Xunit;

namespace Humanizer.Tests.Localisation.ckb
namespace Humanizer.Tests.Localisation.ku
{
[UseCulture("ku")]
public class DateHumanizeTests
Expand Down Expand Up @@ -48,10 +48,10 @@ public void HoursFromNow(int hours, string expected)

[Theory]
[InlineData(-2, "2 خولەک لەمەوبەر")]
[InlineData(-1, "یەک خولەک لەمەوبەر")]
[InlineData(-1, "خولەکێک لەمەوبەر")]
[InlineData(-3, "3 خولەک لەمەوبەر")]
[InlineData(-11, "11 خولەک لەمەوبەر")]
[InlineData(60, "یەک کاتژمێر لەمەوبەر")]
[InlineData(60, "کاتژمێرێک لەمەوبەر")]
public void MinutesAgo(int minutes, string expected)
{
DateHumanize.Verify(expected, minutes, TimeUnit.Minute, Tense.Past);
Expand All @@ -69,7 +69,7 @@ public void MinutesFromNow(int minutes, string expected)

[Theory]
[InlineData(-2, "2 مانگ لەمەوبەر")]
[InlineData(-1, "یەک مانگ لەمەوبەر")]
[InlineData(-1, "مانگێک لەمەوبەر")]
[InlineData(-3, "3 مانگ لەمەوبەر")]
[InlineData(-11, "11 مانگ لەمەوبەر")]
public void MonthsAgo(int months, string expected)
Expand All @@ -88,7 +88,7 @@ public void MonthsFromNow(int months, string expected)

[Theory]
[InlineData(-2, "2 چرکە لەمەوبەر")]
[InlineData(-1, "یەک چرکە لەمەوبەر")]
[InlineData(-1, "چرکەیەک لەمەوبەر")]
[InlineData(-3, "3 چرکە لەمەوبەر")]
[InlineData(-11, "11 چرکە لەمەوبەر")]
public void SecondsAgo(int seconds, string expected)
Expand All @@ -98,18 +98,18 @@ public void SecondsAgo(int seconds, string expected)

[Theory]
[InlineData(0, "ئێستا")]
[InlineData(1, "یەک چرکەی دیکە")]
[InlineData(2, "2 چرکەی دیکە")]
[InlineData(10, "10 چرکەی دیکە")]
[InlineData(24, " چرکەی دیکە")]
[InlineData(1, "دوای چرکەیەکی دیکە")]
[InlineData(2, "دوای 2 چرکەی دیکە")]
[InlineData(10, "دوای 10 چرکەی دیکە")]
[InlineData(24, "دوای 24 چرکەی دیکە")]
public void SecondsFromNow(int seconds, string expected)
{
DateHumanize.Verify(expected, seconds, TimeUnit.Second, Tense.Future);
}

[Theory]
[InlineData(-2, "2 ساڵ لەمەوبەر")]
[InlineData(-1, "یەک ساڵ لەمەوبەر")]
[InlineData(-1, "ساڵێک لەمەوبەر")]
[InlineData(-3, "3 ساڵ لەمەوبەر")]
[InlineData(-11, "11 ساڵ لەمەوبەر")]
public void YearsAgo(int years, string expected)
Expand All @@ -118,10 +118,10 @@ public void YearsAgo(int years, string expected)
}

[Theory]
[InlineData(1, "یەک ساڵی دیکە")]
[InlineData(2, "2 ساڵی دیکە")]
[InlineData(7, "7 ساڵی دیکە")]
[InlineData(55, "55 ساڵی دیکە")]
[InlineData(1, "دوای ساڵێکی دیکە")]
[InlineData(2, "دوای 2 ساڵی دیکە")]
[InlineData(7, "دوای 7 ساڵی دیکە")]
[InlineData(55, "دوای 55 ساڵی دیکە")]
public void YearsFromNow(int years, string expected)
{
DateHumanize.Verify(expected, years, TimeUnit.Year, Tense.Future);
Expand Down
78 changes: 78 additions & 0 deletions src/Humanizer.Tests.Shared/Localisation/ku/NumberToWordsTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
using Xunit;

namespace Humanizer.Tests.Localisation.ku
{
[UseCulture("ku")]
public class NumberToWordsTests
{
[Theory]
[InlineData(1, "یەک")]
[InlineData(10, "دە")]
[InlineData(11, "یازدە")]
[InlineData(122, "سەد و بیست و دوو")]
[InlineData(3501, "سێ هەزار و پێنج سەد و یەک")]
[InlineData(100, "سەد")]
[InlineData(1000, "یەک هەزار")]
[InlineData(100000, "سەد هەزار")]
[InlineData(1000000, "یەک میلیۆن")]
[InlineData(10000000, "دە میلیۆن")]
[InlineData(100000000, "سەد میلیۆن")]
[InlineData(1000000000, "یەک میلیارد")]
[InlineData(111, "سەد و یازدە")]
[InlineData(1111, "یەک هەزار و سەد و یازدە")]
[InlineData(111111, "سەد و یازدە هەزار و سەد و یازدە")]
[InlineData(1111111, "یەک میلیۆن و سەد و یازدە هەزار و سەد و یازدە")]
[InlineData(11111111, "یازدە میلیۆن و سەد و یازدە هەزار و سەد و یازدە")]
[InlineData(111111111, "سەد و یازدە میلیۆن و سەد و یازدە هەزار و سەد و یازدە")]
[InlineData(1111111111, "یەک میلیارد و سەد و یازدە میلیۆن و سەد و یازدە هەزار و سەد و یازدە")]
[InlineData(123, "سەد و بیست و سێ")]
[InlineData(1234, "یەک هەزار و دوو سەد و سی و چوار")]
[InlineData(12345, "دوازدە هەزار و سێ سەد و چل و پێنج")]
[InlineData(123456, "سەد و بیست و سێ هەزار و چوار سەد و پەنجا و شەش")]
[InlineData(1234567, "یەک میلیۆن و دوو سەد و سی و چوار هەزار و پێنج سەد و شەست و حەوت")]
[InlineData(12345678, "دوازدە میلیۆن و سێ سەد و چل و پێنج هەزار و شەش سەد و حەفتا و هەشت")]
[InlineData(123456789, "سەد و بیست و سێ میلیۆن و چوار سەد و پەنجا و شەش هەزار و حەوت سەد و هەشتا و نۆ")]
[InlineData(1234567890, "یەک میلیارد و دوو سەد و سی و چوار میلیۆن و پێنج سەد و شەست و حەوت هەزار و هەشت سەد و نەوەد")]
public void ToWordsKurdish(int number, string expected)
{
Assert.Equal(expected, number.ToWords());
}

[Theory]
[InlineData(0, "سفرەم")]
[InlineData(1, "یەکەم")]
[InlineData(2, "دووەم")]
[InlineData(3, "سێیەم")]
[InlineData(4, "چوارەم")]
[InlineData(5, "پێنجەم")]
[InlineData(6, "شەشەم")]
[InlineData(7, "حەوتەم")]
[InlineData(8, "هەشتەم")]
[InlineData(9, "نۆیەم")]
[InlineData(10, "دەیەم")]
[InlineData(11, "یازدەیەم")]
[InlineData(12, "دوازدەیەم")]
[InlineData(13, "سێزدەیەم")]
[InlineData(21, "بیست و یەکەم")]
[InlineData(22, "بیست و دووەم")]
[InlineData(23, "بیست و سێیەم")]
[InlineData(24, "بیست و چوارەم")]
[InlineData(25, "بیست و پێنجەم")]
[InlineData(30, "سییەم")]
[InlineData(40, "چلەم")]
[InlineData(50, "پەنجایەم")]
[InlineData(60, "شەستەم")]
[InlineData(70, "حەفتایەم")]
[InlineData(80, "هەشتایەم")]
[InlineData(90, "نەوەدەم")]
[InlineData(100, "سەدەم")]
[InlineData(200, "دوو سەدەم")]
[InlineData(1000, "یەک هەزارەم")]
[InlineData(1333, "یەک هەزار و سێ سەد و سی و سێیەم")]
[InlineData(1000000, "یەک میلیۆنەم")]
public void ToOrdinalWordsKurdish(int number, string words)
{
Assert.Equal(words, number.ToOrdinalWords());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public NumberToWordsConverterRegistry()
Register("hy", new ArmenianNumberToWordsConverter());
Register("az", new AzerbaijaniNumberToWordsConverter());
Register("ja", new JapaneseNumberToWordsConverter());
Register("ku", new CentralKurdishNumberToWordsConverter());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;

namespace Humanizer.Localisation.NumberToWords
{
internal class CentralKurdishNumberToWordsConverter : GenderlessNumberToWordsConverter
{
private static readonly string[] KurdishHundredsMap = { "سفر", "سەد", "دوو سەد", "سێ سەد", "چوار سەد", "پێنج سەد", "شەش سەد", "حەوت سەد", "هەشت سەد", "نۆ سەد" };
private static readonly string[] KurdishTensMap = { "سفر", "دە", "بیست", "سی", "چل", "پەنجا", "شەست", "حەفتا", "هەشتا", "نەوەد" };
private static readonly string[] KurdishUnitsMap = { "سفر", "یەک", "دوو", "سێ", "چوار", "پێنج", "شەش", "حەوت", "هەشت", "نۆ", "دە", "یازدە", "دوازدە", "سێزدە", "چواردە", "پازدە", "شازدە", "حەڤدە", "هەژدە", "نۆزدە" };

public override string Convert(long number)
{
var largestNumber = (Math.Pow(10, 15) * 1000) - 1;
if (number > largestNumber || number < -largestNumber)
{
throw new NotImplementedException();
}

if (number < 0)
{
return string.Format("نێگەتیڤ {0}", Convert(-number));
}

if (number == 0)
{
return "سفر";
}

var kurdishGroupsMap = new Dictionary<long, Func<long, string>>
{
{(long)Math.Pow(10, 15), n => string.Format("{0} کوادریلیۆن", Convert(n)) },
{(long)Math.Pow(10, 12), n => string.Format("{0} تریلیۆن", Convert(n)) },
{(long)Math.Pow(10, 9), n => string.Format("{0} میلیارد", Convert(n)) },
{(long)Math.Pow(10, 6), n => string.Format("{0} میلیۆن", Convert(n)) },
{(long)Math.Pow(10, 3), n => string.Format("{0} هەزار", Convert(n)) },
{(long)Math.Pow(10, 2), n => KurdishHundredsMap[n]}
};

var parts = new List<string>();
foreach (var group in kurdishGroupsMap.Keys)
{
if (number / group > 0)
{
parts.Add(kurdishGroupsMap[group](number / group));
number %= group;
}
}

if (number >= 20)
{
parts.Add(KurdishTensMap[number / 10]);
number %= 10;
}

if (number > 0)
{
parts.Add(KurdishUnitsMap[number]);
}

return string.Join(" و ", parts);
}

public override string ConvertToOrdinal(int number)
{
var word = Convert(number);
return string.Format("{0}{1}", word, IsVowel(word[word.Length - 1]) ? "یەم" : "ەم");
}

private bool IsVowel(char c)
{
return c == 'ا' ||
c == 'ێ' ||
c == 'ۆ' ||
c == 'ە' ||
c == 'ی';
}
}
}

0 comments on commit 253e692

Please sign in to comment.