2011-11-20 28 views
15

"%.3f".format(1) trả về 1.000.
"%.3f".format(4.0/3.0) trả về 1.333.Định dạng chuỗi trong scala - độ chính xác thập phân tối đa

Có cách nào dễ dàng để có các khoản trả lại này 11.333? Tôi nghĩ định dạng chuẩn printf đã chỉ định rằng độ chính xác là cực đại, nhưng dường như không có trong Scala.

+1

Scala chỉ sử dụng định dạng Java bình thường, vì vậy câu hỏi không thực sự là Scala cụ thể. Xem http://download.oracle.com/javase/7/docs/api/java/util/Formatter.html để biết mô tả đầy đủ về chuỗi định dạng. –

+2

'"% .3f ".format (1)' không trả lại 1.000, nhưng không thành công. '"% .3f ".format (1.0)' hoặc 1f là cần thiết. Khác bạn nhận được một 'java.util.IllegalFormatConversionException: f! = Java.lang.Integer' –

Trả lời

23

Trình định dạng mặc định được sử dụng bởi printf có vẻ là một trình định dạng chung không có cùng hỗ trợ so với [DecimalFormat][1]. Bạn có thể khởi tạo trình định dạng tùy chỉnh dọc theo các dòng sau:

scala> import java.text.DecimalFormat 
import java.text.DecimalFormat 

scala> val formatter = new DecimalFormat("#.###") 
formatter: java.text.DecimalFormat = [email protected] 

scala> formatter.format(1) 
res36: java.lang.String = 1 

scala> formatter.format(1.34) 
res37: java.lang.String = 1.34 

scala> formatter.format(4.toFloat/3) 
res38: java.lang.String = 1.333 

scala> formatter.format(1.toFloat) 
res39: java.lang.String = 1 

Xem: http://docs.oracle.com/javase/tutorial/java/data/numberformat.html để biết thêm thông tin.

6

"%.3f".format(1) sẽ ném một số java.util.IllegalFormatConversionException do sai loại (Float được mong đợi và bạn cung cấp cho Int).

Thậm chí nếu bạn sử dụng "%.3f".format(1.0), bạn sẽ nhận được 1.000.

Bạn có thể sử dụng một phương pháp như sau để có được những kết quả mong đợi:

def format(x:AnyVal):String = x match { 
    case x:Int => "%d".format(x) 
    case x:Long => "%d".format(x) 
    case x:Float => "%.3f".format(x) 
    case x:Double => "%.3f".format(x) 
    case _ => "" 
} 

Phương pháp này sẽ trở lại với định dạng mong đợi dựa trên loại đối số.

+2

Điều này vẫn trả về" 1.000 "cho 1.0f –

0

Làm thế nào để loại bỏ zeroes sau khi định dạng?

scala> Array(1.0,1.10,1.110).map("%.3g" format _).map(_.replaceAll("[.0]*$","")) 
res7: Array[java.lang.String] = Array(1, 1.1, 1.11) 
+2

Cẩn thận với điều này, vì nó sử dụng ngôn ngữ để chọn những gì để sử dụng làm dấu thập phân . Và nó có thể là ',' và không phải là '.' – Heptic

Các vấn đề liên quan