From 8b545d845b61bddafbf08110434abd2ed89a5254 Mon Sep 17 00:00:00 2001 From: niksedk Date: Wed, 25 May 2022 08:01:52 +0200 Subject: [PATCH] Fix, refact + unit test of number to string Related to #5978 --- src/Test/Logic/NetflixHelperTest.cs | 37 ++ src/Test/Test.csproj | 1 + .../NetflixCheckStartNumberSpellOut.cs | 12 +- .../NetflixQualityCheck/NetflixHelper.cs | 550 ++++-------------- 4 files changed, 159 insertions(+), 441 deletions(-) create mode 100644 src/Test/Logic/NetflixHelperTest.cs diff --git a/src/Test/Logic/NetflixHelperTest.cs b/src/Test/Logic/NetflixHelperTest.cs new file mode 100644 index 000000000..855aba6fd --- /dev/null +++ b/src/Test/Logic/NetflixHelperTest.cs @@ -0,0 +1,37 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Nikse.SubtitleEdit.Core.NetflixQualityCheck; + +namespace Test.Logic +{ + [TestClass] + public class NetflixHelperTest + { + [TestMethod] + public void ConvertNumberToString1() + { + var result = NetflixHelper.ConvertNumberToString("5", false, "da"); + Assert.AreEqual("fem", result); + } + + [TestMethod] + public void ConvertNumberToString2() + { + var result = NetflixHelper.ConvertNumberToString("5", false, "en"); + Assert.AreEqual("five", result); + } + + [TestMethod] + public void ConvertNumberToString3() + { + var result = NetflixHelper.ConvertNumberToString("5", true, "en"); + Assert.AreEqual("Five", result); + } + + [TestMethod] + public void ConvertNumberToString4() + { + var result = NetflixHelper.ConvertNumberToString("50000", true, "en"); + Assert.AreEqual("50000", result); + } + } +} diff --git a/src/Test/Test.csproj b/src/Test/Test.csproj index ebaec0a0e..6bbbc2220 100644 --- a/src/Test/Test.csproj +++ b/src/Test/Test.csproj @@ -65,6 +65,7 @@ + diff --git a/src/libse/NetflixQualityCheck/NetflixCheckStartNumberSpellOut.cs b/src/libse/NetflixQualityCheck/NetflixCheckStartNumberSpellOut.cs index 201c51061..1f1c6a94b 100644 --- a/src/libse/NetflixQualityCheck/NetflixCheckStartNumberSpellOut.cs +++ b/src/libse/NetflixQualityCheck/NetflixCheckStartNumberSpellOut.cs @@ -14,14 +14,14 @@ namespace Nikse.SubtitleEdit.Core.NetflixQualityCheck public void Check(Subtitle subtitle, NetflixQualityController controller) { - foreach (Paragraph p in subtitle.Paragraphs) + foreach (var p in subtitle.Paragraphs) { - string newText = p.Text; + var newText = p.Text; var m = NumberStart.Match(newText); while (m.Success) { - int length = m.Length - 2; + var length = m.Length - 2; newText = newText.Remove(m.Index, length).Insert(m.Index, NetflixHelper.ConvertNumberToString(m.Value.Substring(0, length), true, controller.Language)); m = NumberStart.Match(newText, m.Index + 1); } @@ -29,7 +29,7 @@ namespace Nikse.SubtitleEdit.Core.NetflixQualityCheck m = NumberStartInside.Match(newText); while (m.Success) { - int length = m.Length - 4; + var length = m.Length - 4; newText = newText.Remove(m.Index + 2, length).Insert(m.Index + 2, NetflixHelper.ConvertNumberToString(m.Value.Substring(2, length), true, controller.Language)); m = NumberStartInside.Match(newText, m.Index + 1); } @@ -37,7 +37,7 @@ namespace Nikse.SubtitleEdit.Core.NetflixQualityCheck m = NumberStartInside2.Match(newText); while (m.Success) { - int length = m.Length - 5; + var length = m.Length - 5; newText = newText.Remove(m.Index + 3, length).Insert(m.Index + 3, NetflixHelper.ConvertNumberToString(m.Value.Substring(3, length), true, controller.Language)); m = NumberStartInside2.Match(newText, m.Index + 1); } @@ -45,7 +45,7 @@ namespace Nikse.SubtitleEdit.Core.NetflixQualityCheck if (newText != p.Text) { var fixedParagraph = new Paragraph(p, false) { Text = newText }; - string comment = "When a number begins a sentence, it should always be spelled out"; + var comment = "When a number begins a sentence, it should always be spelled out"; controller.AddRecord(p, fixedParagraph, comment); } } diff --git a/src/libse/NetflixQualityCheck/NetflixHelper.cs b/src/libse/NetflixQualityCheck/NetflixHelper.cs index daa3f9849..45d9b9b35 100644 --- a/src/libse/NetflixQualityCheck/NetflixHelper.cs +++ b/src/libse/NetflixQualityCheck/NetflixHelper.cs @@ -1,461 +1,141 @@ using Nikse.SubtitleEdit.Core.Common; -using System; +using System.Collections.Generic; namespace Nikse.SubtitleEdit.Core.NetflixQualityCheck { internal static class NetflixHelper { - internal static string ConvertNumberToString(string input, bool startWithUppercase, string language) + public static string ConvertNumberToString(string input, bool startWithUppercase, string language) { var value = input.Trim(); + + Dictionary dictionary = null; if (language == "en") { - if (value.Equals("0", StringComparison.Ordinal)) + dictionary = new Dictionary { - value = "zero"; - } - - if (value.Equals("1", StringComparison.Ordinal)) - { - value = "one"; - } - - if (value.Equals("2", StringComparison.Ordinal)) - { - value = "two"; - } - - if (value.Equals("3", StringComparison.Ordinal)) - { - value = "three"; - } - - if (value.Equals("4", StringComparison.Ordinal)) - { - value = "four"; - } - - if (value.Equals("5", StringComparison.Ordinal)) - { - value = "five"; - } - - if (value.Equals("6", StringComparison.Ordinal)) - { - value = "six"; - } - - if (value.Equals("7", StringComparison.Ordinal)) - { - value = "seven"; - } - - if (value.Equals("8", StringComparison.Ordinal)) - { - value = "eight"; - } - - if (value.Equals("9", StringComparison.Ordinal)) - { - value = "nine"; - } - - if (value.Equals("10", StringComparison.Ordinal)) - { - value = "ten"; - } - - if (value.Equals("11", StringComparison.Ordinal)) - { - value = "eleven"; - } - - if (value.StartsWith("12", StringComparison.Ordinal)) - { - value = "twelve"; - } - - if (value.StartsWith("13", StringComparison.Ordinal)) - { - value = "thirteen"; - } - - if (value.StartsWith("14", StringComparison.Ordinal)) - { - value = "fourteen"; - } - - if (value.StartsWith("15", StringComparison.Ordinal)) - { - value = "fifteen"; - } - - if (value.StartsWith("16", StringComparison.Ordinal)) - { - value = "sixteen"; - } - - if (value.StartsWith("17", StringComparison.Ordinal)) - { - value = "seventeen"; - } - - if (value.StartsWith("18", StringComparison.Ordinal)) - { - value = "eighteen"; - } - - if (value.StartsWith("19", StringComparison.Ordinal)) - { - value = "nineteen"; - } - - if (value.StartsWith("20", StringComparison.Ordinal)) - { - value = "twenty"; - } - - if (value.StartsWith("30", StringComparison.Ordinal)) - { - value = "thirty"; - } - - if (value.StartsWith("40", StringComparison.Ordinal)) - { - value = "forty"; - } - - if (value.StartsWith("50", StringComparison.Ordinal)) - { - value = "fifty"; - } - - if (value.StartsWith("60", StringComparison.Ordinal)) - { - value = "sixty"; - } - - if (value.StartsWith("70", StringComparison.Ordinal)) - { - value = "seventy"; - } - - if (value.StartsWith("80", StringComparison.Ordinal)) - { - value = "eighty"; - } - - if (value.StartsWith("90", StringComparison.Ordinal)) - { - value = "ninety"; - } - - if (value.StartsWith("100", StringComparison.Ordinal)) - { - value = "one hundred"; - } + { "0", "zero" }, + { "1", "one" }, + { "2", "two" }, + { "3", "three" }, + { "4", "four" }, + { "5", "five" }, + { "6", "six" }, + { "7", "seven" }, + { "8", "eight" }, + { "9", "nine" }, + { "10", "ten" }, + { "11", "eleven" }, + { "12", "twelve" }, + { "13", "thirteen" }, + { "14", "fourteen" }, + { "15", "fifteen" }, + { "16", "sixteen" }, + { "17", "seventeen" }, + { "18", "eighteen" }, + { "19", "nineteen" }, + { "20", "twenty" }, + { "30", "thirty" }, + { "40", "forty" }, + { "50", "fifty" }, + { "60", "sixty" }, + { "70", "seventy" }, + { "80", "eighty" }, + { "90", "ninety" }, + { "100", "one hundred" }, + }; } - if (language == "da") + else if (language == "da") { - if (value.Equals("0", StringComparison.Ordinal)) + dictionary = new Dictionary { - value = "nul"; - } - - if (value.Equals("1", StringComparison.Ordinal)) - { - value = "en"; - } - - if (value.Equals("2", StringComparison.Ordinal)) - { - value = "to"; - } - - if (value.Equals("3", StringComparison.Ordinal)) - { - value = "tre"; - } - - if (value.Equals("4", StringComparison.Ordinal)) - { - value = "fire"; - } - - if (value.Equals("5", StringComparison.Ordinal)) - { - value = "fem"; - } - - if (value.Equals("6", StringComparison.Ordinal)) - { - value = "seks"; - } - - if (value.Equals("7", StringComparison.Ordinal)) - { - value = "syv"; - } - - if (value.Equals("8", StringComparison.Ordinal)) - { - value = "otte"; - } - - if (value.Equals("9", StringComparison.Ordinal)) - { - value = "ni"; - } - - if (value.Equals("10", StringComparison.Ordinal)) - { - value = "ti"; - } - - if (value.Equals("11", StringComparison.Ordinal)) - { - value = "elve"; - } - - if (value.StartsWith("12", StringComparison.Ordinal)) - { - value = "tolv"; - } - - if (value.StartsWith("13", StringComparison.Ordinal)) - { - value = "tretten"; - } - - if (value.StartsWith("14", StringComparison.Ordinal)) - { - value = "fjorten"; - } - - if (value.StartsWith("15", StringComparison.Ordinal)) - { - value = "femten"; - } - - if (value.StartsWith("16", StringComparison.Ordinal)) - { - value = "seksten"; - } - - if (value.StartsWith("17", StringComparison.Ordinal)) - { - value = "sytten"; - } - - if (value.StartsWith("18", StringComparison.Ordinal)) - { - value = "atten"; - } - - if (value.StartsWith("19", StringComparison.Ordinal)) - { - value = "nitten"; - } - - if (value.StartsWith("20", StringComparison.Ordinal)) - { - value = "tyve"; - } - - if (value.StartsWith("30", StringComparison.Ordinal)) - { - value = "tredieve"; - } - - if (value.StartsWith("40", StringComparison.Ordinal)) - { - value = "fyrre"; - } - - if (value.StartsWith("50", StringComparison.Ordinal)) - { - value = "halvtreds"; - } - - if (value.StartsWith("60", StringComparison.Ordinal)) - { - value = "treds"; - } - - if (value.StartsWith("70", StringComparison.Ordinal)) - { - value = "halvfjerds"; - } - - if (value.StartsWith("80", StringComparison.Ordinal)) - { - value = "first"; - } - - if (value.StartsWith("90", StringComparison.Ordinal)) - { - value = "halvfems"; - } - - if (value.StartsWith("100", StringComparison.Ordinal)) - { - value = "ethunderede"; - } + { "0", "nul" }, + { "1", "en" }, + { "2", "to" }, + { "3", "tre" }, + { "4", "fire" }, + { "5", "fem" }, + { "6", "seks" }, + { "7", "syv" }, + { "8", "otte" }, + { "9", "ni" }, + { "10", "ti" }, + { "11", "elleve" }, + { "12", "tolv" }, + { "13", "tretten" }, + { "14", "fjorten" }, + { "15", "femten" }, + { "16", "seksten" }, + { "17", "sytten" }, + { "18", "atten" }, + { "19", "nitten" }, + { "20", "tyve" }, + { "30", "tredieve" }, + { "40", "fyrre" }, + { "50", "halvtreds" }, + { "60", "treds" }, + { "70", "halvfjerds" }, + { "80", "firs" }, + { "90", "halvfems" }, + { "100", "ethunderede" }, + }; } - if (language == "pt") + else if (language == "pt") { - if (value.Equals("0", StringComparison.Ordinal)) + dictionary = new Dictionary { - value = "zero"; - } - - if (value.Equals("1", StringComparison.Ordinal)) - { - value = "um"; - } - - if (value.Equals("2", StringComparison.Ordinal)) - { - value = "dois"; - } - - if (value.Equals("3", StringComparison.Ordinal)) - { - value = "três"; - } - - if (value.Equals("4", StringComparison.Ordinal)) - { - value = "quatro"; - } - - if (value.Equals("5", StringComparison.Ordinal)) - { - value = "cinco"; - } - - if (value.Equals("6", StringComparison.Ordinal)) - { - value = "seis"; - } - - if (value.Equals("7", StringComparison.Ordinal)) - { - value = "sete"; - } - - if (value.Equals("8", StringComparison.Ordinal)) - { - value = "oito"; - } - - if (value.Equals("9", StringComparison.Ordinal)) - { - value = "nove"; - } - - if (value.Equals("10", StringComparison.Ordinal)) - { - value = "dez"; - } - - if (value.Equals("11", StringComparison.Ordinal)) - { - value = "onze"; - } - - if (value.StartsWith("12", StringComparison.Ordinal)) - { - value = "doze"; - } - - if (value.StartsWith("13", StringComparison.Ordinal)) - { - value = "treze"; - } - - if (value.StartsWith("14", StringComparison.Ordinal)) - { - value = "quatorze"; - } - - if (value.StartsWith("15", StringComparison.Ordinal)) - { - value = "quinze"; - } - - if (value.StartsWith("16", StringComparison.Ordinal)) - { - value = "dezesseis"; - } - - if (value.StartsWith("17", StringComparison.Ordinal)) - { - value = "dezessete"; - } - - if (value.StartsWith("18", StringComparison.Ordinal)) - { - value = "dezoito"; - } - - if (value.StartsWith("19", StringComparison.Ordinal)) - { - value = "dezenove"; - } - - if (value.StartsWith("20", StringComparison.Ordinal)) - { - value = "vinte"; - } - - if (value.StartsWith("30", StringComparison.Ordinal)) - { - value = "trinta"; - } - - if (value.StartsWith("40", StringComparison.Ordinal)) - { - value = "quarenta"; - } - - if (value.StartsWith("50", StringComparison.Ordinal)) - { - value = "cinquenta"; - } - - if (value.StartsWith("60", StringComparison.Ordinal)) - { - value = "sessenta"; - } - - if (value.StartsWith("70", StringComparison.Ordinal)) - { - value = "setenta"; - } - - if (value.StartsWith("80", StringComparison.Ordinal)) - { - value = "oitenta"; - } - - if (value.StartsWith("90", StringComparison.Ordinal)) - { - value = "noventa"; - } - - if (value.StartsWith("100", StringComparison.Ordinal)) - { - value = "cem"; - } + { "0", "zero" }, + { "1", "um" }, + { "2", "dois" }, + { "3", "três" }, + { "4", "quatro" }, + { "5", "cinco" }, + { "6", "seis" }, + { "7", "sete" }, + { "8", "oito" }, + { "9", "nove" }, + { "10", "dez" }, + { "11", "onze" }, + { "12", "doze" }, + { "13", "treze" }, + { "14", "quatorze" }, + { "15", "quinze" }, + { "16", "dezesseis" }, + { "17", "dezessete" }, + { "18", "dezoito" }, + { "19", "dezenove" }, + { "20", "vinte" }, + { "30", "trinta" }, + { "40", "quarenta" }, + { "50", "cinquenta" }, + { "60", "sessenta" }, + { "70", "setenta" }, + { "80", "oitenta" }, + { "90", "noventa" }, + { "100", "cem" }, + }; } + + var post = string.Empty; + if (value.EndsWith('.') || value.EndsWith(',') || value.EndsWith('?')) + { + post = value.Substring(value.Length - 1); + value = value.Substring(0, value.Length - 1); + } + + if (dictionary != null && dictionary.TryGetValue(value, out var result)) + { + value = result; + } + + value += post; + if (startWithUppercase && value.Length > 0) { return value.CapitalizeFirstLetter(); } + return value; } - - } }