创建数值型集合和格式化数值

创建数值型的Range、List和Array

有的时候,我们需要创建一个范围、列表或数字数组,用于for循环或测试目的。这时可以使用Int类的to方法创建一个包含所需元素的范围,代码如下:

// 创建数值的Range、List和Array
val r1 = 1 to 10
r1.foreach(println)

// 设置步长
val r2 = 1 to 10 by 2
r2.foreach(println)

val r3 = 1 to 10 by 3
r3.foreach(println)
    
// 常用于for循环
for (i <- 1 to 5) println(i)
// 也可用until代替to
for (i <- 1 until 5) println(i)
    
// 将一个Range转为Array或List
val xArray = 1 to 10 toArray
// val xArray = (1 to 10).toArray
val xList = 1 to 10 toList
// val xList = (1 to 10).toList
    
// 创建随机长度范围
var range1 = 0 to scala.util.Random.nextInt(10)
// 利用for/yield,不仅仅可以生成数值序列
var range2 = for (i <- 1 to 5) yield i * 2
var range3 = for (i <- 1 to 5) yield i.toDouble

格式化数值和货币

通常在打印输出时,希望格式化数字或货币以控制小数点和逗号。那么对于基本的数字格式,可使用f字符串插值器:

// 格式化数值和货币
val pi = scala.math.Pi
println(f"$pi%1.5f")
println(f"$pi%1.5f")
println(f"$pi%1.2f")
println(f"$pi%06.2f")

向数字添加千分位(逗号)的一个简单方法是使用java.text.NumberFormat类的getIntegerInstance方法。

// 使用java.text.NumberFormat类的getIntegerInstance方法
val formatter = java.text.NumberFormat.getIntegerInstance
println(formatter.format(10000))				// 10,000
println(formatter.format(1000000))			// 1,000,000

也可以用getIntegerInstance方法设置语言环境:

// 还可以指定地区
val locale = new java.util.Locale("de", "DE")
val formatter2 = java.text.NumberFormat.getIntegerInstance(locale)
println(formatter2.format(1000000))			// 1.000.000

可以使用getInstance返回的格式化器处理浮点值:

// 处理浮点值
val formatter3 = java.text.NumberFormat.getInstance
println(formatter3.format(10000.33))			// 10,000.33

对于货币输出,使用getCurrencyInstance返回的格式化器:

// 处理货币
val formatter4 = java.text.NumberFormat.getCurrencyInstance
println(formatter4.format(123.456789)) 		// ¥123.46
println(formatter4.format(1234.56789))		// ¥1,234.57
println(formatter4.format(12345.6789)) 		// ¥12,345.68
println(formatter4.format(123456.789)) 		// ¥123,456.79

下面这种方法用来处理国际货币:

// 处理国际化货币
import java.util.{ Currency, Locale }

val de = Currency.getInstance(new Locale("de", "DE")) 	// de: java.util.Currency = EUR
formatter4.setCurrency(de)
println(formatter4.format(123456.789)) 			// EUR123,456.79

《Spark原理深入与编程实战》