Fix, refact + unit test of number to string

Related to #5978
This commit is contained in:
niksedk 2022-05-25 08:01:52 +02:00
parent 6246629b22
commit 8b545d845b
4 changed files with 159 additions and 441 deletions

View File

@ -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);
}
}
}

View File

@ -65,6 +65,7 @@
<Compile Include="Assa\ResamplerTest.cs" />
<Compile Include="Dictionaries\StringWithoutSpaceSplitToWordsTest.cs" />
<Compile Include="LanguageFiles\LanguageFileTest.cs" />
<Compile Include="Logic\NetflixHelperTest.cs" />
<Compile Include="Logic\SubtitleFormats\PacTest.cs" />
<Compile Include="Core\UUEncodingTest.cs" />
<Compile Include="Core\CharUtilsTest.cs" />

View File

@ -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);
}
}

View File

@ -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<string, string> dictionary = null;
if (language == "en")
{
if (value.Equals("0", StringComparison.Ordinal))
{
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";
}
}
if (language == "da")
{
if (value.Equals("0", StringComparison.Ordinal))
{
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";
}
}
if (language == "pt")
{
if (value.Equals("0", StringComparison.Ordinal))
{
value = "zero";
}
if (value.Equals("1", StringComparison.Ordinal))
{
value = "um";
}
dictionary = new Dictionary<string, string>
{
{ "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" },
};
}
else if (language == "da")
{
dictionary = new Dictionary<string, string>
{
{ "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" },
};
}
else if (language == "pt")
{
dictionary = new Dictionary<string, string>
{
{ "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 (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";
}
}
if (startWithUppercase && value.Length > 0)
{
return value.CapitalizeFirstLetter();
}
return value;
}
}
}