Scala之Numbers

一、前言

  前面已经学习了Scala中的String,接着学习Scala的Numbers。

二、Numbers

  在Scala中,所有的数字类型,如Byte,Char,Double,Float,Int,Long,Short都是对象,这七种数字类型继承AnyVal特质,这七种数字类型与其在Java中有相同的范围,而Unit和Boolean则被认为是非数字值类型,Boolean有false和true两个值,你可以获取到各个数字类型的最值。

  

  复杂的数字和日期

  如果需要更强大的数类,可以使用spirescalalab

  如果需要更强大的日期类,可以使用Joda Timenscala-time

  2.1 从字符串中解析数字

  1. 问题

  你想要将字符串类型转化为数字类型。

  2. 解决方案

  使用String的to*方法即可将String转化为相应的数字。

  

  当无法进行转化时,to*方法可能会抛出NumberFormatException异常。

  

  可以直接使用字符串来创建BigInt和BigDecimal实例(也可能会抛出异常)

  

  处理基和基数

  如果在计算时不以10为基(十进制)进行计算,而要使用其他进制,此时Int类的toInt方法不允许传入基和基数,此时需要使用parseInt方法,parseInt可将字符串转化为在指定进制下的值

  

  也可以使用隐式转化来完成上述的功能

  

  3. 讨论

  由于在Scala中没有受检查异常,因此你不需要在方法中声明throws NumberFormatException。但是为了使调用者明白该方法可能会抛出异常,你可以使用throws注解 

@throws(classOf[NumberFormatException])
def toInt(s: String) = s.toInt

  更通常而言,在Scala中使用Option/None/Some进行模式匹配来处理  

def toInt(s: String):Option[Int] = {
try {
Some(s.toInt)
} catch {
case e: NumberFormatException => None
}
}

  此时你就可以使用不同的方法来调用toInt方法  

println(toInt("1").getOrElse(0)) // 1
println(toInt("a").getOrElse(0)) // 0

  另外一种使用方法就是使用匹配表达式  

toInt(aString) match {
case Some(n) => println(n)
case None => println("Boom! That wasn't a number.")
}

  也可以使用如下直接提取出值 

val result = toInt(aString) match {
case Some(x) => x
case None => 0
}

  2.2 数字类型间的转化

  1. 问题描述

  你想要从一种数字类型转化为另一种数字类型,如从Int到Double。

  2. 解决方案

  不同于Java使用cast方法,Scala中可以直接使用数字类型提供的to*方法。

  

  3. 讨论

  在Java中,需要强制转化来将double类型转化为int类型 

int a = (int) 100.00;

  但是在Scala中,使用to*方法即可完成上述转化,如果你想要避免转化错误,你可以使用isValid方法来测试是否可以转化

  

  2.3 重写默认类型

  1. 问题描述

  当你给变量赋值时,Scala会自动给变量赋予相应的类型,当你创建数字字段时,你需要重写默认的类型。

  2. 解决方案

  如果你将1赋值给变量a,那么a默认为Int类型

  

  下面例子重写了默认类型

  

  另一种方法是用类型注释变量

  

  也可以在等号左边进行定义

  

  你也可以在数字前面添加0x或0X来创建十六进制整形

  

  3. 讨论

  当创建对象实例时,应该注意如下语法结构

var [name]:[Type] = [initial value]

  在初始化数字类型的var字段时,可以使用占位符,其值默认为0,占位符仅仅只在类定义时有效,其他时候则不行,如在方法内部定义不起作用

class Foo {
var a: Short = 0 // 定义初始值
var b: Short = _ // 默认为0
}

  但在方法中,可以使用如下方法  

var name = null.asInstanceOf[String]

  当然更好的办法是使用Option/None/Some模式匹配,这样可以避免空值

  2.4 替换++、--

  1. 问题描述

  在其他语言中,你可以使用++、--来增1、减1,然而,在Scala中没有++、--操作符

  2. 解决方案

  由于val类型变量是不可变的,所以不能进行加法或减法的操作,但是var类型是可变,可以使用+=、-=方法来进行加法或减法

  

  同理,也可以使用*=、/=方法进行乘法、除法操作

  

  值得注意的是+=、-=、*=、/=都不是操作符,而是方法,他们是var型Int变量上实现的方法。

  3. 讨论

  在其他数字类型上也可以使用+=、-=、*=、/=方法

  

  2.5 比较浮点数

  1. 问题描述

  你需要比较两个浮点数,但在其他一些编程语言中,它们应该是相等的两个浮点数

  2. 解决方案

  在Java和许多其他语言,你可以通过创建一个指定比较精度的方法来决这个问题,下面是约等于方法  

def ~=(x: Double, y: Double, precision: Double) = {
if ((x - y).abs < precision) true else false
}

  

  3. 讨论

  当进行浮点数计算时,0.1 + 0.1等于0.2,但是0.1 + 0.2不等于0.3

  

  这种细小的错误使得比较两个浮点数成为真正的问题。

  

  因此,你需要自定义比较精度的函数来比较两个浮点数是否相等,你可以定义隐式转化,然后在需要是引入即可。或者将方法放在object对象中,这样可以直接调用  

object MathUtils {
def ~=(x: Double, y: Double, precision: Double) = {
if ((x - y).abs < precision) true else false
}

  然后直接通过MathUtils调用~=方法进行比较 

println(MathUtils.~=(a, b, 0.000001))

  2.6 处理大数

  1. 问题描述

  你正在编写需要使用非常大的整数或十进制数的应用程序

  2. 解决方案

  你可以使用BigInt或BigDecimal类

  

  不同于其在Java的对应类,这些类支持所有你使用数字类型的操作符

  

  你也可以把它们转化为其他数字类型

  

  为了避免错误,也可以在转化之前进行测试

  

  3. 讨论

  虽然Scala中的BigInt和BigDecimal是由Java中的BigInt和BigDecimal支持的,但是Scala中的类使用更为简便,并且它们是可变的,可以像其他数字类型一样操作。

  2.7 生成随机数

  1. 问题描述

  你需要创建随机数,如测试应用程序、执行模拟以及许多其他情况

  2. 解决方案

  使用scala.util.Random来创建随机数

  

  你可以指定随机生成数字的最大值

  

  上述示例将会生成[0-99]之间的数字,你也可以生成随机Float(0.0到1.0之间的浮点数)

  

  也可以生成随机Double(0.0到1.0之间的浮点数)

  

  你也可以在创建Random时指定seed值,也可以之后调用setSeed方法进行设置

  

  3. 讨论

  Random类可以应对所有通常的使用,包括生成数字、设置最大值、设置seed值,也可以生成随机字符

  

  Scala可以生成一段随机长度的数字,在测试时非常有用

  

  也可以生成随机长度的浮点数

  

  2.8 创建数字范围,列表或数组

  1. 问题描述

  你需要创建一个数字范围、列表或数组,如for循环或用于测试目的

  2. 解决方案

  使用Int类的方法来创建一个数字Range

  

  也可以自定义间距

  

  3. 讨论

  在Scala中可以很轻易的创建数字范围,并且可以很轻易的将其转化为列表或者数组类型

  

  更好的方式如下

  

  2.9 格式化数字和货币

  1. 问题描述

  你想要格式化数字和货币来控制小数点和逗号,特别是用于打印输出。

  2. 解决方案

  对于简单的数字格式化,可以采用前篇博文提到的f字符串插值

  

  添加逗号的一种简单方法是调用java.text.NumberFormat类的getIntegerInstance方法

  

  在使用getIntegerInstance方法的时候可以指定地区

  

  在处理浮点数时可以使用getInstance方法

  

  对于货币格式,可以使用getCurrencyInstance方法

  

  下面方法可以处理国际化货币

  

  3. 讨论

  主要讨论了使用Java的相关类来格式化数字和货币,也可以使用BigDecimal来处理货币的格式问题。

三、总结

Scala-Numbers的更多相关文章

  1. Scala初探:新潮的函数式面向对象语言

    Scala的基本概念 先讲讲Scala里头几个概念Classes, Traits, Objects and Packages. Class和Java中的很像,只不过Scala中Class不能有stat ...

  2. Scala 基础入门【翻译】

    原文地址 本文只是带你进入 Scala 的世界,包括安装.不可变量 val.可变量 var.定义类.集合(包括列表(list).集(set).映射(map))以及集合遍历和集合库(能达到并行/并发效果 ...

  3. Scala中Zip相关的函数

    在Scala中存在好几个Zip相关的函数,比如zip,zipAll,zipped 以及zipWithIndex等等.我们在代码中也经常看到这样的函数,这篇文章主要介绍一下这些函数的区别以及使用. 1. ...

  4. scala集合

    优先使用不可变集合.不可变集合适用于大多数情况,让程序易于理解和推断,因为它们是引用透明的( referentially transparent )因此缺省也是线程安全的. 使用可变集合时,明确地引用 ...

  5. scala函数组合器

    1.map 在列表中的每个元素上计算一个函数,并且返回一个包含相同数目元素的列表. scala> numbers.map(_ * 2)res3: Array[Int] = Array(2, 4, ...

  6. scala学习笔记(2)

    1 Loop (1) for (i <- 1 to 3){ # 1 2 3 } (2) for (i <- 1 until 3){ #1 2 } (3)过滤 for (i <- 1 ...

  7. scala 基础语法

    文章内容全部来自:http://twitter.github.io/scala_school/zh_cn/index.html 表达式 scala> 1 + 1 res0: Int = 2 值 ...

  8. scala进阶笔记:函数组合器(combinator)

    collection基础参见之前的博文scala快速学习(二). 本文主要是组合器(combinator),因为在实际中发现很有用.主要参考:http://www.importnew.com/3673 ...

  9. Scala函数式编程(三) scala集合和函数

    前情提要: scala函数式编程(二) scala基础语法介绍 scala函数式编程(二) scala基础语法介绍 前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的 ...

  10. Scala高阶函数与泛型

    1. Scala中的函数 在Scala中,函数是“头等公民”,就和数字一样.可以在变量中存放函数,即:将函数作为变量的值(值函数). 2. scala中的匿名函数,即没有函数名称的函数,匿名函数常作为 ...

随机推荐

  1. Snail—UI学习之自己定义标签栏UITabBarController

    这里的背景跟上面的差点儿相同 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkF ...

  2. 算法 Tricks(三)—— 判断序列是否为等差数列

    判断一个数列不是等差数列,要比判断一个数列是等差数列比较容易. bool progressive = true; for (int i = 0; i < A.size() - 1; ++i){ ...

  3. SpringCloud微服务学习笔记

    SpringCloud微服务学习笔记 项目地址: https://github.com/taoweidong/Micro-service-learning 单体架构(Monolithic架构) Mon ...

  4. P2P网贷第三方托管模式存在5大缺陷,托管机构才是最大赢家

    1.注册开户需要2次,用户体验很差劲儿.   理财人和借款人,首先在平台注册,然后还要在第三方托管账户注册.   很多类似的地方,用户体验非常差劲.   比如,密码4个.   平台:登录密码.交易密码 ...

  5. MySql的事务操作与演示样例

    事务就是一个逻辑工作单元的一系列步骤. 事务是用来保证数据操作的安全性 事务的特征: Atomicity(原子性) Consistency(稳定性,一致性) Isolation(隔离性) Durabi ...

  6. 闪回drop恢复表后sql运行计划异常

    -----正常运行计划 set autotrace traceonly set linesize 1000 select /*+index(t idx_object_id)*/ * from t wh ...

  7. windows2003 IIS6下安装ISAPI_Rewrite3破解版

    摘抄的https://jingyan.baidu.com/article/ff42efa931a2c0c19e220298.html 非常感谢,我是怕百度经验有一天消失了,以防万一 iis6 ISAP ...

  8. (九)RabbitMQ消息队列-通过Headers模式分发消息

    原文:(九)RabbitMQ消息队列-通过Headers模式分发消息 Headers类型的exchange使用的比较少,以至于官方文档貌似都没提到,它是忽略routingKey的一种路由方式.是使用H ...

  9. C# 二分法查找和排序

    using System;using System.Collections.Generic;using System.Text; namespace AAA{    public class Dich ...

  10. ios开发事件处理之 四:hittest方法的底层实现与应用

    #import "XMGWindow.h" /** 1:注意点:hitTest方法内部会调用pointInside方法,询问触摸点是否在自己身上,当遍历子控件时,传入的坐标点要进行 ...