diff --git a/src/main/java/pl/allegro/finance/tradukisto/MoneyConverters.java b/src/main/java/pl/allegro/finance/tradukisto/MoneyConverters.java index c7d45793..5c08f59a 100644 --- a/src/main/java/pl/allegro/finance/tradukisto/MoneyConverters.java +++ b/src/main/java/pl/allegro/finance/tradukisto/MoneyConverters.java @@ -16,6 +16,7 @@ import static pl.allegro.finance.tradukisto.internal.Container.italianContainer; import static pl.allegro.finance.tradukisto.internal.Container.kazakhContainer; import static pl.allegro.finance.tradukisto.internal.Container.latvianContainer; +import static pl.allegro.finance.tradukisto.internal.Container.persianContainer; import static pl.allegro.finance.tradukisto.internal.Container.polishContainer; import static pl.allegro.finance.tradukisto.internal.Container.russianContainer; import static pl.allegro.finance.tradukisto.internal.Container.serbianCyrillicContainer; @@ -39,6 +40,7 @@ public enum MoneyConverters { ITALIAN_BANKING_MONEY_VALUE(italianContainer().getBankingMoneyConverter()), CROATIAN_BANKING_MONEY_VALUE(croatianContainer().getBankingMoneyConverter()), CZECH_BANKING_MONEY_VALUE(czechContainer().getBankingMoneyConverter()), + PERSIAN_BANKING_MONEY_VALUE(persianContainer().getBankingMoneyConverter()), SLOVAK_BANKING_MONEY_VALUE(slovakContainer().getBankingMoneyConverter()), LATVIAN_BANKING_MONEY_VALUE(latvianContainer().getBankingMoneyConverter()), KAZAKH_BANKING_MONEY_VALUE(kazakhContainer().getBankingMoneyConverter()), 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 4c95252b..748b3301 100644 --- a/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/Container.java @@ -27,6 +27,7 @@ import pl.allegro.finance.tradukisto.internal.languages.italian.ItalianValues; import pl.allegro.finance.tradukisto.internal.languages.kazakh.KazakhValues; import pl.allegro.finance.tradukisto.internal.languages.latvian.LatvianValues; +import pl.allegro.finance.tradukisto.internal.languages.persian.PersianValues; import pl.allegro.finance.tradukisto.internal.languages.polish.PolishValues; import pl.allegro.finance.tradukisto.internal.languages.portuguese.BrazilianPortugueseValues; import pl.allegro.finance.tradukisto.internal.languages.portuguese.PortugueseIntegerToWordsConverter; @@ -216,6 +217,22 @@ public static Container brazilianPortugueseContainer() { return new Container(converter, null, bigDecimalBankingMoneyValueConverter); } + + public static Container persianContainer() + { + PersianValues persianValues = new PersianValues(); + HundredsToWordsConverter hundredsToStringConverter = new HundredsToWordsConverter(persianValues.baseNumbers(), + persianValues.twoDigitsNumberSeparator()); + + pl.allegro.finance.tradukisto.internal.languages.persian.IntegerToWordsConverter integerConverter = + new pl.allegro.finance.tradukisto.internal.languages.persian.IntegerToWordsConverter( + hundredsToStringConverter, persianValues.pluralForms()); + + return new Container(integerConverter, + new pl.allegro.finance.tradukisto.internal.languages.persian.BigDecimalToBankingMoneyConverter(integerConverter, + persianValues.currency())); + } + public static Container turkishContainer() { TurkishValues values = new TurkishValues(); diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/BigDecimalToBankingMoneyConverter.java b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/BigDecimalToBankingMoneyConverter.java new file mode 100644 index 00000000..e25a2983 --- /dev/null +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/BigDecimalToBankingMoneyConverter.java @@ -0,0 +1,54 @@ +package pl.allegro.finance.tradukisto.internal.languages.persian; + +import java.math.BigDecimal; + +import pl.allegro.finance.tradukisto.internal.BigDecimalToStringConverter; +import pl.allegro.finance.tradukisto.internal.IntegerToStringConverter; +import static com.google.common.base.Preconditions.checkArgument; +import static java.lang.String.format; + +public class BigDecimalToBankingMoneyConverter implements BigDecimalToStringConverter { + + private static final String FORMAT = "%s %s \u0648 %02d \u0635\u062F\u0645"; + private static final String FORMAT_INT = "%s %s"; + private static final int MAXIMAL_DECIMAL_PLACES_COUNT = 2; + + private final IntegerToStringConverter converter; + private final String currencySymbol; + + public BigDecimalToBankingMoneyConverter(IntegerToStringConverter converter, String currencySymbol) { + this.converter = converter; + this.currencySymbol = currencySymbol; + } + + @Override + public String asWords(BigDecimal value) { + validate(value); + + Integer units = value.intValue(); + Integer subunits = value.remainder(BigDecimal.ONE).multiply(new BigDecimal(100)).intValue(); + if(subunits > 0) + return format(FORMAT, converter.asWords(units), currencySymbol, subunits); + else + return format(FORMAT_INT, converter.asWords(units), currencySymbol, subunits); + } + + private void validate(BigDecimal value) { + checkArgument(value.scale() <= MAXIMAL_DECIMAL_PLACES_COUNT, + "can't transform more than %s decimal places for value %s", MAXIMAL_DECIMAL_PLACES_COUNT, value); + + checkArgument(valueLessThatIntMax(value), + "can't transform numbers greater than Integer.MAX_VALUE for value %s", value); + + checkArgument(valueGreaterThanOrEqualToZero(value), + "can't transform negative numbers for value %s", value); + } + + private boolean valueLessThatIntMax(BigDecimal value) { + return value.compareTo(new BigDecimal(Integer.MAX_VALUE).add(BigDecimal.ONE)) == -1; + } + + private boolean valueGreaterThanOrEqualToZero(BigDecimal value) { + return value.signum() >= 0; + } +} \ No newline at end of file diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/IntegerToWordsConverter.java b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/IntegerToWordsConverter.java new file mode 100644 index 00000000..e2464b65 --- /dev/null +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/IntegerToWordsConverter.java @@ -0,0 +1,66 @@ +package pl.allegro.finance.tradukisto.internal.languages.persian; + +import java.util.Iterator; +import java.util.List; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; + +import pl.allegro.finance.tradukisto.internal.GenderAwareIntegerToStringConverter; +import pl.allegro.finance.tradukisto.internal.IntegerToStringConverter; +import pl.allegro.finance.tradukisto.internal.languages.PluralForms; + +/** + * @author omidp + * + */ +public class IntegerToWordsConverter extends pl.allegro.finance.tradukisto.internal.converters.IntegerToWordsConverter +{ + + private final List pluralForms; + + public IntegerToWordsConverter(GenderAwareIntegerToStringConverter hundredsToWordsConverter, List pluralForms) + { + super(hundredsToWordsConverter, pluralForms); + this.pluralForms = pluralForms; + } + + public IntegerToWordsConverter(IntegerToStringConverter hundredsToWordsConverter, List pluralForms) + { + super(hundredsToWordsConverter, pluralForms); + this.pluralForms = pluralForms; + } + + + @Override + protected String joinParts(List result) + { + if (result.size() == 0) { + return hundredsToWordsConverter.asWords(0, pluralForms.get(0).genderType()); + } + StringBuilder sb = new StringBuilder(); + int counter = 0; + for (String item : result) + { + if(item != null && item.trim().length() > 0) + { + if(counter > 1) + { + Iterable split = Splitter.on(" ").split(item); + for (Iterator iterator = split.iterator(); iterator.hasNext();) + { + sb.append(" \u0648 "); + String string = (String) iterator.next(); + sb.append(string); + } + } + else + sb.append(item).append(" "); + } + counter++; + } +// return Joiner.on(" ").join(result).trim(); + return sb.toString(); + } + +} diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/PersianPluralForms.java b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/PersianPluralForms.java new file mode 100644 index 00000000..d173ad6e --- /dev/null +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/PersianPluralForms.java @@ -0,0 +1,29 @@ +package pl.allegro.finance.tradukisto.internal.languages.persian; + +import pl.allegro.finance.tradukisto.internal.languages.GenderType; +import pl.allegro.finance.tradukisto.internal.languages.PluralForms; + +/** + * @author omidp + * + */ +public class PersianPluralForms implements PluralForms +{ + + private final String form; + + public PersianPluralForms(String form) { + this.form = form; + } + + @Override + public String formFor(Integer value) { + return form; + } + + @Override + public GenderType genderType() { + return GenderType.NON_APPLICABLE; + } + +} diff --git a/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/PersianValues.java b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/PersianValues.java new file mode 100644 index 00000000..b5799ede --- /dev/null +++ b/src/main/java/pl/allegro/finance/tradukisto/internal/languages/persian/PersianValues.java @@ -0,0 +1,59 @@ +package pl.allegro.finance.tradukisto.internal.languages.persian; + +import static pl.allegro.finance.tradukisto.internal.support.BaseNumbersBuilder.baseNumbersBuilder; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import pl.allegro.finance.tradukisto.internal.BaseValues; +import pl.allegro.finance.tradukisto.internal.languages.GenderForms; +import pl.allegro.finance.tradukisto.internal.languages.PluralForms; + +/** + * @author omidp + * + */ +public class PersianValues implements BaseValues +{ + + @Override + public Map baseNumbers() + { + return baseNumbersBuilder().put(0, "\u0635\u0641\u0631").put(1, "\u06CC\u06A9").put(2, "\u062F\u0648").put(3, "\u0633\u0647") + .put(4, "\u0686\u0647\u0627\u0631").put(5, "\u067E\u0646\u062C").put(6, "\u0634\u0634").put(7, "\u0647\u0641\u062A") + .put(8, "\u0647\u0634\u062A").put(9, "\u0646\u0647").put(10, "\u062F\u0647").put(11, "\u06CC\u0627\u0632\u062F\u0647") + .put(12, "\u062F\u0648\u0627\u0632\u062F\u0647").put(13, "\u0633\u06CC\u0632\u062F\u0647") + .put(14, "\u0686\u0647\u0627\u0631\u062F\u0647").put(15, "\u067E\u0627\u0646\u0632\u062F\u0647") + .put(16, "\u0634\u0627\u0646\u0632\u062F\u0647").put(17, "\u0647\u0641\u062F\u0647").put(18, "\u0647\u062C\u062F\u0647") + .put(19, "\u0646\u0648\u0632\u062F\u0647").put(20, "\u0628\u06CC\u0633\u062A").put(30, "\u0633\u06CC") + .put(40, "\u0686\u0647\u0644").put(50, "\u067E\u0646\u062C\u0627\u0647").put(60, "\u0634\u0635\u062A") + .put(70, "\u0647\u0641\u062A\u0627\u062F").put(80, "\u0647\u0634\u062A\u0627\u062F").put(90, "\u0646\u0648\u062F") + .put(100, "\u0635\u062F").put(200, "\u062F\u0648\u06CC\u0633\u062A").put(300, "\u0633\u06CC\u0635\u062F") + .put(400, "\u0686\u0647\u0627\u0631\u0635\u062F").put(500, "\u067E\u0627\u0646\u0635\u062F") + .put(600, "\u0634\u0634\u0635\u062F").put(700, "\u0647\u0641\u062A\u0635\u062F").put(800, "\u0647\u0634\u062A\u0635\u062F") + .put(900, "\u0646\u0647\u0635\u062F").build(); + } + + @Override + public List pluralForms() + { + return Arrays.asList(new PersianPluralForms(""), new PersianPluralForms("\u0647\u0632\u0627\u0631"), + new PersianPluralForms("\u0645\u06CC\u0644\u06CC\u0648\u0646"), + new PersianPluralForms("\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F")); + } + + @Override + public String currency() + { + return ""; + } + + @Override + public char twoDigitsNumberSeparator() + { + return ' '; + } + + +}