Originally designed for interpolation performance improvements, but as Scala's built-in interpolation has improved, this has become redundant. However, formatted interpolation is still both slow and painful to work with. To that end, this library has changed to providing convenient features for formatting dates and numbers.
Perfolation supports Scala on JVM, JS, and Native with support for 2.11, 2.12, 2.13, and 3
Load the core dependency with SBT:
libraryDependencies += "com.outr" %% "perfolation" % "1.2.5"Or the unit dependency for size conversions with SBT:
libraryDependencies += "com.outr" %% "perfolation-unit" % "1.2.5"Numeric implicits are supported for Int, Long, Double, and BigDecimal exposing a simple method f:
def f(i: Int, // Minimum integer digits. Defaults to 1
f: Int = 0, // Minimum fraction digits. Defaults to 0 for Int/Long and 2 for Double/BigDecimal
maxI: Int, // Maximum integer digits. Defaults to -1 for no maximum
maxF: Int, // Maximum fraction digits. Defaults to -1 to use the same as `f`
g: Grouping, // Grouping mode (Defaults to Grouping.None)
rm: RoundingMode // Rounding mode (Defaults to RoundingMode.HalfUp)
): StringSome simple examples:
import perfolation._
4.f(i = 2) // 04
40.f(f = 2) // 40.00
400.0.f() // 400.00
4000.0.f(f = 3, g = Grouping.US) // 4,000.000Most of this follows a similar concept to f interpolation, but with a type-safe mechanism. Most commonly, you are
likely to find this useful in interpolations like:
println(s"The value is: ${value.f(g = Grouping.US)}")Perfolation provides a convenient CrossDate to make working with dates much easier between the JVM, JS, and Native.
Similar to numeric formatting, date implicits are supported for Int, Long, Double, and BigDecimal although this
is most commonly just used on Long for timestamps. Perfolation exposes a simple method t:
def t: CrossDateSome simple examples:
import perfolation._
val date = System.currentTimeMillis()
date.t.milliseconds // Milliseconds on date
date.t.hour24 // Hour in 24-hour time
date.t.dayOfWeek // Numeric day of the week
date.t.A // Full named day of the week (ex. "Tuesday")See the docs for CrossDate for a complete reference.
Unit formatting requires the perfolation-unit module, but provides conversion between byte-based sizes. For example:
import perfolation.unit._
Information.useBinary() // Configure Information to use binary conversions
5.kb.bytes // 5120L
5.gb.bytes // 5368709120L
Information.useDecimal() // Configure Information to use decimal conversions
5.kb.bytes // 5000L
5.gb.bytes // 5000000000L
(5 * 1000 * 1000).b.format() // "5.00 mb"The format method has a similar signature to that of f in numeric formatting:
def format(i: Int = 1,
f: Int = 2,
maxI: Int = -1,
maxF: Int = -1,
g: Grouping = Grouping.None,
rm: RoundingMode = RoundingMode.HalfUp,
showUnit: ShowUnit = ShowUnit.Abbreviation): String