Skip to content

Instantly share code, notes, and snippets.

@odwrotnie
Created January 28, 2012 14:26
Show Gist options
  • Save odwrotnie/1694509 to your computer and use it in GitHub Desktop.
Save odwrotnie/1694509 to your computer and use it in GitHub Desktop.
Słownie kwota w złotych
case class Currency(name: String, short: String, p: String, left: Boolean = false) {
def digits(value: Double) = append("%.2f" format value, short)
def words(value: Double) = {
val before = w(value.toLong)
val after = w(((value * 100.0f) % 100).toLong)
List(before, after).filterNot(_.isEmpty).zip(List(short, p)).
map(t => List(t._1, t._2)).flatten.mkString(" ").trim
}
private def append(s: String, currency: String) = {
var l = List(s, currency)
if (left) { l = l.reverse }
l.mkString(" ")
}
private def w(v: Long) = {
def w(number: Long, thousandPow: Int) = {
assert(number >= 0 && number < 1000, "Number should contain 3 digits (%s)" format number)
val value = (number % 1000 / 100, number % 100 / 10, number % 10)
val ones = value match {
case (_, 1, _) => ""
case (_, _, 0) => ""
case (_, _, 1) => "jeden"
case (_, _, 2) => "dwa"
case (_, _, 3) => "trzy"
case (_, _, 4) => "cztery"
case (_, _, 5) => "pięć"
case (_, _, 6) => "sześć"
case (_, _, 7) => "siedem"
case (_, _, 8) => "osiem"
case (_, _, 9) => "dziewięć"
}
val tens = value match {
case (_, 0, _) => ""
case (_, 1, 0) => "dziesięć"
case (_, 1, 1) => "jedenaście"
case (_, 1, 2) => "dwanaście"
case (_, 1, 3) => "trzynaście"
case (_, 1, 4) => "czternaście"
case (_, 1, 5) => "piętnaście"
case (_, 1, 6) => "szesnaście"
case (_, 1, 7) => "siedemnaście"
case (_, 1, 8) => "osiemnaście"
case (_, 1, 9) => "dziewiętnaście"
case (_, 2, _) => "dwadzieścia"
case (_, 3, _) => "trzydzieści"
case (_, 4, _) => "czterdzieści"
case (_, 5, _) => "pięćdziesiąt"
case (_, 6, _) => "sześćdziesiąt"
case (_, 7, _) => "siedemdziesiąt"
case (_, 8, _) => "osiemdziesiąt"
case (_, 9, _) => "dziewięćdziesiąt"
}
val hundreds = value match {
case (0, _, _) => ""
case (1, _, _) => "sto"
case (2, _, _) => "dwieście"
case (3, _, _) => "trzysta"
case (4, _, _) => "czterysta"
case (5, _, _) => "pięćset"
case (6, _, _) => "sześćset"
case (7, _, _) => "siedemset"
case (8, _, _) => "osiemset"
case (9, _, _) => "dziewięćset"
}
val numerals = Map(
0 -> List("", "", "", "", "", "", "", ""),
1 -> List("", "tysiąc", "milion", "miliard", "bilion", "biliard", "trylion", "tryliard"),
2 -> List("", "tysiące", "miliony", "miliardy", "biliony", "biliardy", "tryliony", "tryliardy"),
3 -> List("", "tysięcy", "milionów", "miliardów", "bilionów", "biliardów", "trylionów", "tryliardów")
)
val numeral = value match {
case (0, 0, 0) => numerals(0)(thousandPow)
case (0, 0, 1) => numerals(1)(thousandPow)
case (_, 1, _) => numerals(3)(thousandPow)
case (_, _, 2) => numerals(2)(thousandPow)
case (_, _, 3) => numerals(2)(thousandPow)
case (_, _, 4) => numerals(2)(thousandPow)
case (_, _, _) => numerals(3)(thousandPow)
}
List(hundreds, tens, ones, numeral).filterNot(_.isEmpty).mkString(" ").trim
}
val numbers = v.toString.reverse.grouped(3).toList.reverse.map(_.reverse.mkString("").toInt).reverse
numbers.zipWithIndex.reverse.map(t => List(w(t._1, t._2))).flatten.mkString(" ").trim
}
}

Usage:

Currency("Złoty", "zł", "gr").digits(123.45)
Currency("Złoty", "zł", "gr").words(123.45)
@odwrotnie
Copy link
Author

[info] CurrencyTest:
[info] - Currency
[info]   + 46638801,36 zł - czterdzieści sześć milionów sześćset trzydzieści osiem tysięcy osiemset jeden zł trzydzieści sześć gr 
[info]   + 37008191,03 zł - trzydzieści siedem milionów osiem tysięcy sto dziewięćdziesiąt jeden zł trzy gr 
[info]   + 24823378,86 zł - dwadzieścia cztery miliony osiemset dwadzieścia trzy tysiące trzysta siedemdziesiąt osiem zł osiemdziesiąt sześć gr 
[info]   + 90567247,07 zł - dziewięćdziesiąt milionów pięćset sześćdziesiąt siedem tysięcy dwieście czterdzieści siedem zł siedem gr 
[info]   + 39384807,30 zł - trzydzieści dziewięć milionów trzysta osiemdziesiąt cztery tysiące osiemset siedem zł dwadzieścia dziewięć gr 
[info]   + 61781851,10 zł - sześćdziesiąt jeden milionów siedemset osiemdziesiąt jeden tysięcy osiemset pięćdziesiąt jeden zł dziesięć gr 
[info]   + 8814598,07 zł - osiem milionów osiemset czternaście tysięcy pięćset dziewięćdziesiąt osiem zł siedem gr 
[info]   + 33954295,36 zł - trzydzieści trzy miliony dziewięćset pięćdziesiąt cztery tysiące dwieście dziewięćdziesiąt pięć zł trzydzieści sześć gr 
[info]   + 94117898,00 zł - dziewięćdziesiąt cztery miliony sto siedemnaście tysięcy osiemset dziewięćdziesiąt osiem zł 
[info]   + 53142630,69 zł - pięćdziesiąt trzy miliony sto czterdzieści dwa tysiące sześćset trzydzieści zł sześćdziesiąt dziewięć gr 
[info]   + 49333761,66 zł - czterdzieści dziewięć milionów trzysta trzydzieści trzy tysiące siedemset sześćdziesiąt jeden zł sześćdziesiąt sześć gr 
[info]   + 57007466,96 zł - pięćdziesiąt siedem milionów siedem tysięcy czterysta sześćdziesiąt sześć zł dziewięćdziesiąt sześć gr 
[info]   + 49946799,58 zł - czterdzieści dziewięć milionów dziewięćset czterdzieści sześć tysięcy siedemset dziewięćdziesiąt dziewięć zł pięćdziesiąt osiem gr 
[info]   + 65365489,91 zł - sześćdziesiąt pięć milionów trzysta sześćdziesiąt pięć tysięcy czterysta osiemdziesiąt dziewięć zł dziewięćdziesiąt jeden gr 
[info]   + 74945555,97 zł - siedemdziesiąt cztery miliony dziewięćset czterdzieści pięć tysięcy pięćset pięćdziesiąt pięć zł dziewięćdziesiąt siedem gr 
[info]   + 506201,84 zł - pięćset sześć tysięcy dwieście jeden zł osiemdziesiąt cztery gr 
[info]   + 20709501,43 zł - dwadzieścia milionów siedemset dziewięć tysięcy pięćset jeden zł czterdzieści trzy gr 
[info]   + 10892102,03 zł - dziesięć milionów osiemset dziewięćdziesiąt dwa tysiące sto dwa zł trzy gr 
[info]   + 99415202,23 zł - dziewięćdziesiąt dziewięć milionów czterysta piętnaście tysięcy dwieście dwa zł dwadzieścia trzy gr 
[info]   + 14603256,01 zł - czternaście milionów sześćset trzy tysiące dwieście pięćdziesiąt sześć zł jeden gr 
[info]   + 54099551,13 zł - pięćdziesiąt cztery miliony dziewięćdziesiąt dziewięć tysięcy pięćset pięćdziesiąt jeden zł trzynaście gr 
[info]   + 15322816,16 zł - piętnaście milionów trzysta dwadzieścia dwa tysiące osiemset szesnaście zł szesnaście gr 
[info]   + 95576662,03 zł - dziewięćdziesiąt pięć milionów pięćset siedemdziesiąt sześć tysięcy sześćset sześćdziesiąt dwa zł trzy gr 
[info]   + 23950366,15 zł - dwadzieścia trzy miliony dziewięćset pięćdziesiąt tysięcy trzysta sześćdziesiąt sześć zł piętnaście gr 
[info]   + 44881879,75 zł - czterdzieści cztery miliony osiemset osiemdziesiąt jeden tysięcy osiemset siedemdziesiąt dziewięć zł siedemdziesiąt pięć gr 
[info]   + 68706341,57 zł - sześćdziesiąt osiem milionów siedemset sześć tysięcy trzysta czterdzieści jeden zł pięćdziesiąt sześć gr 
[info]   + 81377257,91 zł - osiemdziesiąt jeden milionów trzysta siedemdziesiąt siedem tysięcy dwieście pięćdziesiąt siedem zł dziewięćdziesiąt jeden gr 
[info]   + 51560876,02 zł - pięćdziesiąt jeden milionów pięćset sześćdziesiąt tysięcy osiemset siedemdziesiąt sześć zł dwa gr 
[info]   + 48449529,58 zł - czterdzieści osiem milionów czterysta czterdzieści dziewięć tysięcy pięćset dwadzieścia dziewięć zł pięćdziesiąt osiem gr 
[info]   + 83330018,24 zł - osiemdziesiąt trzy miliony trzysta trzydzieści tysięcy osiemnaście zł dwadzieścia trzy gr 
[info]   + 5002883,91 zł - pięć milionów dwa tysiące osiemset osiemdziesiąt trzy zł dziewięćdziesiąt jeden gr 
[info]   + 13797204,00 zł - trzynaście milionów siedemset dziewięćdziesiąt siedem tysięcy dwieście cztery zł 
[info]   + 17107485,64 zł - siedemnaście milionów sto siedem tysięcy czterysta osiemdziesiąt pięć zł sześćdziesiąt cztery gr 
[info]   + 29332218,25 zł - dwadzieścia dziewięć milionów trzysta trzydzieści dwa tysiące dwieście osiemnaście zł dwadzieścia pięć gr 
[info]   + 44449282,69 zł - czterdzieści cztery miliony czterysta czterdzieści dziewięć tysięcy dwieście osiemdziesiąt dwa zł sześćdziesiąt dziewięć gr 
[info]   + 79234988,15 zł - siedemdziesiąt dziewięć milionów dwieście trzydzieści cztery tysiące dziewięćset osiemdziesiąt osiem zł piętnaście gr 
[info]   + 42780767,96 zł - czterdzieści dwa miliony siedemset osiemdziesiąt tysięcy siedemset sześćdziesiąt siedem zł dziewięćdziesiąt sześć gr 
[info]   + 62865788,69 zł - sześćdziesiąt dwa miliony osiemset sześćdziesiąt pięć tysięcy siedemset osiemdziesiąt osiem zł sześćdziesiąt dziewięć gr 
[info]   + 30749314,86 zł - trzydzieści milionów siedemset czterdzieści dziewięć tysięcy trzysta czternaście zł osiemdziesiąt sześć gr 
[info]   + 70040401,02 zł - siedemdziesiąt milionów czterdzieści tysięcy czterysta jeden zł dwa gr 
[info]   + 47337977,07 zł - czterdzieści siedem milionów trzysta trzydzieści siedem tysięcy dziewięćset siedemdziesiąt siedem zł siedem gr 
[info]   + 32239254,73 zł - trzydzieści dwa miliony dwieście trzydzieści dziewięć tysięcy dwieście pięćdziesiąt cztery zł siedemdziesiąt trzy gr 
[info]   + 50272309,41 zł - pięćdziesiąt milionów dwieście siedemdziesiąt dwa tysiące trzysta dziewięć zł czterdzieści jeden gr 
[info]   + 8286157,79 zł - osiem milionów dwieście osiemdziesiąt sześć tysięcy sto pięćdziesiąt siedem zł siedemdziesiąt dziewięć gr 
[info]   + 42839434,69 zł - czterdzieści dwa miliony osiemset trzydzieści dziewięć tysięcy czterysta trzydzieści cztery zł sześćdziesiąt dziewięć gr 
[info]   + 18237959,48 zł - osiemnaście milionów dwieście trzydzieści siedem tysięcy dziewięćset pięćdziesiąt dziewięć zł czterdzieści osiem gr 
[info]   + 7551462,02 zł - siedem milionów pięćset pięćdziesiąt jeden tysięcy czterysta sześćdziesiąt dwa zł dwa gr 
[info]   + 95669196,09 zł - dziewięćdziesiąt pięć milionów sześćset sześćdziesiąt dziewięć tysięcy sto dziewięćdziesiąt sześć zł dziewięć gr 
[info]   + 76538575,70 zł - siedemdziesiąt sześć milionów pięćset trzydzieści osiem tysięcy pięćset siedemdziesiąt pięć zł siedemdziesiąt gr 
[info]   + 83702150,81 zł - osiemdziesiąt trzy miliony siedemset dwa tysiące sto pięćdziesiąt zł osiemdziesiąt jeden gr 
[info]   + 62039628,81 zł - sześćdziesiąt dwa miliony trzydzieści dziewięć tysięcy sześćset dwadzieścia osiem zł osiemdziesiąt jeden gr 
[info]   + 16929178,04 zł - szesnaście milionów dziewięćset dwadzieścia dziewięć tysięcy sto siedemdziesiąt osiem zł cztery gr 
[info]   + 42737613,27 zł - czterdzieści dwa miliony siedemset trzydzieści siedem tysięcy sześćset trzynaście zł dwadzieścia siedem gr 
[info]   + 56877087,01 zł - pięćdziesiąt sześć milionów osiemset siedemdziesiąt siedem tysięcy osiemdziesiąt siedem zł jeden gr 
[info]   + 74391254,69 zł - siedemdziesiąt cztery miliony trzysta dziewięćdziesiąt jeden tysięcy dwieście pięćdziesiąt cztery zł sześćdziesiąt dziewięć gr 
[info]   + 82402542,10 zł - osiemdziesiąt dwa miliony czterysta dwa tysiące pięćset czterdzieści dwa zł dziewięć gr 
[info]   + 12793488,57 zł - dwanaście milionów siedemset dziewięćdziesiąt trzy tysiące czterysta osiemdziesiąt osiem zł pięćdziesiąt siedem gr 
[info]   + 50375470,98 zł - pięćdziesiąt milionów trzysta siedemdziesiąt pięć tysięcy czterysta siedemdziesiąt zł dziewięćdziesiąt osiem gr 
[info]   + 10606391,23 zł - dziesięć milionów sześćset sześć tysięcy trzysta dziewięćdziesiąt jeden zł dwadzieścia trzy gr 
[info]   + 48299687,54 zł - czterdzieści osiem milionów dwieście dziewięćdziesiąt dziewięć tysięcy sześćset osiemdziesiąt siedem zł pięćdziesiąt cztery gr 
[info]   + 53366452,81 zł - pięćdziesiąt trzy miliony trzysta sześćdziesiąt sześć tysięcy czterysta pięćdziesiąt dwa zł osiemdziesiąt jeden gr 
[info]   + 78023154,61 zł - siedemdziesiąt osiem milionów dwadzieścia trzy tysiące sto pięćdziesiąt cztery zł sześćdziesiąt jeden gr 
[info]   + 94031939,62 zł - dziewięćdziesiąt cztery miliony trzydzieści jeden tysięcy dziewięćset trzydzieści dziewięć zł sześćdziesiąt dwa gr 
[info]   + 38156177,50 zł - trzydzieści osiem milionów sto pięćdziesiąt sześć tysięcy sto siedemdziesiąt siedem zł pięćdziesiąt gr 
[info]   + 28267079,09 zł - dwadzieścia osiem milionów dwieście sześćdziesiąt siedem tysięcy siedemdziesiąt dziewięć zł dziewięć gr 
[info]   + 1529515,72 zł - jeden milion pięćset dwadzieścia dziewięć tysięcy pięćset piętnaście zł siedemdziesiąt dwa gr 
[info]   + 80774560,83 zł - osiemdziesiąt milionów siedemset siedemdziesiąt cztery tysiące pięćset sześćdziesiąt zł osiemdziesiąt trzy gr 
[info]   + 75638525,98 zł - siedemdziesiąt pięć milionów sześćset trzydzieści osiem tysięcy pięćset dwadzieścia pięć zł dziewięćdziesiąt osiem gr 
[info]   + 90136450,94 zł - dziewięćdziesiąt milionów sto trzydzieści sześć tysięcy czterysta pięćdziesiąt zł dziewięćdziesiąt cztery gr 
[info]   + 81077469,76 zł - osiemdziesiąt jeden milionów siedemdziesiąt siedem tysięcy czterysta sześćdziesiąt dziewięć zł siedemdziesiąt sześć gr 
[info]   + 53603437,96 zł - pięćdziesiąt trzy miliony sześćset trzy tysiące czterysta trzydzieści siedem zł dziewięćdziesiąt sześć gr 
[info]   + 89935975,43 zł - osiemdziesiąt dziewięć milionów dziewięćset trzydzieści pięć tysięcy dziewięćset siedemdziesiąt pięć zł czterdzieści trzy gr 
[info]   + 69953051,32 zł - sześćdziesiąt dziewięć milionów dziewięćset pięćdziesiąt trzy tysiące pięćdziesiąt jeden zł trzydzieści jeden gr 
[info]   + 29439795,58 zł - dwadzieścia dziewięć milionów czterysta trzydzieści dziewięć tysięcy siedemset dziewięćdziesiąt pięć zł pięćdziesiąt osiem gr 
[info]   + 92403206,78 zł - dziewięćdziesiąt dwa miliony czterysta trzy tysiące dwieście sześć zł siedemdziesiąt osiem gr 
[info]   + 25624294,49 zł - dwadzieścia pięć milionów sześćset dwadzieścia cztery tysiące dwieście dziewięćdziesiąt cztery zł czterdzieści dziewięć gr 
[info]   + 59156467,17 zł - pięćdziesiąt dziewięć milionów sto pięćdziesiąt sześć tysięcy czterysta sześćdziesiąt siedem zł siedemnaście gr 
[info]   + 87469999,11 zł - osiemdziesiąt siedem milionów czterysta sześćdziesiąt dziewięć tysięcy dziewięćset dziewięćdziesiąt dziewięć zł jedenaście gr 
[info]   + 42909668,18 zł - czterdzieści dwa miliony dziewięćset dziewięć tysięcy sześćset sześćdziesiąt osiem zł osiemnaście gr 
[info]   + 63717606,85 zł - sześćdziesiąt trzy miliony siedemset siedemnaście tysięcy sześćset sześć zł osiemdziesiąt pięć gr 
[info]   + 5946580,98 zł - pięć milionów dziewięćset czterdzieści sześć tysięcy pięćset osiemdziesiąt zł dziewięćdziesiąt osiem gr 
[info]   + 64694690,24 zł - sześćdziesiąt cztery miliony sześćset dziewięćdziesiąt cztery tysiące sześćset dziewięćdziesiąt zł dwadzieścia cztery gr 
[info]   + 81806305,02 zł - osiemdziesiąt jeden milionów osiemset sześć tysięcy trzysta pięć zł dwa gr 
[info]   + 81011794,59 zł - osiemdziesiąt jeden milionów jedenaście tysięcy siedemset dziewięćdziesiąt cztery zł pięćdziesiąt dziewięć gr 
[info]   + 24829344,28 zł - dwadzieścia cztery miliony osiemset dwadzieścia dziewięć tysięcy trzysta czterdzieści cztery zł dwadzieścia osiem gr 
[info]   + 89140974,29 zł - osiemdziesiąt dziewięć milionów sto czterdzieści tysięcy dziewięćset siedemdziesiąt cztery zł dwadzieścia dziewięć gr 
[info]   + 95937713,77 zł - dziewięćdziesiąt pięć milionów dziewięćset trzydzieści siedem tysięcy siedemset trzynaście zł siedemdziesiąt siedem gr 
[info]   + 99957312,49 zł - dziewięćdziesiąt dziewięć milionów dziewięćset pięćdziesiąt siedem tysięcy trzysta dwanaście zł czterdzieści dziewięć gr 
[info]   + 60020238,34 zł - sześćdziesiąt milionów dwadzieścia tysięcy dwieście trzydzieści osiem zł trzydzieści cztery gr 
[info]   + 30449951,93 zł - trzydzieści milionów czterysta czterdzieści dziewięć tysięcy dziewięćset pięćdziesiąt jeden zł dziewięćdziesiąt trzy gr 
[info]   + 98255554,22 zł - dziewięćdziesiąt osiem milionów dwieście pięćdziesiąt pięć tysięcy pięćset pięćdziesiąt cztery zł dwadzieścia dwa gr 
[info]   + 27117255,18 zł - dwadzieścia siedem milionów sto siedemnaście tysięcy dwieście pięćdziesiąt pięć zł osiemnaście gr 
[info]   + 2380377,42 zł - dwa miliony trzysta osiemdziesiąt tysięcy trzysta siedemdziesiąt siedem zł czterdzieści dwa gr 
[info]   + 66018830,65 zł - sześćdziesiąt sześć milionów osiemnaście tysięcy osiemset trzydzieści zł sześćdziesiąt pięć gr 
[info]   + 30733437,69 zł - trzydzieści milionów siedemset trzydzieści trzy tysiące czterysta trzydzieści siedem zł sześćdziesiąt dziewięć gr 
[info]   + 57054757,36 zł - pięćdziesiąt siedem milionów pięćdziesiąt cztery tysiące siedemset pięćdziesiąt siedem zł trzydzieści sześć gr 
[info]   + 35037158,29 zł - trzydzieści pięć milionów trzydzieści siedem tysięcy sto pięćdziesiąt osiem zł dwadzieścia dziewięć gr 
[info]   + 21036060,49 zł - dwadzieścia jeden milionów trzydzieści sześć tysięcy sześćdziesiąt zł czterdzieści osiem gr 
[info]   + 7962241,11 zł - siedem milionów dziewięćset sześćdziesiąt dwa tysiące dwieście czterdzieści jeden zł jedenaście gr 
[info]   + 35938856,33 zł - trzydzieści pięć milionów dziewięćset trzydzieści osiem tysięcy osiemset pięćdziesiąt sześć zł trzydzieści trzy gr 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment