scala-basic 基础篇
@author 鲁伟林
Scala基础知识介绍,主要包括《Scala编程实战》的基础章节
GitHub地址: https://github.com/thinkingfioa/scala-in-action
本人博客地址: http://blog.youkuaiyun.com/thinking_fioa/article/details/78265745
第2章 数值
引言
Scala所有的数值都是对象,包括Byte、Char、Double、Float、Int、Long和Short。其数值类型范围与Java的基本数据类型范围相同。
2.1 从字符串到数值
把一个字符串转换成一个Scala的数值类型。
- 使用String的to*方法。eg: val age : Int = "19".toInt
- BigInt和BigDecimal类型的数值也可以通过字符串创建。eg: val b : BigDecimal = BigDecimal("3.1415926")
- String中的toInt方法不支持传入进制,所以采用java.lang.Integer类的parseInt方法。 eg: Integer.parseInt("10", 2);
代码:
object Number2P1 {
def main(args: Array[String]): Unit = {
val str : String = "111"
val num : Int = str.toInt
println(num)
println(str.toInt2(2))
println(Integer.parseInt(str, 2))
}
implicit class StringToInt(str: String) {
def toInt2(radix : Int) : Int = Integer.parseInt(str, radix)
}
}
2.2 数值类型转换
把一个数值类型转换成另一种数值类型,如把Int类型转换成Double类型。在Scala中,不可以直接进行强制类型转换,使用在所有数值类型上都可用的to*方法。eg: 19.45.toInt
- 为了避免类型转换可能出现错误,在转换前可以使用相应的isValid方法确认是否可以进行类型转换。eg: a.isValidShort,如果超过了数值类型,也会返回false
2.3 重载默认数值类型
对一个数值类型变量赋值时,Scala会自动把数值类型赋值给变量. eg: val a =1d, a的类型则是Double。另一个方案是: val b = 0: Double, b的类型则是Double
2.4 替代 ++ 和 --
像其他语言里那样使用++和--来递增或者递减一个变量,但是Scala里没有这样的操作符。需要使用+=、-=、*=和/=方法来实现递增。eg: a +=1
2.5 浮点数的比较
比较两个浮点数的值,与其他语言一样,两个应该相等的浮点数有可能实际上是不等的
代码:
object Number2P5 {
def main(args: Array[String]): Unit = {
val d3 = 0.3d
val addDouble : Double = sumDouble(0.2d, 0.1d)
println(s" $d3 != $addDouble")
println(~=(d3, addDouble, 0.000001))
}
/**
* 输出 0.30000000000000004
*/
def sumDouble(d1 : Double, d2 : Double) : Double = {
d1 + d2
}
def ~=(x: Double, y:Double, precision: Double): Boolean = {
if((x-y).abs < precision) {
true
} else {
false
}
}
}
2.6 处理大数
编写一个处理非常大的整数的程序,在Scala语言中可以使用BigInt和BigDecimal类。eg: var b = BigDecimal(123456789.12345678)
2.7 生成随机数
使用Scala的Scala.util.Random生成随机数. eg: val random = new Random()
- random.nextInt ----- 返回一个Int范围的随机数
- random.nextInt(100) ----- 返回一个0到99的随机数
- random.nextFloat ----- 返回一个0.0 到 1.0的随机数
代码:
object Number2P7 {
def main(args: Array[String]): Unit = {
println(random(100))
randomMore(6)
}
def random(upper : Int) : Int = {
val random = new Random()
random.nextInt(upper)
}
def randomMore(count : Int) : Unit = {
val random = new Random(System.currentTimeMillis())
for(i <- 1 to 10) yield println(random.nextInt(100))
}
}
2.8 创建一个数值区间、列表或者数组
在for循环里或者为了测试创建一个数值区间、列表或者数组
- var r = 1 to 10 ------ 得到Range(1, 2, 3,..., 10)
- var r = 1 until 5 ------ 得到Range(1, 2, 3, 4)
- var r = 1 to 10 by 2 ----- 得到Range(1, 3, 5, 7, 9)
- for(c <- 1 until 5) println(i)
- val x = (1 to 10).toArray/toList ----- 快速生成列表和数值
2.9 格式化数值和金额
对数值或者金额的小数位数或逗号进行格式化,特别是输出时,非常有用
- 基本数值的格式化输出 ----- eg: "f%pi%1.5f",表示整数位1位,小数位5位
- 简单的加逗号 ----- java.text.NumberFormat.getIntegerInstance
代码:
object Number2P8 {
def main(args: Array[String]): Unit = {
// 输出: 10,000,000
System.out.println(printF(10000000))
}
def printF(money : Long ) : String = {
val formatter = java.text.NumberFormat.getIntegerInstance()
formatter.format(money)
}
}