Skip to content

Commit c8b6891

Browse files
committed
Add check digit calculation
1 parent 9fc1dca commit c8b6891

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package hmda.validation.engine.lar
2+
3+
//See https://www.consumerfinance.gov/eregulations/1003-C/2015-26607_20180101#1003-C-1
4+
5+
object ULIValidation {
6+
7+
val conversionTable = Map(
8+
"a" -> 10,
9+
"b" -> 11,
10+
"c" -> 12,
11+
"d" -> 13,
12+
"e" -> 14,
13+
"f" -> 15,
14+
"g" -> 16,
15+
"h" -> 17,
16+
"i" -> 18,
17+
"j" -> 19,
18+
"k" -> 20,
19+
"l" -> 21,
20+
"m" -> 22,
21+
"n" -> 23,
22+
"o" -> 24,
23+
"p" -> 25,
24+
"q" -> 26,
25+
"r" -> 27,
26+
"s" -> 28,
27+
"t" -> 29,
28+
"u" -> 30,
29+
"v" -> 31,
30+
"w" -> 32,
31+
"x" -> 33,
32+
"y" -> 34,
33+
"z" -> 35
34+
)
35+
36+
private def convert(uli: String): String = uli
37+
.map(_.toLower)
38+
.map { c =>
39+
if (!c.isDigit)
40+
conversionTable(c.toString).toString
41+
else
42+
c
43+
}.mkString("") + "00"
44+
45+
private def calculateMod(i: BigInt): BigInt = {
46+
i % 97
47+
}
48+
49+
private def calculateCheckDigit(i: BigInt) = {
50+
98 - i
51+
}
52+
53+
def checkDigit(uli: String): String = {
54+
val checkDigit =
55+
calculateCheckDigit(calculateMod(BigInt(convert(uli))))
56+
uli + checkDigit.toString
57+
}
58+
59+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package hmda.validation.engine.lar
2+
3+
import org.scalatest.{ MustMatchers, WordSpec }
4+
5+
class ULIValidationSpec extends WordSpec with MustMatchers {
6+
7+
"A ULI Validation" must {
8+
"Produce valid check digit" in {
9+
val uli = "10Bx939c5543TqA1144M999143X"
10+
ULIValidation.checkDigit(uli) mustBe "10Bx939c5543TqA1144M999143X38"
11+
}
12+
}
13+
}

0 commit comments

Comments
 (0)