Często podczas pracy firmach finansowych przychodzi czas na typowe zadanie zamiany liczby z postaci cyfrowej na postać liczbową w języku polskim. Szukałem w internecie gotowej implementacji takiego algorytmu, sprawdzonego i przetestowanego z otwartymi kodami i… okazało się, że nic nie znalazłem do C#.
Nie było nigdzie implementacji takiego konwertera w .NET dlatego poniżej zrobiłem własną implementację.
Poniżej warunki takiego konwertera:
- Zamiana liczby na słowa zawiera polskie odmiany np: tysiące, tysięcy, tysiąc. (w tej chwili do zakresu integera czyli do około 2 miliardów)
- Kody są dostępne na licencji MIT czyli można dowolnie je zmieniać i modyfikować.
- Projekt zawiera bibliotekę LiczbyNaSlowaNet ze statyczną klasą NumberToTexConverter z metodą Convert oraz sporo testów do niej.
- Biblioteka będzie rozwijana przez najbliższe 3 miesiące lub gdy zostanie zauważony błąd.
- Kody źródłowe są otwarte i są dostępne tutaj
- Szczegóły algorytmu są dostępne tutaj:
http://www.algorytm.org/inne/zamiana-liczby-na-slowa-z-polska-gramatyka.html#impl1008
- Plany rozwoju dotyczą głownie spraw finansowych(możliwość konwersji do postaci walutowej, możliwość konwersji większego zakresu liczb, możliwość konwersji liczb z przecinkiem np: 12,4)
[UPDATE 21.12.2014]
Wprowadzone zmiany:
- Konwersja liczb z przecinkiem
- Konwersja na postać walutową (dwa zlote trzy grosze)
Będę wdzięczny za informację zwrotną. Obiecuje, że każdą potraktuje poważnie i się do niej odniosę.
[UPDATE 01.03.2015]
Wprowadzone zmiany:
- Dodanie możliwości oddzielania liczb po przecinku własnym separatorem.
- Biblioteka dostępna w NUget-ach Nuget- https://www.nuget.org/packages/LiczbyNaSlowaNET.dll/1.0.1
Install-Package LiczbyNaSlowaNET.dll
[UPDATE 02.03.2015]
- Poprawki 2 błędów dotyczących zamiany liczb na słowa.
Jeśli masz jakieś uwagi do projektu, proszę zgłoś je na github-ie. Tam jest całkiem dobre narzędzie do zgłaszania problemów do projektu.
[UPDATE 29.07.2016]
- możliwość ustawiania dowolnej waluty, podczas konwersji liczby na odpowiednik walutowy (ta funkcjonalność powstała dzięki wsparciu społeczności w szczególności użytkownika Tomasz Sienkiewicz).
- Jeszcze nie wydałem nowej wersji ale będzie ona wkrótce dostępna na nugetach
[UPDATE 3.01.2017]
Wersja 1.0.0.4 – – wersja w nugetach 1.0.4
- usunięcie kontenera DI.
- biblioteka już nie potrzebuje zależności innych niż .NET 4.0
- możliwość ustawiania czy tekst ma posadać polskie znaki czy też nie. Domyślnie jest bez polskich znaków.
- możliwość podmienienia słowników zawierających liczebniki.
- dodanie obsługi wartości procentowych
[UPDATE 4.01.2017]
Wersja 1.0.0.5 – wersja w nugetach 1.0.5
Dzięki wsparciu https://github.com/ZmorzynskiK biblioteka dorobiła się kolejne wersji i sporo przydatnych zmian w kodzie
Najważniejsze zmiany:
- dodanie pomocniczych metod do NumberToText
- przejście z int na long (potencjalnie większy zakres)
- usunięcie kilku klas (np NumberToTextOptionBuilder), w ich miejsce inne wywołania
- zmiany w architekturze klasy CurrencyAlgorithm
- uproszczenie interfejsów
- wspólna bazowa klasa BaseCurrencyDeflation
- dostosowanie słowników-deflacji do zmienionego interfejsu ICurrencyDeflation
Jeszcze co do testów.
Lepszą praktyką jest jedna asercja – jedna metoda.
Hej, dzieki za komentarz. Masz na myśli, ze jeden test na jedną liczbe. Ok mysle, ze to sensowne. Poprawię wieczorem
Poprawiłem. Jeszcze raz dzięki za info.
Strasznie razi mnie polska nomenklatura w języku programowania.
W sumie kiedyś na potrzeby w firmie też napisałem taki konwerter. Z racji komercyjnego bytu, podzielić się nie mogę :)
Mam fetysz jeśli chodzi o polską nomenklature. Bardzo lubię również polskie znaki w nazwach zmiennych i metod, visual studio to dobrze wspiera. Ale myślę, że jeśli to ma być projekt dla społeczności to poprawię polskie nazwy na angielskie. Dzięki za zwrócenie uwagi.
Niestety nie w pełni. Polskie znaki uniemożliwiają generowanie diagramów UML obiektów zawierających właśnie polskie znaki. Dotyczy to również samej ścieżki do tychże plików.
A to nie wiedziałem. Dzięki za informacje kolego. W takim razie następnym razem się mocno zastanowię przed używaniem polskich znaków.
Poprawiłem. Dzięki za uwagi.