Formatting Numbers and Currency
You want to format numbers or currency to control decimal places and commas, typically for printed output.
For basic number formatting, use the f string interpolator , “Sub‐
stituting 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
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
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
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
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
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
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
Note: 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
You want to format numbers or currency to control decimal places and commas, typically for printed output.
For basic number formatting, use the f string interpolator , “Sub‐
stituting 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
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
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
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
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
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
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
Note: 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
Share this article with your friends.
No comments :
Post a Comment