Skip to content

Commit f649e50

Browse files
committed
Merge pull request #157 from lustefaniak/print-decimals-with-us-locale
Print Doubles with two fraction digits using US locale
2 parents b9a26fc + d08e781 commit f649e50

File tree

6 files changed

+42
-24
lines changed

6 files changed

+42
-24
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package scoverage
2+
3+
import java.text.{DecimalFormat, DecimalFormatSymbols}
4+
import java.util.Locale
5+
6+
object DoubleFormat {
7+
private[this] val twoFractionDigitsFormat: DecimalFormat = {
8+
val fmt = new DecimalFormat()
9+
fmt.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US))
10+
fmt.setMinimumIntegerDigits(1)
11+
fmt.setMinimumFractionDigits(2)
12+
fmt.setMaximumFractionDigits(2)
13+
fmt.setGroupingUsed(false)
14+
fmt
15+
}
16+
17+
def twoFractionDigits(d: Double) = twoFractionDigitsFormat.format(d)
18+
19+
}

scalac-scoverage-plugin/src/main/scala/scoverage/coverage.scala

+7-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package scoverage
22

33
import java.io.File
44

5+
import scoverage.DoubleFormat.twoFractionDigits
6+
57
import scala.collection.mutable
68

79
/**
@@ -24,14 +26,14 @@ case class Coverage()
2426

2527

2628
def avgClassesPerPackage = classCount / packageCount.toDouble
27-
def avgClassesPerPackageFormatted: String = "%.2f".format(avgClassesPerPackage)
29+
def avgClassesPerPackageFormatted: String = twoFractionDigits(avgClassesPerPackage)
2830

2931
def avgMethodsPerClass = methodCount / classCount.toDouble
30-
def avgMethodsPerClassFormatted: String = "%.2f".format(avgMethodsPerClass)
32+
def avgMethodsPerClassFormatted: String = twoFractionDigits(avgMethodsPerClass)
3133

3234
def loc = files.map(_.loc).sum
3335
def linesPerFile = loc / fileCount.toDouble
34-
def linesPerFileFormatted: String = "%.2f".format(linesPerFile)
36+
def linesPerFileFormatted: String = twoFractionDigits(linesPerFile)
3537

3638
// returns the classes by least coverage
3739
def risks(limit: Int) = classes.toSeq.sortBy(_.statementCount).reverse.sortBy(_.statementCoverage).take(limit)
@@ -158,7 +160,7 @@ trait CoverageMetrics {
158160
def invokedStatementCount = invokedStatements.size
159161
def statementCoverage: Double = if (statementCount == 0) 1 else invokedStatementCount / statementCount.toDouble
160162
def statementCoveragePercent = statementCoverage * 100
161-
def statementCoverageFormatted: String = "%.2f".format(statementCoveragePercent)
163+
def statementCoverageFormatted: String = twoFractionDigits(statementCoveragePercent)
162164
def branches: Iterable[Statement] = statements.filter(_.branch)
163165
def branchCount: Int = branches.size
164166
def branchCoveragePercent = branchCoverage * 100
@@ -179,7 +181,7 @@ trait CoverageMetrics {
179181
invokedBranchesCount / branchCount.toDouble
180182
}
181183
}
182-
def branchCoverageFormatted: String = "%.2f".format(branchCoveragePercent)
184+
def branchCoverageFormatted: String = twoFractionDigits(branchCoveragePercent)
183185
}
184186

185187
trait ClassCoverage {

scalac-scoverage-plugin/src/main/scala/scoverage/report/CoberturaXmlWriter.scala

+9-10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package scoverage.report
22

33
import java.io.File
44

5+
import scoverage.DoubleFormat.twoFractionDigits
56
import scoverage._
67

78
import scala.xml.{Node, PrettyPrinter}
@@ -13,8 +14,6 @@ class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File) extends
1314
this(Seq(baseDir), outputDir)
1415
}
1516

16-
def format(double: Double): String = "%.2f".format(double)
17-
1817
def write(coverage: Coverage): Unit = {
1918
val file = new File(outputDir, "cobertura.xml")
2019
IOUtils.writeToFile(file, "<?xml version=\"1.0\"?>\n<!DOCTYPE coverage SYSTEM \"http://cobertura.sourceforge.net/xml/coverage-04.dtd\">\n" +
@@ -24,8 +23,8 @@ class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File) extends
2423
def method(method: MeasuredMethod): Node = {
2524
<method name={method.name}
2625
signature="()V"
27-
line-rate={format(method.statementCoverage)}
28-
branch-rate={format(method.branchCoverage)}>
26+
line-rate={twoFractionDigits(method.statementCoverage)}
27+
branch-rate={twoFractionDigits(method.branchCoverage)}>
2928
<lines>
3029
{method.statements.map(stmt =>
3130
<line
@@ -40,8 +39,8 @@ class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File) extends
4039
def klass(klass: MeasuredClass): Node = {
4140
<class name={klass.fullClassName}
4241
filename={relativeSource(klass.source).replace(File.separator, "/")}
43-
line-rate={format(klass.statementCoverage)}
44-
branch-rate={format(klass.branchCoverage)}
42+
line-rate={twoFractionDigits(klass.statementCoverage)}
43+
branch-rate={twoFractionDigits(klass.branchCoverage)}
4544
complexity="0">
4645
<methods>
4746
{klass.methods.map(method)}
@@ -59,8 +58,8 @@ class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File) extends
5958

6059
def pack(pack: MeasuredPackage): Node = {
6160
<package name={pack.name}
62-
line-rate={format(pack.statementCoverage)}
63-
branch-rate={format(pack.branchCoverage)}
61+
line-rate={twoFractionDigits(pack.statementCoverage)}
62+
branch-rate={twoFractionDigits(pack.branchCoverage)}
6463
complexity="0">
6564
<classes>
6665
{pack.classes.map(klass)}
@@ -73,12 +72,12 @@ class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File) extends
7372
}
7473

7574
def xml(coverage: Coverage): Node = {
76-
<coverage line-rate={format(coverage.statementCoverage)}
75+
<coverage line-rate={twoFractionDigits(coverage.statementCoverage)}
7776
lines-valid={coverage.statementCount.toString}
7877
lines-covered={coverage.invokedStatementCount.toString}
7978
branches-valid={coverage.branchCount.toString}
8079
branches-covered={coverage.invokedBranchesCount.toString}
81-
branch-rate={format(coverage.branchCoverage)}
80+
branch-rate={twoFractionDigits(coverage.branchCoverage)}
8281
complexity="0"
8382
version="1.0"
8483
timestamp={System.currentTimeMillis.toString}>

scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlMerger.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package scoverage.report
22

3+
import scoverage.DoubleFormat.twoFractionDigits
4+
35
import scala.xml.Node
46

57
/** @author Stephen Samuel */
@@ -12,7 +14,7 @@ object ScoverageXmlMerger {
1214
def merge(node1: Node, node2: Node): Node = {
1315
val statementCount = (node1 \ "@statement-count").text.toInt + (node2 \ "@statement-count").text.toInt
1416
val statementsInvoked = (node1 \ "@statements-invoked").text.toInt + (node2 \ "@statements-invoked").text.toInt
15-
val statementRate = "%.2f".format(statementsInvoked.toDouble / statementCount.toDouble * 100.0d)
17+
val statementRate = twoFractionDigits(statementsInvoked.toDouble / statementCount.toDouble * 100.0d)
1618
val packages = (node1 \\ "packages") ++ (node2 \\ "packages")
1719
<scoverage statement-count={statementCount.toString}
1820
statements-invoked={statementsInvoked.toString}

scalac-scoverage-plugin/src/test/scala/scoverage/CoberturaXmlWriterTest.scala

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package scoverage
22

33
import java.io.File
4-
import java.util.{Locale, UUID}
4+
import java.util.UUID
55
import javax.xml.parsers.DocumentBuilderFactory
66

77
import org.scalatest.{BeforeAndAfter, FunSuite, OneInstancePerTest}
@@ -101,10 +101,8 @@ class CoberturaXmlWriterTest extends FunSuite with BeforeAndAfter with OneInstan
101101

102102
val xml = XML.loadFile(fileIn(dir))
103103

104-
def formattedLocally(decimal: BigDecimal) = "%.2f".format(decimal)
105-
106-
assert(xml \\ "coverage" \@ "line-rate" === formattedLocally(0.33), "line-rate")
107-
assert(xml \\ "coverage" \@ "branch-rate" === formattedLocally(0.50), "branch-rate")
104+
assert(xml \\ "coverage" \@ "line-rate" === "0.33", "line-rate")
105+
assert(xml \\ "coverage" \@ "branch-rate" === "0.50", "branch-rate")
108106

109107
}
110108
}

scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageXmlMergerTest.scala

+1-3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ class ScoverageXmlMergerTest extends FreeSpec with Matchers {
99
val node1 = scala.xml.XML.load(getClass.getResourceAsStream("/scoverage/report1.xml"))
1010
val node2 = scala.xml.XML.load(getClass.getResourceAsStream("/scoverage/report2.xml"))
1111

12-
private def formattedLocally(decimal: BigDecimal) = "%.2f".format(decimal)
13-
1412
"scoverage xml merger" - {
1513
"should add top level statement-count" in {
1614
val node = ScoverageXmlMerger.merge(List(node1, node2))
@@ -22,7 +20,7 @@ class ScoverageXmlMergerTest extends FreeSpec with Matchers {
2220
}
2321
"should recalculate statement-rate" in {
2422
val node = ScoverageXmlMerger.merge(List(node1, node2))
25-
(node \ "@statement-rate").text shouldBe formattedLocally(91.67)
23+
(node \ "@statement-rate").text.toDouble shouldBe 91.67
2624
}
2725
"should reset timestamp" in {
2826
val node = ScoverageXmlMerger.merge(List(node1, node2))

0 commit comments

Comments
 (0)