Scala FAQ: How can I format numbers and currency in Scala, such as to control the number of decimal places and commas in the values, typically for printed output.
Basic formatting
For basic number formatting, use the f
string interpolator shown in Recipe 1.4 of the Scala Cookbook, “Substituting Variables into Strings”:
scala> val pi = scala.math.Pi pi: Double = 3.141592653589793 scala> println(f"$pi%1.5f") 3.14159
A few more examples demonstrate the technique:
scala> f"$pi%1.5f" res0: String = 3.14159 scala> f"$pi%1.2f" res1: String = 3.14 scala> f"$pi%06.2f" res2: String = 003.14
The 'format' method
If you’re using a version of Scala prior to 2.10, or prefer the explicit use of the format
method, you can write the code like this instead:
scala> "%06.2f".format(pi) res3: String = 003.14
Handling commas in numbers
A simple way to add commas is to use the getIntegerInstance
method of the java.text.NumberFormat class:
scala> val formatter = java.text.NumberFormat.getIntegerInstance formatter: java.text.NumberFormat = java.text.DecimalFormat@674dc scala> formatter.format(10000) res0: String = 10,000 scala> formatter.format(1000000) res1: String = 1,000,000
Setting the locale
You can also set a locale with the getIntegerInstance
method:
scala> val locale = new java.util.Locale("de", "DE") locale: java.util.Locale = de_DE scala> val formatter = java.text.NumberFormat.getIntegerInstance(locale) formatter: java.text.NumberFormat = java.text.DecimalFormat@674dc scala> formatter.format(1000000) res2: String = 1.000.000
Formatting floating-point numbers
You can handle floating-point values with a formatter returned by getInstance
:
scala> val formatter = java.text.NumberFormat.getInstance formatter: java.text.NumberFormat = java.text.DecimalFormat@674dc scala> formatter.format(10000.33) res0: String = 10,000.33
Formatting currency
For currency output, use the getCurrencyInstance
formatter:
scala> val formatter = java.text.NumberFormat.getCurrencyInstance formatter: java.text.NumberFormat = java.text.DecimalFormat@67500 scala> println(formatter.format(123.456789)) $123.46 scala> println(formatter.format(1234.56789)) $1,234.57 scala> println(formatter.format(12345.6789)) $12,345.68 scala> println(formatter.format(123456.789)) $123,456.79
Formatting international currency
This approach handles international currency:
scala> import java.util.{Currency, Locale} import java.util.{Currency, Locale} scala> val de = Currency.getInstance(new Locale("de", "DE")) de: java.util.Currency = EUR scala> formatter.setCurrency(de) scala> println(formatter.format(123456.789)) EUR123,456.79
Discussion
This recipe falls back to the Java approach for printing currency and other formatted numeric fields, though of course the currency solution depends on how you handle currency in your applications. In my work as a consultant, I’ve seen most companies handle currency using the Java BigDecimal
class, and others create their own custom currency classes, which are typically wrappers around BigDecimal.
See Also
- My printf cheat sheet
- The Joda Money library is a Java library for handling currency
- JSR 354: Money and Currency API, is also being developed in the Java Community Process. See jcp.org for more information.
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |