From d9c7f5d2ab546d839d2af30ada892d2ccd9f5e2d Mon Sep 17 00:00:00 2001 From: Julia Glaszka Date: Fri, 5 Jan 2024 15:13:29 +0100 Subject: [PATCH 1/4] bugfix for spanish numerals + nouns --- .../tradukisto/internal/Container.java | 13 +++++-- .../BigDecimalToBankingMoneyConverter.java | 2 +- ...nishBigDecimalToBankingMoneyConverter.java | 36 +++++++++++++++++++ .../languages/spanish/SpanishValues.java | 1 + .../spanish/SpanishValuesTest.groovy | 23 +++++++++++- 5 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishBigDecimalToBankingMoneyConverter.java diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java b/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java index d9bf4566..70fe89d1 100644 --- a/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java @@ -42,6 +42,7 @@ import pl.allegro.finance.tradukisto.internal.languages.slovak.SlovakValuesForSmallNumbers; import pl.allegro.finance.tradukisto.internal.languages.slovene.SloveneThousandToWordsConverter; import pl.allegro.finance.tradukisto.internal.languages.slovene.SloveneValues; +import pl.allegro.finance.tradukisto.internal.languages.spanish.SpanishBigDecimalToBankingMoneyConverter; import pl.allegro.finance.tradukisto.internal.languages.spanish.SpanishIntegerToWordsConverter; import pl.allegro.finance.tradukisto.internal.languages.spanish.SpanishIntegerToWordsConverterAdapter; import pl.allegro.finance.tradukisto.internal.languages.spanish.SpanishThousandToWordsConverter; @@ -54,6 +55,8 @@ import pl.allegro.finance.tradukisto.internal.languages.turkish.TurkishValues; import pl.allegro.finance.tradukisto.internal.languages.ukrainian.UkrainianValues; +import java.util.Collections; + public final class Container { public static Container polishContainer() { @@ -297,8 +300,14 @@ public static Container spanishContainer() { spanishThousandToWordsConverter ); - BigDecimalToStringConverter bigDecimalBankingMoneyValueConverter = new BigDecimalToBankingMoneyConverter( - converter, + IntegerToStringConverter converterForMoney = new SpanishIntegerToWordsConverter( + new SpanishIntegerToWordsConverterAdapter(spanishThousandToWordsConverter, values.pluralForms()), + Collections.singletonMap(1,new MultiFormNumber("un", "xd")), + spanishThousandToWordsConverter + ); + + BigDecimalToStringConverter bigDecimalBankingMoneyValueConverter = new SpanishBigDecimalToBankingMoneyConverter( + converterForMoney, values.currency() ); diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/converters/BigDecimalToBankingMoneyConverter.java b/src/main/java/pl/allegro/finance/tradukisto/internal/converters/BigDecimalToBankingMoneyConverter.java index 9556cd05..66c88456 100644 --- a/src/main/java/pl/allegro/finance/tradukisto/internal/converters/BigDecimalToBankingMoneyConverter.java +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/converters/BigDecimalToBankingMoneyConverter.java @@ -36,7 +36,7 @@ public String asWords(BigDecimal value, String currencySymbol) { return format(FORMAT, converter.asWords(units), currencySymbol, subunits); } - private void validate(BigDecimal value) { + protected void validate(BigDecimal value) { Assert.isTrue(value.scale() <= MAXIMAL_DECIMAL_PLACES_COUNT, () -> String.format("can't transform more than %s decimal places for value %s", MAXIMAL_DECIMAL_PLACES_COUNT, value)); diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishBigDecimalToBankingMoneyConverter.java b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishBigDecimalToBankingMoneyConverter.java new file mode 100644 index 00000000..23d98a51 --- /dev/null +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishBigDecimalToBankingMoneyConverter.java @@ -0,0 +1,36 @@ +package pl.allegro.finance.tradukisto.internal.languages.spanish; + +import pl.allegro.finance.tradukisto.internal.IntegerToStringConverter; +import pl.allegro.finance.tradukisto.internal.converters.BigDecimalToBankingMoneyConverter; + +import java.math.BigDecimal; + +import static java.lang.String.format; + +public class SpanishBigDecimalToBankingMoneyConverter extends BigDecimalToBankingMoneyConverter { + private static final String FORMAT = "%s %s %02d/100"; + private final IntegerToStringConverter converter; + + public SpanishBigDecimalToBankingMoneyConverter(IntegerToStringConverter converter, String currencySymbol) { + super(converter, currencySymbol); + this.converter = converter; + } + + @Override + public String asWords(BigDecimal value, String currencySymbol) { + validate(value); + Integer units = value.intValue(); + Integer subunits = value.remainder(BigDecimal.ONE).multiply(new BigDecimal(100)).intValue(); + + String words = converter.asWords(units); + + // bugfix - ugly hack for ending with "1" :( numerals + nouns needs to have specific gender form + // for example "51 euros" - it is needed to use "cincuenta y un" instead of "cincuenta y uno" + // converter itself does not have context if it is formatting for "standalone" form or with noun + if (words.endsWith("uno")) { + words = words.replaceAll("uno$","un"); + } + return format(FORMAT, words, currencySymbol, subunits); + } + +} diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValues.java b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValues.java index 18bd5450..f5faeda9 100644 --- a/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValues.java +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValues.java @@ -90,6 +90,7 @@ public char twoDigitsNumberSeparator() { public Map exceptions() { return unmodifiableMapOf( + unmodifiableEntry(1, new MultiFormNumber("uno", "un")), unmodifiableEntry(100, new MultiFormNumber("cien", "ciento")), unmodifiableEntry(100000000, new MultiFormNumber("cien millones", "ciento millones")) ); diff --git a/src/test/groovy/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValuesTest.groovy b/src/test/groovy/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValuesTest.groovy index d04b7e12..d4387fd0 100644 --- a/src/test/groovy/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValuesTest.groovy +++ b/src/test/groovy/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValuesTest.groovy @@ -10,6 +10,7 @@ class SpanishValuesTest extends Specification { static intConverter = spanishContainer().getIntegerConverter() static longConverter = spanishContainer().getLongConverter() + static moneyConverter = spanishContainer().getBankingMoneyConverter() @Unroll def "should convert #value to '#words' in Spanish"() { @@ -145,4 +146,24 @@ class SpanishValuesTest extends Specification { 2_000_000_000_000_000_000 | "" Long.MAX_VALUE | "" } -} \ No newline at end of file + + @Unroll + def "should convert money #value to '#words' in Spanish"() { + expect: + moneyConverter.asWords(value, "€") == words + + where: + value | words + 51 | "cincuenta y un € 00/100" + 111.12 | "ciento once € 12/100" + 112.12 | "ciento doce € 12/100" + 123.29 | "ciento veintitrés € 29/100" + 154.63 | "ciento cincuenta y cuatro € 63/100" + 415.51 | "cuatrocientos quince € 51/100" + 426.83 | "cuatrocientos veintiséis € 83/100" + 447.60 | "cuatrocientos cuarenta y siete € 60/100" + 1298 | "mil doscientos noventa y ocho € 00/100" + 1299 | "mil doscientos noventa y nueve € 00/100" + 1111111.11 | "un millón ciento once mil ciento once € 11/100" + } +} From 4266a885262cdbb03187cbbefd6b6623a35eaae0 Mon Sep 17 00:00:00 2001 From: Julia Glaszka Date: Fri, 5 Jan 2024 15:22:31 +0100 Subject: [PATCH 2/4] clean not needed leftovers --- .../tradukisto/internal/languages/spanish/SpanishValues.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValues.java b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValues.java index f5faeda9..18bd5450 100644 --- a/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValues.java +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/spanish/SpanishValues.java @@ -90,7 +90,6 @@ public char twoDigitsNumberSeparator() { public Map exceptions() { return unmodifiableMapOf( - unmodifiableEntry(1, new MultiFormNumber("uno", "un")), unmodifiableEntry(100, new MultiFormNumber("cien", "ciento")), unmodifiableEntry(100000000, new MultiFormNumber("cien millones", "ciento millones")) ); From 94fd81fcf232273ff1645e28878a84dd886d87cd Mon Sep 17 00:00:00 2001 From: Julia Glaszka Date: Fri, 5 Jan 2024 15:23:49 +0100 Subject: [PATCH 3/4] clean not needed leftovers --- .../pl/allegro/finance/tradukisto/internal/Container.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java b/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java index 70fe89d1..5a0b52de 100644 --- a/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java @@ -300,14 +300,8 @@ public static Container spanishContainer() { spanishThousandToWordsConverter ); - IntegerToStringConverter converterForMoney = new SpanishIntegerToWordsConverter( - new SpanishIntegerToWordsConverterAdapter(spanishThousandToWordsConverter, values.pluralForms()), - Collections.singletonMap(1,new MultiFormNumber("un", "xd")), - spanishThousandToWordsConverter - ); - BigDecimalToStringConverter bigDecimalBankingMoneyValueConverter = new SpanishBigDecimalToBankingMoneyConverter( - converterForMoney, + converter, values.currency() ); From 6e2bfc9ac77f99a711fe0b8e2bb84ff1bf2eb9e7 Mon Sep 17 00:00:00 2001 From: Julia Glaszka Date: Fri, 5 Jan 2024 15:26:39 +0100 Subject: [PATCH 4/4] clean unused imports --- .../java/pl/allegro/finance/tradukisto/internal/Container.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java b/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java index 5a0b52de..57c14a5a 100644 --- a/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java @@ -55,8 +55,6 @@ import pl.allegro.finance.tradukisto.internal.languages.turkish.TurkishValues; import pl.allegro.finance.tradukisto.internal.languages.ukrainian.UkrainianValues; -import java.util.Collections; - public final class Container { public static Container polishContainer() {