From 458f2b982cf43b7ebf5123afa5eb44e4208d7bda Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 17:35:03 -0300 Subject: [PATCH 01/41] Added a single Brazilian Portuguese example --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 10 ++++++++++ Numsense.UnitTests/Numsense.UnitTests.fsproj | 1 + Numsense/BrazilianPortuguese.fs | 6 ++++++ Numsense/Numeral.fs | 2 ++ Numsense/Numsense.fsproj | 1 + 5 files changed, 20 insertions(+) create mode 100644 Numsense.UnitTests/BrazilianPortugueseExamples.fs create mode 100644 Numsense/BrazilianPortuguese.fs diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs new file mode 100644 index 0000000..319f986 --- /dev/null +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -0,0 +1,10 @@ +module Ploeh.Numsense.BrazilianPortugueseExamples + +open Xunit +open Swensen.Unquote + +[] +[] +let ``tryParseBrazilian returns correct result`` (portuguese, expected) = + let actual = Numeral.tryParseBrazilian portuguese + Some expected =! actual diff --git a/Numsense.UnitTests/Numsense.UnitTests.fsproj b/Numsense.UnitTests/Numsense.UnitTests.fsproj index e60610c..01c3fce 100644 --- a/Numsense.UnitTests/Numsense.UnitTests.fsproj +++ b/Numsense.UnitTests/Numsense.UnitTests.fsproj @@ -54,6 +54,7 @@ + diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs new file mode 100644 index 0000000..071fbed --- /dev/null +++ b/Numsense/BrazilianPortuguese.fs @@ -0,0 +1,6 @@ +module internal Ploeh.Numsense.BrazilianPortuguese + +let internal tryParseBrazilianImp (x : string) = + match x with + | "zero" -> Some 0 + | _ -> None diff --git a/Numsense/Numeral.fs b/Numsense/Numeral.fs index e9a3d81..cae6052 100644 --- a/Numsense/Numeral.fs +++ b/Numsense/Numeral.fs @@ -39,3 +39,5 @@ let tryParseGerman = German.tryParseGermanImp let toPortuguese = Portuguese.toPortugueseImp let tryParsePortuguese = Portuguese.tryParsePortugueseImp + +let tryParseBrazilian = BrazilianPortuguese.tryParseBrazilianImp diff --git a/Numsense/Numsense.fsproj b/Numsense/Numsense.fsproj index ff76b02..652aa90 100644 --- a/Numsense/Numsense.fsproj +++ b/Numsense/Numsense.fsproj @@ -54,6 +54,7 @@ + From b34c9ed03e49b6d2f00f9019e34bab01419b74dc Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 17:37:10 -0300 Subject: [PATCH 02/41] Added one to nine --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 11 ++++++++++- Numsense/BrazilianPortuguese.fs | 13 +++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 319f986..32cd286 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,7 +4,16 @@ open Xunit open Swensen.Unquote [] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 071fbed..2b37d1b 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -2,5 +2,14 @@ let internal tryParseBrazilianImp (x : string) = match x with - | "zero" -> Some 0 - | _ -> None + | "zero" -> Some 0 + | "um" -> Some 1 + | "dois" -> Some 2 + | "três" -> Some 3 + | "quatro" -> Some 4 + | "cinco" -> Some 5 + | "seis" -> Some 6 + | "sete" -> Some 7 + | "oito" -> Some 8 + | "nove" -> Some 9 + | _ -> None From c7fe4f9515f102a906330003855ee55b6baaf6e6 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 17:39:02 -0300 Subject: [PATCH 03/41] Handled casing and whitespaces --- .../BrazilianPortugueseExamples.fs | 35 +++++++++++++------ Numsense/BrazilianPortuguese.fs | 22 ++++++------ 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 32cd286..7f12a80 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,16 +4,31 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 2b37d1b..5856633 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -1,15 +1,15 @@ module internal Ploeh.Numsense.BrazilianPortuguese let internal tryParseBrazilianImp (x : string) = - match x with - | "zero" -> Some 0 - | "um" -> Some 1 - | "dois" -> Some 2 - | "três" -> Some 3 - | "quatro" -> Some 4 - | "cinco" -> Some 5 - | "seis" -> Some 6 - | "sete" -> Some 7 - | "oito" -> Some 8 - | "nove" -> Some 9 + match x.Trim().ToUpper() with + | "ZERO" -> Some 0 + | "UM" -> Some 1 + | "DOIS" -> Some 2 + | "TRÊS" -> Some 3 + | "QUATRO" -> Some 4 + | "CINCO" -> Some 5 + | "SEIS" -> Some 6 + | "SETE" -> Some 7 + | "OITO" -> Some 8 + | "NOVE" -> Some 9 | _ -> None From 89919fcaecfc86b4afbf71a434414cf1b1371714 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 17:40:28 -0300 Subject: [PATCH 04/41] Added ten to nineteen --- .../BrazilianPortugueseExamples.fs | 61 +++++++++++-------- Numsense/BrazilianPortuguese.fs | 31 +++++++--- 2 files changed, 57 insertions(+), 35 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 7f12a80..0ad4be5 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,31 +4,42 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 5856633..a0cb1d7 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -2,14 +2,25 @@ let internal tryParseBrazilianImp (x : string) = match x.Trim().ToUpper() with - | "ZERO" -> Some 0 - | "UM" -> Some 1 - | "DOIS" -> Some 2 - | "TRÊS" -> Some 3 - | "QUATRO" -> Some 4 - | "CINCO" -> Some 5 - | "SEIS" -> Some 6 - | "SETE" -> Some 7 - | "OITO" -> Some 8 - | "NOVE" -> Some 9 + | "ZERO" -> Some 0 + | "DEZ" -> Some 10 + | "ONZE" -> Some 11 + | "DOZE" -> Some 12 + | "TREZE" -> Some 13 + | "CATORZE" -> Some 14 + | "QUATORZE" -> Some 14 + | "QUINZE" -> Some 15 + | "DEZESSEIS" -> Some 16 + | "DEZESSETE" -> Some 17 + | "DEZOITO" -> Some 18 + | "DEZENOVE" -> Some 19 + | "UM" -> Some 1 + | "DOIS" -> Some 2 + | "TRÊS" -> Some 3 + | "QUATRO" -> Some 4 + | "CINCO" -> Some 5 + | "SEIS" -> Some 6 + | "SETE" -> Some 7 + | "OITO" -> Some 8 + | "NOVE" -> Some 9 | _ -> None From fa202321236d53bd405c81e26c949707aa8ab9d4 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 17:53:21 -0300 Subject: [PATCH 05/41] Added twenty --- .../BrazilianPortugueseExamples.fs | 82 +++++++++++-------- Numsense/BrazilianPortuguese.fs | 56 +++++++------ 2 files changed, 79 insertions(+), 59 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 0ad4be5..4d6e0e3 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,42 +4,52 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index a0cb1d7..3ebb7f8 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -1,26 +1,36 @@ module internal Ploeh.Numsense.BrazilianPortuguese +open Ploeh.Numsense.InternalDsl + let internal tryParseBrazilianImp (x : string) = - match x.Trim().ToUpper() with - | "ZERO" -> Some 0 - | "DEZ" -> Some 10 - | "ONZE" -> Some 11 - | "DOZE" -> Some 12 - | "TREZE" -> Some 13 - | "CATORZE" -> Some 14 - | "QUATORZE" -> Some 14 - | "QUINZE" -> Some 15 - | "DEZESSEIS" -> Some 16 - | "DEZESSETE" -> Some 17 - | "DEZOITO" -> Some 18 - | "DEZENOVE" -> Some 19 - | "UM" -> Some 1 - | "DOIS" -> Some 2 - | "TRÊS" -> Some 3 - | "QUATRO" -> Some 4 - | "CINCO" -> Some 5 - | "SEIS" -> Some 6 - | "SETE" -> Some 7 - | "OITO" -> Some 8 - | "NOVE" -> Some 9 - | _ -> None + let rec conv acc candidate = + match candidate with + | "" -> Some acc + | StartsWith " " t + | StartsWith "E" t -> conv acc t + | "ZERO" -> Some (0 + acc) + | StartsWith "VINTE" t -> conv (20 + acc) t + | "DEZ" -> Some (10 + acc) + | "ONZE" -> Some (11 + acc) + | "DOZE" -> Some (12 + acc) + | "TREZE" -> Some (13 + acc) + | "CATORZE" -> Some (14 + acc) + | "QUATORZE" -> Some (14 + acc) + | "QUINZE" -> Some (15 + acc) + | "DEZESSEIS" -> Some (16 + acc) + | "DEZESSETE" -> Some (17 + acc) + | "DEZOITO" -> Some (18 + acc) + | "DEZENOVE" -> Some (19 + acc) + | "UM" -> Some (1 + acc) + | "DOIS" -> Some (2 + acc) + | "TRÊS" -> Some (3 + acc) + | "QUATRO" -> Some (4 + acc) + | "CINCO" -> Some (5 + acc) + | "SEIS" -> Some (6 + acc) + | "SETE" -> Some (7 + acc) + | "OITO" -> Some (8 + acc) + | "NOVE" -> Some (9 + acc) + | _ -> None + + let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") + conv 0 canonicalized From a630e22d8e278daa1d1531fb0d460f03649da8a1 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 21:53:12 -0300 Subject: [PATCH 06/41] Added thirty --- .../BrazilianPortugueseExamples.fs | 94 ++++++++++--------- Numsense/BrazilianPortuguese.fs | 51 +++++----- 2 files changed, 74 insertions(+), 71 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 4d6e0e3..a5e1c70 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,52 +4,54 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 3ebb7f8..433861b 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -5,31 +5,32 @@ open Ploeh.Numsense.InternalDsl let internal tryParseBrazilianImp (x : string) = let rec conv acc candidate = match candidate with - | "" -> Some acc - | StartsWith " " t - | StartsWith "E" t -> conv acc t - | "ZERO" -> Some (0 + acc) - | StartsWith "VINTE" t -> conv (20 + acc) t - | "DEZ" -> Some (10 + acc) - | "ONZE" -> Some (11 + acc) - | "DOZE" -> Some (12 + acc) - | "TREZE" -> Some (13 + acc) - | "CATORZE" -> Some (14 + acc) - | "QUATORZE" -> Some (14 + acc) - | "QUINZE" -> Some (15 + acc) - | "DEZESSEIS" -> Some (16 + acc) - | "DEZESSETE" -> Some (17 + acc) - | "DEZOITO" -> Some (18 + acc) - | "DEZENOVE" -> Some (19 + acc) - | "UM" -> Some (1 + acc) - | "DOIS" -> Some (2 + acc) - | "TRÊS" -> Some (3 + acc) - | "QUATRO" -> Some (4 + acc) - | "CINCO" -> Some (5 + acc) - | "SEIS" -> Some (6 + acc) - | "SETE" -> Some (7 + acc) - | "OITO" -> Some (8 + acc) - | "NOVE" -> Some (9 + acc) + | "" -> Some acc + | StartsWith " " t + | StartsWith "E" t -> conv acc t + | "ZERO" -> Some (0 + acc) + | StartsWith "VINTE" t -> conv (20 + acc) t + | StartsWith "TRINTA" t -> conv (30 + acc) t + | "DEZ" -> Some (10 + acc) + | "ONZE" -> Some (11 + acc) + | "DOZE" -> Some (12 + acc) + | "TREZE" -> Some (13 + acc) + | "CATORZE" -> Some (14 + acc) + | "QUATORZE" -> Some (14 + acc) + | "QUINZE" -> Some (15 + acc) + | "DEZESSEIS" -> Some (16 + acc) + | "DEZESSETE" -> Some (17 + acc) + | "DEZOITO" -> Some (18 + acc) + | "DEZENOVE" -> Some (19 + acc) + | "UM" -> Some (1 + acc) + | "DOIS" -> Some (2 + acc) + | "TRÊS" -> Some (3 + acc) + | "QUATRO" -> Some (4 + acc) + | "CINCO" -> Some (5 + acc) + | "SEIS" -> Some (6 + acc) + | "SETE" -> Some (7 + acc) + | "OITO" -> Some (8 + acc) + | "NOVE" -> Some (9 + acc) | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") From 73158c7f72a6dbb9dd7d5ae4b2470f8e5c6867d2 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 21:54:44 -0300 Subject: [PATCH 07/41] Added forthy --- .../BrazilianPortugueseExamples.fs | 2 + Numsense/BrazilianPortuguese.fs | 53 ++++++++++--------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index a5e1c70..2b2242d 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -52,6 +52,8 @@ open Swensen.Unquote [] [] [] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 433861b..f873069 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -5,32 +5,33 @@ open Ploeh.Numsense.InternalDsl let internal tryParseBrazilianImp (x : string) = let rec conv acc candidate = match candidate with - | "" -> Some acc - | StartsWith " " t - | StartsWith "E" t -> conv acc t - | "ZERO" -> Some (0 + acc) - | StartsWith "VINTE" t -> conv (20 + acc) t - | StartsWith "TRINTA" t -> conv (30 + acc) t - | "DEZ" -> Some (10 + acc) - | "ONZE" -> Some (11 + acc) - | "DOZE" -> Some (12 + acc) - | "TREZE" -> Some (13 + acc) - | "CATORZE" -> Some (14 + acc) - | "QUATORZE" -> Some (14 + acc) - | "QUINZE" -> Some (15 + acc) - | "DEZESSEIS" -> Some (16 + acc) - | "DEZESSETE" -> Some (17 + acc) - | "DEZOITO" -> Some (18 + acc) - | "DEZENOVE" -> Some (19 + acc) - | "UM" -> Some (1 + acc) - | "DOIS" -> Some (2 + acc) - | "TRÊS" -> Some (3 + acc) - | "QUATRO" -> Some (4 + acc) - | "CINCO" -> Some (5 + acc) - | "SEIS" -> Some (6 + acc) - | "SETE" -> Some (7 + acc) - | "OITO" -> Some (8 + acc) - | "NOVE" -> Some (9 + acc) + | "" -> Some acc + | StartsWith " " t + | StartsWith "E" t -> conv acc t + | "ZERO" -> Some (0 + acc) + | StartsWith "VINTE" t -> conv (20 + acc) t + | StartsWith "TRINTA" t -> conv (30 + acc) t + | StartsWith "QUARENTA" t -> conv (40 + acc) t + | "DEZ" -> Some (10 + acc) + | "ONZE" -> Some (11 + acc) + | "DOZE" -> Some (12 + acc) + | "TREZE" -> Some (13 + acc) + | "CATORZE" -> Some (14 + acc) + | "QUATORZE" -> Some (14 + acc) + | "QUINZE" -> Some (15 + acc) + | "DEZESSEIS" -> Some (16 + acc) + | "DEZESSETE" -> Some (17 + acc) + | "DEZOITO" -> Some (18 + acc) + | "DEZENOVE" -> Some (19 + acc) + | "UM" -> Some (1 + acc) + | "DOIS" -> Some (2 + acc) + | "TRÊS" -> Some (3 + acc) + | "QUATRO" -> Some (4 + acc) + | "CINCO" -> Some (5 + acc) + | "SEIS" -> Some (6 + acc) + | "SETE" -> Some (7 + acc) + | "OITO" -> Some (8 + acc) + | "NOVE" -> Some (9 + acc) | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") From 0de57a6316f8058299e4251024d116def8288ae2 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 21:58:24 -0300 Subject: [PATCH 08/41] Added fifty --- .../BrazilianPortugueseExamples.fs | 104 +++++++++--------- Numsense/BrazilianPortuguese.fs | 56 +++++----- 2 files changed, 83 insertions(+), 77 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 2b2242d..73a1699 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,56 +4,60 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index f873069..74c62f8 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -5,33 +5,35 @@ open Ploeh.Numsense.InternalDsl let internal tryParseBrazilianImp (x : string) = let rec conv acc candidate = match candidate with - | "" -> Some acc - | StartsWith " " t - | StartsWith "E" t -> conv acc t - | "ZERO" -> Some (0 + acc) - | StartsWith "VINTE" t -> conv (20 + acc) t - | StartsWith "TRINTA" t -> conv (30 + acc) t - | StartsWith "QUARENTA" t -> conv (40 + acc) t - | "DEZ" -> Some (10 + acc) - | "ONZE" -> Some (11 + acc) - | "DOZE" -> Some (12 + acc) - | "TREZE" -> Some (13 + acc) - | "CATORZE" -> Some (14 + acc) - | "QUATORZE" -> Some (14 + acc) - | "QUINZE" -> Some (15 + acc) - | "DEZESSEIS" -> Some (16 + acc) - | "DEZESSETE" -> Some (17 + acc) - | "DEZOITO" -> Some (18 + acc) - | "DEZENOVE" -> Some (19 + acc) - | "UM" -> Some (1 + acc) - | "DOIS" -> Some (2 + acc) - | "TRÊS" -> Some (3 + acc) - | "QUATRO" -> Some (4 + acc) - | "CINCO" -> Some (5 + acc) - | "SEIS" -> Some (6 + acc) - | "SETE" -> Some (7 + acc) - | "OITO" -> Some (8 + acc) - | "NOVE" -> Some (9 + acc) + | "" -> Some acc + | StartsWith " " t + | StartsWith "E" t -> conv acc t + | "ZERO" -> Some (0 + acc) + | StartsWith "VINTE" t -> conv (20 + acc) t + | StartsWith "TRINTA" t -> conv (30 + acc) t + | StartsWith "QUARENTA" t -> conv (40 + acc) t + | StartsWith "CINQUENTA" t -> conv (50 + acc) t + | StartsWith "CINQÜENTA" t -> conv (50 + acc) t + | "DEZ" -> Some (10 + acc) + | "ONZE" -> Some (11 + acc) + | "DOZE" -> Some (12 + acc) + | "TREZE" -> Some (13 + acc) + | "CATORZE" -> Some (14 + acc) + | "QUATORZE" -> Some (14 + acc) + | "QUINZE" -> Some (15 + acc) + | "DEZESSEIS" -> Some (16 + acc) + | "DEZESSETE" -> Some (17 + acc) + | "DEZOITO" -> Some (18 + acc) + | "DEZENOVE" -> Some (19 + acc) + | "UM" -> Some (1 + acc) + | "DOIS" -> Some (2 + acc) + | "TRÊS" -> Some (3 + acc) + | "QUATRO" -> Some (4 + acc) + | "CINCO" -> Some (5 + acc) + | "SEIS" -> Some (6 + acc) + | "SETE" -> Some (7 + acc) + | "OITO" -> Some (8 + acc) + | "NOVE" -> Some (9 + acc) | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") From 149837e13ad1962489c34962b4c250586c8caec7 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 21:59:15 -0300 Subject: [PATCH 09/41] Added sixty --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 2 ++ Numsense/BrazilianPortuguese.fs | 1 + 2 files changed, 3 insertions(+) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 73a1699..30786b9 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -58,6 +58,8 @@ open Swensen.Unquote [] [] [] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 74c62f8..ccb2dc1 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -14,6 +14,7 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "QUARENTA" t -> conv (40 + acc) t | StartsWith "CINQUENTA" t -> conv (50 + acc) t | StartsWith "CINQÜENTA" t -> conv (50 + acc) t + | StartsWith "SESSENTA" t -> conv (60 + acc) t | "DEZ" -> Some (10 + acc) | "ONZE" -> Some (11 + acc) | "DOZE" -> Some (12 + acc) From 44b66a9f28c8a0c9f70d6deee0c2e31061a2c4f1 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 21:59:56 -0300 Subject: [PATCH 10/41] Added seventy --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 2 ++ Numsense/BrazilianPortuguese.fs | 1 + 2 files changed, 3 insertions(+) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 30786b9..71cc1c5 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -60,6 +60,8 @@ open Swensen.Unquote [] [] [] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index ccb2dc1..ab2d40d 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -15,6 +15,7 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "CINQUENTA" t -> conv (50 + acc) t | StartsWith "CINQÜENTA" t -> conv (50 + acc) t | StartsWith "SESSENTA" t -> conv (60 + acc) t + | StartsWith "SETENTA" t -> conv (70 + acc) t | "DEZ" -> Some (10 + acc) | "ONZE" -> Some (11 + acc) | "DOZE" -> Some (12 + acc) From 8784e41ecfa643bb907b0e1edd8ba6463ac4f541 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:00:33 -0300 Subject: [PATCH 11/41] Added eighty --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 2 ++ Numsense/BrazilianPortuguese.fs | 1 + 2 files changed, 3 insertions(+) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 71cc1c5..9cc8585 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -62,6 +62,8 @@ open Swensen.Unquote [] [] [] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index ab2d40d..e012659 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -16,6 +16,7 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "CINQÜENTA" t -> conv (50 + acc) t | StartsWith "SESSENTA" t -> conv (60 + acc) t | StartsWith "SETENTA" t -> conv (70 + acc) t + | StartsWith "OITENTA" t -> conv (80 + acc) t | "DEZ" -> Some (10 + acc) | "ONZE" -> Some (11 + acc) | "DOZE" -> Some (12 + acc) From 6e89a98fce596871873f54e3d793b6cf87c26719 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 09:03:31 -0300 Subject: [PATCH 12/41] Added ninety --- .../BrazilianPortugueseExamples.fs | 122 +++++++++--------- Numsense/BrazilianPortuguese.fs | 1 + 2 files changed, 63 insertions(+), 60 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 9cc8585..e12955c 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,66 +4,68 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index e012659..98830af 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -17,6 +17,7 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "SESSENTA" t -> conv (60 + acc) t | StartsWith "SETENTA" t -> conv (70 + acc) t | StartsWith "OITENTA" t -> conv (80 + acc) t + | StartsWith "NOVENTA" t -> conv (90 + acc) t | "DEZ" -> Some (10 + acc) | "ONZE" -> Some (11 + acc) | "DOZE" -> Some (12 + acc) From f07f6b985866a7744012b23cb3e5f250ff78955e Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:02:47 -0300 Subject: [PATCH 13/41] Added one hundred --- .../BrazilianPortugueseExamples.fs | 3 + Numsense/BrazilianPortuguese.fs | 62 ++++++++++--------- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index e12955c..87a2624 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -66,6 +66,9 @@ open Swensen.Unquote [] [] [] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 98830af..336c77f 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -8,36 +8,38 @@ let internal tryParseBrazilianImp (x : string) = | "" -> Some acc | StartsWith " " t | StartsWith "E" t -> conv acc t - | "ZERO" -> Some (0 + acc) - | StartsWith "VINTE" t -> conv (20 + acc) t - | StartsWith "TRINTA" t -> conv (30 + acc) t - | StartsWith "QUARENTA" t -> conv (40 + acc) t - | StartsWith "CINQUENTA" t -> conv (50 + acc) t - | StartsWith "CINQÜENTA" t -> conv (50 + acc) t - | StartsWith "SESSENTA" t -> conv (60 + acc) t - | StartsWith "SETENTA" t -> conv (70 + acc) t - | StartsWith "OITENTA" t -> conv (80 + acc) t - | StartsWith "NOVENTA" t -> conv (90 + acc) t - | "DEZ" -> Some (10 + acc) - | "ONZE" -> Some (11 + acc) - | "DOZE" -> Some (12 + acc) - | "TREZE" -> Some (13 + acc) - | "CATORZE" -> Some (14 + acc) - | "QUATORZE" -> Some (14 + acc) - | "QUINZE" -> Some (15 + acc) - | "DEZESSEIS" -> Some (16 + acc) - | "DEZESSETE" -> Some (17 + acc) - | "DEZOITO" -> Some (18 + acc) - | "DEZENOVE" -> Some (19 + acc) - | "UM" -> Some (1 + acc) - | "DOIS" -> Some (2 + acc) - | "TRÊS" -> Some (3 + acc) - | "QUATRO" -> Some (4 + acc) - | "CINCO" -> Some (5 + acc) - | "SEIS" -> Some (6 + acc) - | "SETE" -> Some (7 + acc) - | "OITO" -> Some (8 + acc) - | "NOVE" -> Some (9 + acc) + | "ZERO" -> Some (0 + acc) + | StartsWith "CEM" t -> Some (100 + acc) + | StartsWith "CENTO" t -> conv (100 + acc) t + | StartsWith "VINTE" t -> conv (20 + acc) t + | StartsWith "TRINTA" t -> conv (30 + acc) t + | StartsWith "QUARENTA" t -> conv (40 + acc) t + | StartsWith "CINQUENTA" t -> conv (50 + acc) t + | StartsWith "CINQÜENTA" t -> conv (50 + acc) t + | StartsWith "SESSENTA" t -> conv (60 + acc) t + | StartsWith "SETENTA" t -> conv (70 + acc) t + | StartsWith "OITENTA" t -> conv (80 + acc) t + | StartsWith "NOVENTA" t -> conv (90 + acc) t + | "DEZ" -> Some (10 + acc) + | "ONZE" -> Some (11 + acc) + | "DOZE" -> Some (12 + acc) + | "TREZE" -> Some (13 + acc) + | "CATORZE" -> Some (14 + acc) + | "QUATORZE" -> Some (14 + acc) + | "QUINZE" -> Some (15 + acc) + | "DEZESSEIS" -> Some (16 + acc) + | "DEZESSETE" -> Some (17 + acc) + | "DEZOITO" -> Some (18 + acc) + | "DEZENOVE" -> Some (19 + acc) + | "UM" -> Some (1 + acc) + | "DOIS" -> Some (2 + acc) + | "TRÊS" -> Some (3 + acc) + | "QUATRO" -> Some (4 + acc) + | "CINCO" -> Some (5 + acc) + | "SEIS" -> Some (6 + acc) + | "SETE" -> Some (7 + acc) + | "OITO" -> Some (8 + acc) + | "NOVE" -> Some (9 + acc) | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") From e0b5282bcdad4f2df0c73b1ce9e60bf7bf55539b Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:03:37 -0300 Subject: [PATCH 14/41] Added two hundred --- .../BrazilianPortugueseExamples.fs | 132 +++++++++--------- Numsense/BrazilianPortuguese.fs | 1 + 2 files changed, 68 insertions(+), 65 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 87a2624..b080d59 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,71 +4,73 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 336c77f..390f9cb 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -11,6 +11,7 @@ let internal tryParseBrazilianImp (x : string) = | "ZERO" -> Some (0 + acc) | StartsWith "CEM" t -> Some (100 + acc) | StartsWith "CENTO" t -> conv (100 + acc) t + | StartsWith "DUZENTOS" t -> conv (200 + acc) t | StartsWith "VINTE" t -> conv (20 + acc) t | StartsWith "TRINTA" t -> conv (30 + acc) t | StartsWith "QUARENTA" t -> conv (40 + acc) t From e98fbb54724aa762fcbfc8954402cac317aff106 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:04:58 -0300 Subject: [PATCH 15/41] Added three hundred --- .../BrazilianPortugueseExamples.fs | 136 +++++++++--------- Numsense/BrazilianPortuguese.fs | 1 + 2 files changed, 70 insertions(+), 67 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index b080d59..d6e221c 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,73 +4,75 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 390f9cb..062cee2 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -12,6 +12,7 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "CEM" t -> Some (100 + acc) | StartsWith "CENTO" t -> conv (100 + acc) t | StartsWith "DUZENTOS" t -> conv (200 + acc) t + | StartsWith "TREZENTOS" t -> conv (300 + acc) t | StartsWith "VINTE" t -> conv (20 + acc) t | StartsWith "TRINTA" t -> conv (30 + acc) t | StartsWith "QUARENTA" t -> conv (40 + acc) t From 906690a266389511c65b38c00fc04fabe712ca57 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:06:33 -0300 Subject: [PATCH 16/41] Added four hundred --- .../BrazilianPortugueseExamples.fs | 2 + Numsense/BrazilianPortuguese.fs | 75 ++++++++++--------- 2 files changed, 40 insertions(+), 37 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index d6e221c..6aceb1a 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -73,6 +73,8 @@ open Swensen.Unquote [] [] [] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 062cee2..ba11496 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -5,43 +5,44 @@ open Ploeh.Numsense.InternalDsl let internal tryParseBrazilianImp (x : string) = let rec conv acc candidate = match candidate with - | "" -> Some acc - | StartsWith " " t - | StartsWith "E" t -> conv acc t - | "ZERO" -> Some (0 + acc) - | StartsWith "CEM" t -> Some (100 + acc) - | StartsWith "CENTO" t -> conv (100 + acc) t - | StartsWith "DUZENTOS" t -> conv (200 + acc) t - | StartsWith "TREZENTOS" t -> conv (300 + acc) t - | StartsWith "VINTE" t -> conv (20 + acc) t - | StartsWith "TRINTA" t -> conv (30 + acc) t - | StartsWith "QUARENTA" t -> conv (40 + acc) t - | StartsWith "CINQUENTA" t -> conv (50 + acc) t - | StartsWith "CINQÜENTA" t -> conv (50 + acc) t - | StartsWith "SESSENTA" t -> conv (60 + acc) t - | StartsWith "SETENTA" t -> conv (70 + acc) t - | StartsWith "OITENTA" t -> conv (80 + acc) t - | StartsWith "NOVENTA" t -> conv (90 + acc) t - | "DEZ" -> Some (10 + acc) - | "ONZE" -> Some (11 + acc) - | "DOZE" -> Some (12 + acc) - | "TREZE" -> Some (13 + acc) - | "CATORZE" -> Some (14 + acc) - | "QUATORZE" -> Some (14 + acc) - | "QUINZE" -> Some (15 + acc) - | "DEZESSEIS" -> Some (16 + acc) - | "DEZESSETE" -> Some (17 + acc) - | "DEZOITO" -> Some (18 + acc) - | "DEZENOVE" -> Some (19 + acc) - | "UM" -> Some (1 + acc) - | "DOIS" -> Some (2 + acc) - | "TRÊS" -> Some (3 + acc) - | "QUATRO" -> Some (4 + acc) - | "CINCO" -> Some (5 + acc) - | "SEIS" -> Some (6 + acc) - | "SETE" -> Some (7 + acc) - | "OITO" -> Some (8 + acc) - | "NOVE" -> Some (9 + acc) + | "" -> Some acc + | StartsWith " " t + | StartsWith "E" t -> conv acc t + | "ZERO" -> Some (0 + acc) + | StartsWith "CEM" t -> Some (100 + acc) + | StartsWith "CENTO" t -> conv (100 + acc) t + | StartsWith "DUZENTOS" t -> conv (200 + acc) t + | StartsWith "TREZENTOS" t -> conv (300 + acc) t + | StartsWith "QUATROCENTOS" t -> conv (400 + acc) t + | StartsWith "VINTE" t -> conv (20 + acc) t + | StartsWith "TRINTA" t -> conv (30 + acc) t + | StartsWith "QUARENTA" t -> conv (40 + acc) t + | StartsWith "CINQUENTA" t -> conv (50 + acc) t + | StartsWith "CINQÜENTA" t -> conv (50 + acc) t + | StartsWith "SESSENTA" t -> conv (60 + acc) t + | StartsWith "SETENTA" t -> conv (70 + acc) t + | StartsWith "OITENTA" t -> conv (80 + acc) t + | StartsWith "NOVENTA" t -> conv (90 + acc) t + | "DEZ" -> Some (10 + acc) + | "ONZE" -> Some (11 + acc) + | "DOZE" -> Some (12 + acc) + | "TREZE" -> Some (13 + acc) + | "CATORZE" -> Some (14 + acc) + | "QUATORZE" -> Some (14 + acc) + | "QUINZE" -> Some (15 + acc) + | "DEZESSEIS" -> Some (16 + acc) + | "DEZESSETE" -> Some (17 + acc) + | "DEZOITO" -> Some (18 + acc) + | "DEZENOVE" -> Some (19 + acc) + | "UM" -> Some (1 + acc) + | "DOIS" -> Some (2 + acc) + | "TRÊS" -> Some (3 + acc) + | "QUATRO" -> Some (4 + acc) + | "CINCO" -> Some (5 + acc) + | "SEIS" -> Some (6 + acc) + | "SETE" -> Some (7 + acc) + | "OITO" -> Some (8 + acc) + | "NOVE" -> Some (9 + acc) | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") From 0645d7a8dcf4f54f3e3e522c85f9e77f97aaf20e Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:08:49 -0300 Subject: [PATCH 17/41] Added five hundred --- .../BrazilianPortugueseExamples.fs | 144 +++++++++--------- Numsense/BrazilianPortuguese.fs | 1 + 2 files changed, 74 insertions(+), 71 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 6aceb1a..e474078 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,77 +4,79 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index ba11496..f1e3187 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -14,6 +14,7 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "DUZENTOS" t -> conv (200 + acc) t | StartsWith "TREZENTOS" t -> conv (300 + acc) t | StartsWith "QUATROCENTOS" t -> conv (400 + acc) t + | StartsWith "QUINHENTOS" t -> conv (500 + acc) t | StartsWith "VINTE" t -> conv (20 + acc) t | StartsWith "TRINTA" t -> conv (30 + acc) t | StartsWith "QUARENTA" t -> conv (40 + acc) t From 0c3fcc90d217cb85f510375380d99fc6d09c5354 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:09:36 -0300 Subject: [PATCH 18/41] Added six hundred --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 2 ++ Numsense/BrazilianPortuguese.fs | 1 + 2 files changed, 3 insertions(+) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index e474078..881a908 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -77,6 +77,8 @@ open Swensen.Unquote [] [] [] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index f1e3187..5ffa7f3 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -15,6 +15,7 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "TREZENTOS" t -> conv (300 + acc) t | StartsWith "QUATROCENTOS" t -> conv (400 + acc) t | StartsWith "QUINHENTOS" t -> conv (500 + acc) t + | StartsWith "SEISCENTOS" t -> conv (600 + acc) t | StartsWith "VINTE" t -> conv (20 + acc) t | StartsWith "TRINTA" t -> conv (30 + acc) t | StartsWith "QUARENTA" t -> conv (40 + acc) t From 78aeed68505bf1deab04da7fc7f9b3492f013a78 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:11:56 -0300 Subject: [PATCH 19/41] Simplifying four and six hundred --- Numsense/BrazilianPortuguese.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 5ffa7f3..4c4b885 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -39,9 +39,9 @@ let internal tryParseBrazilianImp (x : string) = | "UM" -> Some (1 + acc) | "DOIS" -> Some (2 + acc) | "TRÊS" -> Some (3 + acc) - | "QUATRO" -> Some (4 + acc) + | StartsWith "QUATRO" t -> conv (4 + acc) t | "CINCO" -> Some (5 + acc) - | "SEIS" -> Some (6 + acc) + | StartsWith "SEIS" t -> conv (6 + acc) t | "SETE" -> Some (7 + acc) | "OITO" -> Some (8 + acc) | "NOVE" -> Some (9 + acc) From 8488f9c1824790d1425d6014b222b8254067e25a Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:15:07 -0300 Subject: [PATCH 20/41] Added seven, eight and nine hundred --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 6 ++++++ Numsense/BrazilianPortuguese.fs | 9 ++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 881a908..a56a379 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -79,6 +79,12 @@ open Swensen.Unquote [] [] [] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 4c4b885..94e8ada 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -10,12 +10,11 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "E" t -> conv acc t | "ZERO" -> Some (0 + acc) | StartsWith "CEM" t -> Some (100 + acc) + | StartsWith "CENTOS" t -> conv (100 %* acc) t | StartsWith "CENTO" t -> conv (100 + acc) t | StartsWith "DUZENTOS" t -> conv (200 + acc) t | StartsWith "TREZENTOS" t -> conv (300 + acc) t - | StartsWith "QUATROCENTOS" t -> conv (400 + acc) t | StartsWith "QUINHENTOS" t -> conv (500 + acc) t - | StartsWith "SEISCENTOS" t -> conv (600 + acc) t | StartsWith "VINTE" t -> conv (20 + acc) t | StartsWith "TRINTA" t -> conv (30 + acc) t | StartsWith "QUARENTA" t -> conv (40 + acc) t @@ -42,9 +41,9 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "QUATRO" t -> conv (4 + acc) t | "CINCO" -> Some (5 + acc) | StartsWith "SEIS" t -> conv (6 + acc) t - | "SETE" -> Some (7 + acc) - | "OITO" -> Some (8 + acc) - | "NOVE" -> Some (9 + acc) + | StartsWith "SETE" t -> conv (7 + acc) t + | StartsWith "OITO" t -> conv (8 + acc) t + | StartsWith "NOVE" t -> conv (9 + acc) t | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") From ad14604ce23f04c5874fd262ac28f5d0b8578d38 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:21:07 -0300 Subject: [PATCH 21/41] Added thousand --- .../BrazilianPortugueseExamples.fs | 168 +++++++++--------- Numsense/BrazilianPortuguese.fs | 74 ++++---- 2 files changed, 125 insertions(+), 117 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index a56a379..05a7e64 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,87 +4,93 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 94e8ada..da484cd 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -7,43 +7,45 @@ let internal tryParseBrazilianImp (x : string) = match candidate with | "" -> Some acc | StartsWith " " t + | StartsWith "," t | StartsWith "E" t -> conv acc t - | "ZERO" -> Some (0 + acc) - | StartsWith "CEM" t -> Some (100 + acc) - | StartsWith "CENTOS" t -> conv (100 %* acc) t - | StartsWith "CENTO" t -> conv (100 + acc) t - | StartsWith "DUZENTOS" t -> conv (200 + acc) t - | StartsWith "TREZENTOS" t -> conv (300 + acc) t - | StartsWith "QUINHENTOS" t -> conv (500 + acc) t - | StartsWith "VINTE" t -> conv (20 + acc) t - | StartsWith "TRINTA" t -> conv (30 + acc) t - | StartsWith "QUARENTA" t -> conv (40 + acc) t - | StartsWith "CINQUENTA" t -> conv (50 + acc) t - | StartsWith "CINQÜENTA" t -> conv (50 + acc) t - | StartsWith "SESSENTA" t -> conv (60 + acc) t - | StartsWith "SETENTA" t -> conv (70 + acc) t - | StartsWith "OITENTA" t -> conv (80 + acc) t - | StartsWith "NOVENTA" t -> conv (90 + acc) t - | "DEZ" -> Some (10 + acc) - | "ONZE" -> Some (11 + acc) - | "DOZE" -> Some (12 + acc) - | "TREZE" -> Some (13 + acc) - | "CATORZE" -> Some (14 + acc) - | "QUATORZE" -> Some (14 + acc) - | "QUINZE" -> Some (15 + acc) - | "DEZESSEIS" -> Some (16 + acc) - | "DEZESSETE" -> Some (17 + acc) - | "DEZOITO" -> Some (18 + acc) - | "DEZENOVE" -> Some (19 + acc) - | "UM" -> Some (1 + acc) - | "DOIS" -> Some (2 + acc) - | "TRÊS" -> Some (3 + acc) - | StartsWith "QUATRO" t -> conv (4 + acc) t - | "CINCO" -> Some (5 + acc) - | StartsWith "SEIS" t -> conv (6 + acc) t - | StartsWith "SETE" t -> conv (7 + acc) t - | StartsWith "OITO" t -> conv (8 + acc) t - | StartsWith "NOVE" t -> conv (9 + acc) t + | "ZERO" -> Some (0 + acc) + | StartsWith "MIL" t -> conv (1000 + acc) t + | StartsWith "CEM" t -> Some (100 + acc) + | StartsWith "CENTOS" t -> conv (100 %* acc) t + | StartsWith "CENTO" t -> conv (100 + acc) t + | StartsWith "DUZENTOS" t -> conv (200 + acc) t + | StartsWith "TREZENTOS" t -> conv (300 + acc) t + | StartsWith "QUINHENTOS" t -> conv (500 + acc) t + | StartsWith "VINTE" t -> conv (20 + acc) t + | StartsWith "TRINTA" t -> conv (30 + acc) t + | StartsWith "QUARENTA" t -> conv (40 + acc) t + | StartsWith "CINQUENTA" t -> conv (50 + acc) t + | StartsWith "CINQÜENTA" t -> conv (50 + acc) t + | StartsWith "SESSENTA" t -> conv (60 + acc) t + | StartsWith "SETENTA" t -> conv (70 + acc) t + | StartsWith "OITENTA" t -> conv (80 + acc) t + | StartsWith "NOVENTA" t -> conv (90 + acc) t + | "DEZ" -> Some (10 + acc) + | "ONZE" -> Some (11 + acc) + | "DOZE" -> Some (12 + acc) + | "TREZE" -> Some (13 + acc) + | "CATORZE" -> Some (14 + acc) + | "QUATORZE" -> Some (14 + acc) + | "QUINZE" -> Some (15 + acc) + | "DEZESSEIS" -> Some (16 + acc) + | "DEZESSETE" -> Some (17 + acc) + | "DEZOITO" -> Some (18 + acc) + | "DEZENOVE" -> Some (19 + acc) + | "UM" -> Some (1 + acc) + | "DOIS" -> Some (2 + acc) + | "TRÊS" -> Some (3 + acc) + | StartsWith "QUATRO" t -> conv (4 + acc) t + | "CINCO" -> Some (5 + acc) + | StartsWith "SEIS" t -> conv (6 + acc) t + | StartsWith "SETE" t -> conv (7 + acc) t + | StartsWith "OITO" t -> conv (8 + acc) t + | StartsWith "NOVE" t -> conv (9 + acc) t | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") From 9a088c9762997356842ada60686c7fbabeff6e2c Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:30:54 -0300 Subject: [PATCH 22/41] Added thousands --- .../BrazilianPortugueseExamples.fs | 201 ++++++++++-------- Numsense/BrazilianPortuguese.fs | 34 +-- 2 files changed, 131 insertions(+), 104 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 05a7e64..023bf59 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,93 +4,120 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index da484cd..aef7fcd 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -10,8 +10,8 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "," t | StartsWith "E" t -> conv acc t | "ZERO" -> Some (0 + acc) - | StartsWith "MIL" t -> conv (1000 + acc) t - | StartsWith "CEM" t -> Some (100 + acc) + | StartsWith "MIL" t -> conv (1000 %* acc) t + | StartsWith "CEM" t -> conv (100 + acc) t | StartsWith "CENTOS" t -> conv (100 %* acc) t | StartsWith "CENTO" t -> conv (100 + acc) t | StartsWith "DUZENTOS" t -> conv (200 + acc) t @@ -26,22 +26,22 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "SETENTA" t -> conv (70 + acc) t | StartsWith "OITENTA" t -> conv (80 + acc) t | StartsWith "NOVENTA" t -> conv (90 + acc) t - | "DEZ" -> Some (10 + acc) - | "ONZE" -> Some (11 + acc) - | "DOZE" -> Some (12 + acc) - | "TREZE" -> Some (13 + acc) - | "CATORZE" -> Some (14 + acc) - | "QUATORZE" -> Some (14 + acc) - | "QUINZE" -> Some (15 + acc) - | "DEZESSEIS" -> Some (16 + acc) - | "DEZESSETE" -> Some (17 + acc) - | "DEZOITO" -> Some (18 + acc) - | "DEZENOVE" -> Some (19 + acc) - | "UM" -> Some (1 + acc) - | "DOIS" -> Some (2 + acc) - | "TRÊS" -> Some (3 + acc) + | StartsWith "ONZE" t -> conv (11 + acc) t + | StartsWith "DOZE" t -> conv (12 + acc) t + | StartsWith "TREZE" t -> conv (13 + acc) t + | StartsWith "CATORZE" t -> conv (14 + acc) t + | StartsWith "QUATORZE" t -> conv (14 + acc) t + | StartsWith "QUINZE" t -> conv (15 + acc) t + | StartsWith "DEZESSEIS" t -> conv (16 + acc) t + | StartsWith "DEZESSETE" t -> conv (17 + acc) t + | StartsWith "DEZOITO" t -> conv (18 + acc) t + | StartsWith "DEZENOVE" t -> conv (19 + acc) t + | StartsWith "DEZ" t -> conv (10 + acc) t + | StartsWith "UM" t -> conv (1 + acc) t + | StartsWith "DOIS" t -> conv (2 + acc) t + | StartsWith "TRÊS" t -> conv (3 + acc) t | StartsWith "QUATRO" t -> conv (4 + acc) t - | "CINCO" -> Some (5 + acc) + | StartsWith "CINCO" t -> conv (5 + acc) t | StartsWith "SEIS" t -> conv (6 + acc) t | StartsWith "SETE" t -> conv (7 + acc) t | StartsWith "OITO" t -> conv (8 + acc) t From 0a76e9bfb3e10a968cf30d8b0617730ce2dbd368 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:34:46 -0300 Subject: [PATCH 23/41] Added million --- .../BrazilianPortugueseExamples.fs | 233 +++++++++--------- Numsense/BrazilianPortuguese.fs | 75 +++--- 2 files changed, 157 insertions(+), 151 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 023bf59..1dc4553 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,120 +4,125 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index aef7fcd..0918fc7 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -9,43 +9,44 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith " " t | StartsWith "," t | StartsWith "E" t -> conv acc t - | "ZERO" -> Some (0 + acc) - | StartsWith "MIL" t -> conv (1000 %* acc) t - | StartsWith "CEM" t -> conv (100 + acc) t - | StartsWith "CENTOS" t -> conv (100 %* acc) t - | StartsWith "CENTO" t -> conv (100 + acc) t - | StartsWith "DUZENTOS" t -> conv (200 + acc) t - | StartsWith "TREZENTOS" t -> conv (300 + acc) t - | StartsWith "QUINHENTOS" t -> conv (500 + acc) t - | StartsWith "VINTE" t -> conv (20 + acc) t - | StartsWith "TRINTA" t -> conv (30 + acc) t - | StartsWith "QUARENTA" t -> conv (40 + acc) t - | StartsWith "CINQUENTA" t -> conv (50 + acc) t - | StartsWith "CINQÜENTA" t -> conv (50 + acc) t - | StartsWith "SESSENTA" t -> conv (60 + acc) t - | StartsWith "SETENTA" t -> conv (70 + acc) t - | StartsWith "OITENTA" t -> conv (80 + acc) t - | StartsWith "NOVENTA" t -> conv (90 + acc) t - | StartsWith "ONZE" t -> conv (11 + acc) t - | StartsWith "DOZE" t -> conv (12 + acc) t - | StartsWith "TREZE" t -> conv (13 + acc) t - | StartsWith "CATORZE" t -> conv (14 + acc) t - | StartsWith "QUATORZE" t -> conv (14 + acc) t - | StartsWith "QUINZE" t -> conv (15 + acc) t - | StartsWith "DEZESSEIS" t -> conv (16 + acc) t - | StartsWith "DEZESSETE" t -> conv (17 + acc) t - | StartsWith "DEZOITO" t -> conv (18 + acc) t - | StartsWith "DEZENOVE" t -> conv (19 + acc) t - | StartsWith "DEZ" t -> conv (10 + acc) t - | StartsWith "UM" t -> conv (1 + acc) t - | StartsWith "DOIS" t -> conv (2 + acc) t - | StartsWith "TRÊS" t -> conv (3 + acc) t - | StartsWith "QUATRO" t -> conv (4 + acc) t - | StartsWith "CINCO" t -> conv (5 + acc) t - | StartsWith "SEIS" t -> conv (6 + acc) t - | StartsWith "SETE" t -> conv (7 + acc) t - | StartsWith "OITO" t -> conv (8 + acc) t - | StartsWith "NOVE" t -> conv (9 + acc) t + | "ZERO" -> Some (0 + acc) + | StartsWith "MILHÃO" t -> conv (1000000 %* acc) t + | StartsWith "MIL" t -> conv (1000 %* acc) t + | StartsWith "CEM" t -> conv (100 + acc) t + | StartsWith "CENTOS" t -> conv (100 %* acc) t + | StartsWith "CENTO" t -> conv (100 + acc) t + | StartsWith "DUZENTOS" t -> conv (200 + acc) t + | StartsWith "TREZENTOS" t -> conv (300 + acc) t + | StartsWith "QUINHENTOS" t -> conv (500 + acc) t + | StartsWith "VINTE" t -> conv (20 + acc) t + | StartsWith "TRINTA" t -> conv (30 + acc) t + | StartsWith "QUARENTA" t -> conv (40 + acc) t + | StartsWith "CINQUENTA" t -> conv (50 + acc) t + | StartsWith "CINQÜENTA" t -> conv (50 + acc) t + | StartsWith "SESSENTA" t -> conv (60 + acc) t + | StartsWith "SETENTA" t -> conv (70 + acc) t + | StartsWith "OITENTA" t -> conv (80 + acc) t + | StartsWith "NOVENTA" t -> conv (90 + acc) t + | StartsWith "ONZE" t -> conv (11 + acc) t + | StartsWith "DOZE" t -> conv (12 + acc) t + | StartsWith "TREZE" t -> conv (13 + acc) t + | StartsWith "CATORZE" t -> conv (14 + acc) t + | StartsWith "QUATORZE" t -> conv (14 + acc) t + | StartsWith "QUINZE" t -> conv (15 + acc) t + | StartsWith "DEZESSEIS" t -> conv (16 + acc) t + | StartsWith "DEZESSETE" t -> conv (17 + acc) t + | StartsWith "DEZOITO" t -> conv (18 + acc) t + | StartsWith "DEZENOVE" t -> conv (19 + acc) t + | StartsWith "DEZ" t -> conv (10 + acc) t + | StartsWith "UM" t -> conv (1 + acc) t + | StartsWith "DOIS" t -> conv (2 + acc) t + | StartsWith "TRÊS" t -> conv (3 + acc) t + | StartsWith "QUATRO" t -> conv (4 + acc) t + | StartsWith "CINCO" t -> conv (5 + acc) t + | StartsWith "SEIS" t -> conv (6 + acc) t + | StartsWith "SETE" t -> conv (7 + acc) t + | StartsWith "OITO" t -> conv (8 + acc) t + | StartsWith "NOVE" t -> conv (9 + acc) t | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") From c542cef3ec1344e2789ce16d773187e0475c8553 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Wed, 24 Feb 2016 22:36:54 -0300 Subject: [PATCH 24/41] Added millions --- .../BrazilianPortugueseExamples.fs | 250 +++++++++--------- Numsense/BrazilianPortuguese.fs | 3 +- 2 files changed, 133 insertions(+), 120 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 1dc4553..72d7311 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,125 +4,137 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 0918fc7..d0b1d3b 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -10,7 +10,8 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "," t | StartsWith "E" t -> conv acc t | "ZERO" -> Some (0 + acc) - | StartsWith "MILHÃO" t -> conv (1000000 %* acc) t + | StartsWith "MILHÃO" t + | StartsWith "MILHÕES" t -> conv (1000000 %* acc) t | StartsWith "MIL" t -> conv (1000 %* acc) t | StartsWith "CEM" t -> conv (100 + acc) t | StartsWith "CENTOS" t -> conv (100 %* acc) t From 53f1e0d0583e92ac0bcfc27ff24ba89a728aebe7 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 08:43:35 -0300 Subject: [PATCH 25/41] Added billions --- .../BrazilianPortugueseExamples.fs | 268 +++++++++--------- Numsense/BrazilianPortuguese.fs | 78 ++--- 2 files changed, 177 insertions(+), 169 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 72d7311..322a5e4 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,137 +4,143 @@ open Xunit open Swensen.Unquote [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index d0b1d3b..de66558 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -9,45 +9,47 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith " " t | StartsWith "," t | StartsWith "E" t -> conv acc t - | "ZERO" -> Some (0 + acc) + | "ZERO" -> Some (0 + acc) + | StartsWith "BILHÃO" t + | StartsWith "BILHÕES" t -> conv (1000000000 %* acc) t | StartsWith "MILHÃO" t - | StartsWith "MILHÕES" t -> conv (1000000 %* acc) t - | StartsWith "MIL" t -> conv (1000 %* acc) t - | StartsWith "CEM" t -> conv (100 + acc) t - | StartsWith "CENTOS" t -> conv (100 %* acc) t - | StartsWith "CENTO" t -> conv (100 + acc) t - | StartsWith "DUZENTOS" t -> conv (200 + acc) t - | StartsWith "TREZENTOS" t -> conv (300 + acc) t - | StartsWith "QUINHENTOS" t -> conv (500 + acc) t - | StartsWith "VINTE" t -> conv (20 + acc) t - | StartsWith "TRINTA" t -> conv (30 + acc) t - | StartsWith "QUARENTA" t -> conv (40 + acc) t - | StartsWith "CINQUENTA" t -> conv (50 + acc) t - | StartsWith "CINQÜENTA" t -> conv (50 + acc) t - | StartsWith "SESSENTA" t -> conv (60 + acc) t - | StartsWith "SETENTA" t -> conv (70 + acc) t - | StartsWith "OITENTA" t -> conv (80 + acc) t - | StartsWith "NOVENTA" t -> conv (90 + acc) t - | StartsWith "ONZE" t -> conv (11 + acc) t - | StartsWith "DOZE" t -> conv (12 + acc) t - | StartsWith "TREZE" t -> conv (13 + acc) t - | StartsWith "CATORZE" t -> conv (14 + acc) t - | StartsWith "QUATORZE" t -> conv (14 + acc) t - | StartsWith "QUINZE" t -> conv (15 + acc) t - | StartsWith "DEZESSEIS" t -> conv (16 + acc) t - | StartsWith "DEZESSETE" t -> conv (17 + acc) t - | StartsWith "DEZOITO" t -> conv (18 + acc) t - | StartsWith "DEZENOVE" t -> conv (19 + acc) t - | StartsWith "DEZ" t -> conv (10 + acc) t - | StartsWith "UM" t -> conv (1 + acc) t - | StartsWith "DOIS" t -> conv (2 + acc) t - | StartsWith "TRÊS" t -> conv (3 + acc) t - | StartsWith "QUATRO" t -> conv (4 + acc) t - | StartsWith "CINCO" t -> conv (5 + acc) t - | StartsWith "SEIS" t -> conv (6 + acc) t - | StartsWith "SETE" t -> conv (7 + acc) t - | StartsWith "OITO" t -> conv (8 + acc) t - | StartsWith "NOVE" t -> conv (9 + acc) t + | StartsWith "MILHÕES" t -> conv (1000000 %* acc) t + | StartsWith "MIL" t -> conv (1000 %* acc) t + | StartsWith "CEM" t -> conv (100 + acc) t + | StartsWith "CENTOS" t -> conv (100 %* acc) t + | StartsWith "CENTO" t -> conv (100 + acc) t + | StartsWith "DUZENTOS" t -> conv (200 + acc) t + | StartsWith "TREZENTOS" t -> conv (300 + acc) t + | StartsWith "QUINHENTOS" t -> conv (500 + acc) t + | StartsWith "VINTE" t -> conv (20 + acc) t + | StartsWith "TRINTA" t -> conv (30 + acc) t + | StartsWith "QUARENTA" t -> conv (40 + acc) t + | StartsWith "CINQUENTA" t -> conv (50 + acc) t + | StartsWith "CINQÜENTA" t -> conv (50 + acc) t + | StartsWith "SESSENTA" t -> conv (60 + acc) t + | StartsWith "SETENTA" t -> conv (70 + acc) t + | StartsWith "OITENTA" t -> conv (80 + acc) t + | StartsWith "NOVENTA" t -> conv (90 + acc) t + | StartsWith "ONZE" t -> conv (11 + acc) t + | StartsWith "DOZE" t -> conv (12 + acc) t + | StartsWith "TREZE" t -> conv (13 + acc) t + | StartsWith "CATORZE" t -> conv (14 + acc) t + | StartsWith "QUATORZE" t -> conv (14 + acc) t + | StartsWith "QUINZE" t -> conv (15 + acc) t + | StartsWith "DEZESSEIS" t -> conv (16 + acc) t + | StartsWith "DEZESSETE" t -> conv (17 + acc) t + | StartsWith "DEZOITO" t -> conv (18 + acc) t + | StartsWith "DEZENOVE" t -> conv (19 + acc) t + | StartsWith "DEZ" t -> conv (10 + acc) t + | StartsWith "UM" t -> conv (1 + acc) t + | StartsWith "DOIS" t -> conv (2 + acc) t + | StartsWith "TRÊS" t -> conv (3 + acc) t + | StartsWith "QUATRO" t -> conv (4 + acc) t + | StartsWith "CINCO" t -> conv (5 + acc) t + | StartsWith "SEIS" t -> conv (6 + acc) t + | StartsWith "SETE" t -> conv (7 + acc) t + | StartsWith "OITO" t -> conv (8 + acc) t + | StartsWith "NOVE" t -> conv (9 + acc) t | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") From 572f4c06f0a95556c6f92710763a1948fe25fc6a Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 10:16:30 -0300 Subject: [PATCH 26/41] Added a single toBrazilian example --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 6 ++++++ Numsense/BrazilianPortuguese.fs | 5 +++++ Numsense/Numeral.fs | 1 + 3 files changed, 12 insertions(+) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 322a5e4..309af9a 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -144,3 +144,9 @@ open Swensen.Unquote let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let actual = Numeral.tryParseBrazilian portuguese Some expected =! actual + +[] +[] +let ``toBrazilian returns correct result`` (i, expected) = + let actual = Numeral.toBrazilian i + expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index de66558..5312337 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -2,6 +2,11 @@ open Ploeh.Numsense.InternalDsl +let internal toBrazilianImp x = + match x with + | 0 -> "zero" + | _ -> "" + let internal tryParseBrazilianImp (x : string) = let rec conv acc candidate = match candidate with diff --git a/Numsense/Numeral.fs b/Numsense/Numeral.fs index cae6052..603c402 100644 --- a/Numsense/Numeral.fs +++ b/Numsense/Numeral.fs @@ -41,3 +41,4 @@ let toPortuguese = Portuguese.toPortugueseImp let tryParsePortuguese = Portuguese.tryParsePortugueseImp let tryParseBrazilian = BrazilianPortuguese.tryParseBrazilianImp +let toBrazilian = BrazilianPortuguese.toBrazilianImp From 0443edffb8aa2d49e5195e99660828f9b1bbc754 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 10:21:59 -0300 Subject: [PATCH 27/41] Added one to twenty --- .../BrazilianPortugueseExamples.fs | 22 ++++++++++++++++- Numsense/BrazilianPortuguese.fs | 24 +++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 309af9a..b7b1dc6 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -146,7 +146,27 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = Some expected =! actual [] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``toBrazilian returns correct result`` (i, expected) = let actual = Numeral.toBrazilian i expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 5312337..57e9df9 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -4,8 +4,28 @@ open Ploeh.Numsense.InternalDsl let internal toBrazilianImp x = match x with - | 0 -> "zero" - | _ -> "" + | 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" + | _ -> "" let internal tryParseBrazilianImp (x : string) = let rec conv acc candidate = From 20b1bf1a2444b624f67715500c057ab404c83535 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 11:02:46 -0300 Subject: [PATCH 28/41] Added twenty --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 2 ++ Numsense/BrazilianPortuguese.fs | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index b7b1dc6..85ac609 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -167,6 +167,8 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = [] [] [] +[] +[] let ``toBrazilian returns correct result`` (i, expected) = let actual = Numeral.toBrazilian i expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 57e9df9..f33444f 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -2,7 +2,13 @@ open Ploeh.Numsense.InternalDsl -let internal toBrazilianImp x = +let rec internal toBrazilianImp x = + let format prefix factor x = + let remainder = x % factor + if remainder = 0 + then prefix + else sprintf "%s e %s" prefix <| toBrazilianImp remainder + match x with | 0 -> "zero" | 1 -> "um" @@ -24,7 +30,7 @@ let internal toBrazilianImp x = | 17 -> "dezessete" | 18 -> "dezoito" | 19 -> "dezenove" - | 20 -> "vinte" + | Between 20 30 x -> format "vinte" 10 x | _ -> "" let internal tryParseBrazilianImp (x : string) = From 26db7a98fa39e173bfa68fcb77b4859244d7c8d6 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 11:06:43 -0300 Subject: [PATCH 29/41] Added thirty to ninety --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 14 ++++++++++++++ Numsense/BrazilianPortuguese.fs | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 85ac609..6d9c745 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -169,6 +169,20 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = [] [] [] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``toBrazilian returns correct result`` (i, expected) = let actual = Numeral.toBrazilian i expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index f33444f..9a11e0a 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -31,6 +31,13 @@ let rec internal toBrazilianImp x = | 18 -> "dezoito" | 19 -> "dezenove" | Between 20 30 x -> format "vinte" 10 x + | Between 30 40 x -> format "trinta" 10 x + | Between 40 50 x -> format "quarenta" 10 x + | Between 50 60 x -> format "cinquenta" 10 x + | Between 60 70 x -> format "sessenta" 10 x + | Between 70 80 x -> format "setenta" 10 x + | Between 80 90 x -> format "oitenta" 10 x + | Between 90 100 x -> format "noventa" 10 x | _ -> "" let internal tryParseBrazilianImp (x : string) = From 3f96eaed6d73aefe8cbbe129b1036544da0773e1 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 11:09:29 -0300 Subject: [PATCH 30/41] Added one hundred --- .../BrazilianPortugueseExamples.fs | 79 ++++++++++--------- Numsense/BrazilianPortuguese.fs | 2 + 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 6d9c745..b061b76 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -146,43 +146,48 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = Some expected =! actual [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``toBrazilian returns correct result`` (i, expected) = let actual = Numeral.toBrazilian i expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 9a11e0a..cb3cb41 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -38,6 +38,8 @@ let rec internal toBrazilianImp x = | Between 70 80 x -> format "setenta" 10 x | Between 80 90 x -> format "oitenta" 10 x | Between 90 100 x -> format "noventa" 10 x + | 100 -> "cem" + | Between 100 200 x -> format "cento" 100 x | _ -> "" let internal tryParseBrazilianImp (x : string) = From 862992f18ff936d7e9edcb3a307b8f7dce880001 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 11:23:35 -0300 Subject: [PATCH 31/41] Added hundreds --- .../BrazilianPortugueseExamples.fs | 9 ++++++ Numsense/BrazilianPortuguese.fs | 28 ++++++++++++------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index b061b76..8b80669 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -188,6 +188,15 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = [] [] [] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``toBrazilian returns correct result`` (i, expected) = let actual = Numeral.toBrazilian i expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index cb3cb41..eed6052 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -3,12 +3,16 @@ open Ploeh.Numsense.InternalDsl let rec internal toBrazilianImp x = - let format prefix factor x = + let formatPrefix prefix factor x = let remainder = x % factor if remainder = 0 then prefix else sprintf "%s e %s" prefix <| toBrazilianImp remainder + let formatSuffix suffix factor x = + let prefix = sprintf "%s%s" (toBrazilianImp (x / factor)) suffix + formatPrefix prefix factor x + match x with | 0 -> "zero" | 1 -> "um" @@ -30,16 +34,20 @@ let rec internal toBrazilianImp x = | 17 -> "dezessete" | 18 -> "dezoito" | 19 -> "dezenove" - | Between 20 30 x -> format "vinte" 10 x - | Between 30 40 x -> format "trinta" 10 x - | Between 40 50 x -> format "quarenta" 10 x - | Between 50 60 x -> format "cinquenta" 10 x - | Between 60 70 x -> format "sessenta" 10 x - | Between 70 80 x -> format "setenta" 10 x - | Between 80 90 x -> format "oitenta" 10 x - | Between 90 100 x -> format "noventa" 10 x + | Between 20 30 x -> formatPrefix "vinte" 10 x + | Between 30 40 x -> formatPrefix "trinta" 10 x + | Between 40 50 x -> formatPrefix "quarenta" 10 x + | Between 50 60 x -> formatPrefix "cinquenta" 10 x + | Between 60 70 x -> formatPrefix "sessenta" 10 x + | Between 70 80 x -> formatPrefix "setenta" 10 x + | Between 80 90 x -> formatPrefix "oitenta" 10 x + | Between 90 100 x -> formatPrefix "noventa" 10 x | 100 -> "cem" - | Between 100 200 x -> format "cento" 100 x + | Between 100 200 x -> formatPrefix "cento" 100 x + | Between 200 300 x -> formatPrefix "duzentos" 100 x + | Between 300 400 x -> formatPrefix "trezentos" 100 x + | Between 500 600 x -> formatPrefix "quinhentos" 100 x + | Between 400 1000 x -> formatSuffix "centos" 100 x | _ -> "" let internal tryParseBrazilianImp (x : string) = From 0155082fd35337ead9f033a90f8d1882ce895178 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 11:29:38 -0300 Subject: [PATCH 32/41] Added thousands --- .../BrazilianPortugueseExamples.fs | 109 ++++++++++-------- Numsense/BrazilianPortuguese.fs | 2 + 2 files changed, 60 insertions(+), 51 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 8b80669..b31d627 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -146,57 +146,64 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = Some expected =! actual [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``toBrazilian returns correct result`` (i, expected) = let actual = Numeral.toBrazilian i expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index eed6052..c08f453 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -48,6 +48,8 @@ let rec internal toBrazilianImp x = | Between 300 400 x -> formatPrefix "trezentos" 100 x | Between 500 600 x -> formatPrefix "quinhentos" 100 x | Between 400 1000 x -> formatSuffix "centos" 100 x + | Between 1000 2000 x -> formatPrefix "mil" 1000 x + | Between 1000 1000000 x -> formatSuffix " mil" 1000 x | _ -> "" let internal tryParseBrazilianImp (x : string) = From 505f53b8eb938161b46d6052470bb190b236c3c0 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 11:37:49 -0300 Subject: [PATCH 33/41] Added rule that hundreds and thousands have comma inbetween --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 4 ++++ Numsense/BrazilianPortuguese.fs | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index b31d627..e89431e 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -201,6 +201,10 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = [] [] [] +[] +[] +[] +[] [] [] [] diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index c08f453..1081546 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -7,7 +7,10 @@ let rec internal toBrazilianImp x = let remainder = x % factor if remainder = 0 then prefix - else sprintf "%s e %s" prefix <| toBrazilianImp remainder + else if remainder > 100 then + sprintf "%s, %s" prefix <| toBrazilianImp remainder + else + sprintf "%s e %s" prefix <| toBrazilianImp remainder let formatSuffix suffix factor x = let prefix = sprintf "%s%s" (toBrazilianImp (x / factor)) suffix From a4a2ffd7772afa8254f7f869a89b26254c7600df Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 11:44:19 -0300 Subject: [PATCH 34/41] Added rule that hundreds and thousands have "and" inbetween when the hundreds have no tens or units --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 4 ++++ Numsense/BrazilianPortuguese.fs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index e89431e..d67f4dc 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -202,12 +202,16 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = [] [] [] +[] [] [] [] [] [] +[] +[] [] +[] let ``toBrazilian returns correct result`` (i, expected) = let actual = Numeral.toBrazilian i expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 1081546..369057e 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -7,7 +7,7 @@ let rec internal toBrazilianImp x = let remainder = x % factor if remainder = 0 then prefix - else if remainder > 100 then + else if remainder > 100 && x % 100 <> 0 then sprintf "%s, %s" prefix <| toBrazilianImp remainder else sprintf "%s e %s" prefix <| toBrazilianImp remainder From 9060dd8c7e7799df61ca0f820e1d5f7f44cabec0 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 16:23:52 -0300 Subject: [PATCH 35/41] Added millions --- .../BrazilianPortugueseExamples.fs | 162 +++++++++++------- Numsense/BrazilianPortuguese.fs | 11 +- 2 files changed, 106 insertions(+), 67 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index d67f4dc..a485176 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -146,72 +146,102 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = Some expected =! actual [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``toBrazilian returns correct result`` (i, expected) = let actual = Numeral.toBrazilian i expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 369057e..2e88ccb 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -7,7 +7,14 @@ let rec internal toBrazilianImp x = let remainder = x % factor if remainder = 0 then prefix - else if remainder > 100 && x % 100 <> 0 then + else + + let r = + if remainder > 1000 + then remainder / 1000 + else remainder + + if r > 100 && r % 100 <> 0 then sprintf "%s, %s" prefix <| toBrazilianImp remainder else sprintf "%s e %s" prefix <| toBrazilianImp remainder @@ -53,6 +60,8 @@ let rec internal toBrazilianImp x = | Between 400 1000 x -> formatSuffix "centos" 100 x | Between 1000 2000 x -> formatPrefix "mil" 1000 x | Between 1000 1000000 x -> formatSuffix " mil" 1000 x + | Between 1000000 2000000 x -> formatPrefix "um milhão" 1000000 x + | Between 2000000 1000000000 x -> formatSuffix " milhões" 1000000 x | _ -> "" let internal tryParseBrazilianImp (x : string) = From d5694a3220a52abbe572b091e5689d2cf9f2f541 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 16:53:04 -0300 Subject: [PATCH 36/41] Added billions --- .../BrazilianPortugueseExamples.fs | 203 +++++++++--------- Numsense/BrazilianPortuguese.fs | 12 +- 2 files changed, 114 insertions(+), 101 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index a485176..069ccb7 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -146,102 +146,113 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = Some expected =! actual [] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] -[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] let ``toBrazilian returns correct result`` (i, expected) = let actual = Numeral.toBrazilian i expected =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 2e88ccb..d5d0dc1 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -9,11 +9,12 @@ let rec internal toBrazilianImp x = then prefix else - let r = - if remainder > 1000 - then remainder / 1000 - else remainder + let rec hundreds x = + if x > 1000 + then hundreds (x / 1000) + else x + let r = hundreds remainder if r > 100 && r % 100 <> 0 then sprintf "%s, %s" prefix <| toBrazilianImp remainder else @@ -62,7 +63,8 @@ let rec internal toBrazilianImp x = | Between 1000 1000000 x -> formatSuffix " mil" 1000 x | Between 1000000 2000000 x -> formatPrefix "um milhão" 1000000 x | Between 2000000 1000000000 x -> formatSuffix " milhões" 1000000 x - | _ -> "" + | Between 1000000000 2000000000 x -> formatPrefix "um bilhão" 1000000000 x + | _ -> formatSuffix " bilhões" 1000000000 x let internal tryParseBrazilianImp (x : string) = let rec conv acc candidate = From 9fd13a092589da804032e423e212be6fd9b7abfe Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 17:01:39 -0300 Subject: [PATCH 37/41] Cleaning up --- Numsense/BrazilianPortuguese.fs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index d5d0dc1..000f227 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -5,20 +5,17 @@ open Ploeh.Numsense.InternalDsl let rec internal toBrazilianImp x = let formatPrefix prefix factor x = let remainder = x % factor - if remainder = 0 - then prefix - else let rec hundreds x = if x > 1000 then hundreds (x / 1000) else x - let r = hundreds remainder - if r > 100 && r % 100 <> 0 then - sprintf "%s, %s" prefix <| toBrazilianImp remainder - else - sprintf "%s e %s" prefix <| toBrazilianImp remainder + match remainder, hundreds remainder with + | 0, _ -> prefix + | _, r when r > 100 && r % 100 <> 0 -> + sprintf "%s, %s" prefix <| toBrazilianImp remainder + | _ -> sprintf "%s e %s" prefix <| toBrazilianImp remainder let formatSuffix suffix factor x = let prefix = sprintf "%s%s" (toBrazilianImp (x / factor)) suffix From d036ce5526e4688452f5d5a237171f96f50bc670 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 18:23:21 -0300 Subject: [PATCH 38/41] Added minus --- Numsense.UnitTests/BrazilianPortugueseExamples.fs | 4 ++++ Numsense.UnitTests/NumeralProperties.fs | 15 +++++++++++++++ Numsense/BrazilianPortuguese.fs | 5 ++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 069ccb7..079632b 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -4,6 +4,8 @@ open Xunit open Swensen.Unquote [] +[] +[] [] [] [] @@ -146,6 +148,8 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = Some expected =! actual [] +[] +[] [] [] [] diff --git a/Numsense.UnitTests/NumeralProperties.fs b/Numsense.UnitTests/NumeralProperties.fs index d176158..38ce9e6 100644 --- a/Numsense.UnitTests/NumeralProperties.fs +++ b/Numsense.UnitTests/NumeralProperties.fs @@ -200,3 +200,18 @@ let ``negative German is the inverse of positive German`` x = sprintf "minus-%s" (Numeral.toGerman x) =! actualGerman Some -x =! actualInteger + +[] +let ``tryParseBrazilian is the inverse of toBrazilian`` x = + test <@ Some x = (x |> Numeral.toBrazilian |> Numeral.tryParseBrazilian) @> + +[] +let ``negative Brazilian is the inverse of positive Brazilian`` x = + x <> 0 ==> lazy + let x = abs x + + let actualBrazilian = Numeral.toBrazilian -x + let actualInteger = Numeral.tryParseBrazilian actualBrazilian + + sprintf "menos %s" (Numeral.toBrazilian x) =! actualBrazilian + Some -x =! actualInteger diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 000f227..6c99a7b 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -22,6 +22,7 @@ let rec internal toBrazilianImp x = formatPrefix prefix factor x match x with + | x when x < 0 -> sprintf "menos %s" <| toBrazilianImp -x | 0 -> "zero" | 1 -> "um" | 2 -> "dois" @@ -114,4 +115,6 @@ let internal tryParseBrazilianImp (x : string) = | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") - conv 0 canonicalized + match canonicalized with + | StartsWith "MENOS" t -> conv 0 t |> Option.map (~-) + | _ -> conv 0 canonicalized From 25334125eca61a9116dfc3973669d807d58546ab Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Thu, 25 Feb 2016 18:26:59 -0300 Subject: [PATCH 39/41] Added BrazilianNumeralConverter --- Numsense.UnitTests.CSharp/NumeralTests.cs | 15 +++++++++++++++ Numsense/ObjectOriented.fs | 7 +++++++ 2 files changed, 22 insertions(+) diff --git a/Numsense.UnitTests.CSharp/NumeralTests.cs b/Numsense.UnitTests.CSharp/NumeralTests.cs index b8cb841..7d3acd7 100644 --- a/Numsense.UnitTests.CSharp/NumeralTests.cs +++ b/Numsense.UnitTests.CSharp/NumeralTests.cs @@ -199,5 +199,20 @@ public void GermanIsSingleton() var actual = Numeral.German; Assert.Same(expected, actual); } + + [Fact] + public void BrazilianIsCorrect() + { + var actual = Numeral.Brazilian; + Assert.IsAssignableFrom(actual); + } + + [Fact] + public void BrazilianIsSingleton() + { + var expected = Numeral.Brazilian; + var actual = Numeral.Brazilian; + Assert.Same(expected, actual); + } } } diff --git a/Numsense/ObjectOriented.fs b/Numsense/ObjectOriented.fs index 337e403..7b41e18 100644 --- a/Numsense/ObjectOriented.fs +++ b/Numsense/ObjectOriented.fs @@ -92,6 +92,12 @@ type PortugueseNumeralConverter () = member this.TryParse (s, result) = Helper.tryParse Numeral.tryParsePortuguese (s, &result) +type BrazilianNumeralConverter () = + interface INumeralConverter with + member this.ToNumeral number = Numeral.toBrazilian number + member this.TryParse (s, result) = + Helper.tryParse Numeral.tryParseBrazilian (s, &result) + type Numeral private () = static member val Bulgarian = BulgarianNumeralConverter () :> INumeralConverter static member val English = EnglishNumeralConverter () :> INumeralConverter @@ -106,3 +112,4 @@ type Numeral private () = static member val Romanian = RomanianNumeralConverter () :> INumeralConverter static member val German = GermanNumeralConverter () :> INumeralConverter static member val Portuguese = PortugueseNumeralConverter () :> INumeralConverter + static member val Brazilian = BrazilianNumeralConverter () :> INumeralConverter \ No newline at end of file From 5e539f5f093130c33b48b552342775b95c2c3f48 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Mon, 29 Feb 2016 18:42:10 -0300 Subject: [PATCH 40/41] Added examples that should not be parsed --- .../BrazilianPortugueseExamples.fs | 40 ++++++++ Numsense/BrazilianPortuguese.fs | 92 +++++++++++-------- 2 files changed, 94 insertions(+), 38 deletions(-) diff --git a/Numsense.UnitTests/BrazilianPortugueseExamples.fs b/Numsense.UnitTests/BrazilianPortugueseExamples.fs index 079632b..4eacf2c 100644 --- a/Numsense.UnitTests/BrazilianPortugueseExamples.fs +++ b/Numsense.UnitTests/BrazilianPortugueseExamples.fs @@ -260,3 +260,43 @@ let ``tryParseBrazilian returns correct result`` (portuguese, expected) = let ``toBrazilian returns correct result`` (i, expected) = let actual = Numeral.toBrazilian i expected =! actual + +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +[] +let ``tryParseBrazilian with incorrect input returns correct result`` (portuguese) = + let actual = Numeral.tryParseBrazilian portuguese + None =! actual diff --git a/Numsense/BrazilianPortuguese.fs b/Numsense/BrazilianPortuguese.fs index 6c99a7b..4cad088 100644 --- a/Numsense/BrazilianPortuguese.fs +++ b/Numsense/BrazilianPortuguese.fs @@ -66,6 +66,22 @@ let rec internal toBrazilianImp x = let internal tryParseBrazilianImp (x : string) = let rec conv acc candidate = + let conv' remainderFactor placeFactor acc' candidate = + if (acc % remainderFactor) / placeFactor <> 0 + then None + else conv acc' candidate + + let convBillions acc' candidate = + if acc / 1000000000 <> 0 + then None + else conv acc' candidate + + let convMillions = conv' 1000000000 1000000 + let convThousands = conv' 1000000 1000 + let convHundreds = conv' 1000 100 + let convTens = conv' 100 10 + let convUnits = conv' 10 1 + match candidate with | "" -> Some acc | StartsWith " " t @@ -73,45 +89,45 @@ let internal tryParseBrazilianImp (x : string) = | StartsWith "E" t -> conv acc t | "ZERO" -> Some (0 + acc) | StartsWith "BILHÃO" t - | StartsWith "BILHÕES" t -> conv (1000000000 %* acc) t + | StartsWith "BILHÕES" t -> convBillions (1000000000 %* acc) t | StartsWith "MILHÃO" t - | StartsWith "MILHÕES" t -> conv (1000000 %* acc) t - | StartsWith "MIL" t -> conv (1000 %* acc) t - | StartsWith "CEM" t -> conv (100 + acc) t - | StartsWith "CENTOS" t -> conv (100 %* acc) t - | StartsWith "CENTO" t -> conv (100 + acc) t - | StartsWith "DUZENTOS" t -> conv (200 + acc) t - | StartsWith "TREZENTOS" t -> conv (300 + acc) t - | StartsWith "QUINHENTOS" t -> conv (500 + acc) t - | StartsWith "VINTE" t -> conv (20 + acc) t - | StartsWith "TRINTA" t -> conv (30 + acc) t - | StartsWith "QUARENTA" t -> conv (40 + acc) t - | StartsWith "CINQUENTA" t -> conv (50 + acc) t - | StartsWith "CINQÜENTA" t -> conv (50 + acc) t - | StartsWith "SESSENTA" t -> conv (60 + acc) t - | StartsWith "SETENTA" t -> conv (70 + acc) t - | StartsWith "OITENTA" t -> conv (80 + acc) t - | StartsWith "NOVENTA" t -> conv (90 + acc) t - | StartsWith "ONZE" t -> conv (11 + acc) t - | StartsWith "DOZE" t -> conv (12 + acc) t - | StartsWith "TREZE" t -> conv (13 + acc) t - | StartsWith "CATORZE" t -> conv (14 + acc) t - | StartsWith "QUATORZE" t -> conv (14 + acc) t - | StartsWith "QUINZE" t -> conv (15 + acc) t - | StartsWith "DEZESSEIS" t -> conv (16 + acc) t - | StartsWith "DEZESSETE" t -> conv (17 + acc) t - | StartsWith "DEZOITO" t -> conv (18 + acc) t - | StartsWith "DEZENOVE" t -> conv (19 + acc) t - | StartsWith "DEZ" t -> conv (10 + acc) t - | StartsWith "UM" t -> conv (1 + acc) t - | StartsWith "DOIS" t -> conv (2 + acc) t - | StartsWith "TRÊS" t -> conv (3 + acc) t - | StartsWith "QUATRO" t -> conv (4 + acc) t - | StartsWith "CINCO" t -> conv (5 + acc) t - | StartsWith "SEIS" t -> conv (6 + acc) t - | StartsWith "SETE" t -> conv (7 + acc) t - | StartsWith "OITO" t -> conv (8 + acc) t - | StartsWith "NOVE" t -> conv (9 + acc) t + | StartsWith "MILHÕES" t -> convMillions (1000000 %* acc) t + | StartsWith "MIL" t -> convThousands (1000 %* acc) t + | StartsWith "CEM" t -> convHundreds (100 + acc) t + | StartsWith "CENTOS" t -> convHundreds (100 %* acc) t + | StartsWith "CENTO" t -> convHundreds (100 + acc) t + | StartsWith "DUZENTOS" t -> convHundreds (200 + acc) t + | StartsWith "TREZENTOS" t -> convHundreds (300 + acc) t + | StartsWith "QUINHENTOS" t -> convHundreds (500 + acc) t + | StartsWith "VINTE" t -> convTens (20 + acc) t + | StartsWith "TRINTA" t -> convTens (30 + acc) t + | StartsWith "QUARENTA" t -> convTens (40 + acc) t + | StartsWith "CINQUENTA" t -> convTens (50 + acc) t + | StartsWith "CINQÜENTA" t -> convTens (50 + acc) t + | StartsWith "SESSENTA" t -> convTens (60 + acc) t + | StartsWith "SETENTA" t -> convTens (70 + acc) t + | StartsWith "OITENTA" t -> convTens (80 + acc) t + | StartsWith "NOVENTA" t -> convTens (90 + acc) t + | StartsWith "ONZE" t -> convTens (11 + acc) t + | StartsWith "DOZE" t -> convTens (12 + acc) t + | StartsWith "TREZE" t -> convTens (13 + acc) t + | StartsWith "CATORZE" t -> convTens (14 + acc) t + | StartsWith "QUATORZE" t -> convTens (14 + acc) t + | StartsWith "QUINZE" t -> convTens (15 + acc) t + | StartsWith "DEZESSEIS" t -> convTens (16 + acc) t + | StartsWith "DEZESSETE" t -> convTens (17 + acc) t + | StartsWith "DEZOITO" t -> convTens (18 + acc) t + | StartsWith "DEZENOVE" t -> convTens (19 + acc) t + | StartsWith "DEZ" t -> convTens (10 + acc) t + | StartsWith "UM" t -> convUnits (1 + acc) t + | StartsWith "DOIS" t -> convUnits (2 + acc) t + | StartsWith "TRÊS" t -> convUnits (3 + acc) t + | StartsWith "QUATRO" t -> convUnits (4 + acc) t + | StartsWith "CINCO" t -> convUnits (5 + acc) t + | StartsWith "SEIS" t -> convUnits (6 + acc) t + | StartsWith "SETE" t -> convUnits (7 + acc) t + | StartsWith "OITO" t -> convUnits (8 + acc) t + | StartsWith "NOVE" t -> convUnits (9 + acc) t | _ -> None let canonicalized = x.Trim().ToUpper(System.Globalization.CultureInfo "pt-BR") From 3eaec0ea68e8d8bbcea5f0bed6dd335a5b0df377 Mon Sep 17 00:00:00 2001 From: Marcio Rinaldi Date: Mon, 29 Feb 2016 20:41:47 -0300 Subject: [PATCH 41/41] Tests Numeral Converter properties against Brazilian Portuguese --- Numsense.UnitTests.CSharp/NumeralConverterProperties.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Numsense.UnitTests.CSharp/NumeralConverterProperties.cs b/Numsense.UnitTests.CSharp/NumeralConverterProperties.cs index 015d9c1..8eef203 100644 --- a/Numsense.UnitTests.CSharp/NumeralConverterProperties.cs +++ b/Numsense.UnitTests.CSharp/NumeralConverterProperties.cs @@ -111,7 +111,11 @@ public static Arbitrary Converter() new ConverterPropertyGroup( new GermanNumeralConverter(), NumeralModule.toGerman, - NumeralModule.tryParseGerman) + NumeralModule.tryParseGerman), + new ConverterPropertyGroup( + new BrazilianNumeralConverter(), + NumeralModule.toBrazilian, + NumeralModule.tryParseBrazilian) ) .ToArbitrary(); }