Scala如何将字符串转换为四舍五入保留两位小数的Float数值
报错原因
你的代码抛出异常的核心问题是处理顺序颠倒+格式化参数类型不匹配:"%.2f".format()是浮点数格式化方法,要求传入数值类型参数,但你直接传入了String类型的原始输入值,触发了IllegalFormatConversionException。正确的处理逻辑应该是先对原始字符串做符号替换、转成数值,再执行保留小数位的四舍五入操作。
修正后可实现预期效果的代码
import scala.util.Try import java.text.DecimalFormat import java.math.RoundingMode object Number { case class Number(number: Float) def fromString(value: String): Either[Throwable, Number] = { Try { // 1. 先把字符串里的逗号替换为小数点,转成初始浮点数 val rawValue = value.replace(',', '.').toFloat // 2. 配置格式化规则:保留2位小数,使用常规四舍五入模式 val decimalFormat = new DecimalFormat("0.00") decimalFormat.setRoundingMode(RoundingMode.HALF_UP) // 3. 格式化后转回Float decimalFormat.format(rawValue).toFloat }.map(Number).toEither } } object Main { def main(args: Array[String]): Unit = { println(Number.fromString("100,555")) // 输出 Right(Number(100.56)),符合预期 } }
注意:
Float属于单精度浮点数,本身存在固有精度误差,如果是金额等对精度要求高的场景,推荐替换为BigDecimal类型存储数值。
Scala 中类似 PHP number_format 的实现方案
Scala 标准库没有提供和number_format完全同名的封装函数,但可以直接调用JDK内置的工具类实现完全一致的功能,不需要额外引入第三方依赖:
- 最灵活的方式是使用
java.text.DecimalFormat,支持自定义保留小数位数、舍入规则、千分位分隔符、小数点符号等所有number_format支持的能力。比如要实现带千分位分隔的两位小数格式,直接使用格式化模板"#,##0.00"即可。 - 如果只是简单做固定小数位格式化,也可以用
"%.2f".format(数值)的写法,但要注意该方法默认使用HALF_EVEN(银行家舍入)规则,和PHP默认的四舍五入规则有差异,如果需要常规四舍五入,还是要通过DecimalFormat显式指定RoundingMode.HALF_UP。
内容的提问来源于stack exchange,提问作者helloworld
相关产品推荐
相关产品推荐

