refactor: deduplicate numericOnly and DuckDuckGo result extraction
All checks were successful
CI / build (pull_request) Successful in 29s
CI / vet (pull_request) Successful in 1m1s
CI / test (pull_request) Successful in 1m4s

- Extract identical numericOnly inline functions from powerball and
  megamillions into shared sites/internal/parse.NumericOnly with tests
- Extract duplicated DuckDuckGo result parsing from Search() and
  GetResults() into shared extractResults() helper

Closes #13, #14

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-15 16:26:54 +00:00
parent 384566e016
commit 132817144e
6 changed files with 57 additions and 84 deletions

View File

@@ -0,0 +1,21 @@
package parse
import "strconv"
// NumericOnly extracts only digits and decimal points from a string and
// returns the result as a float64. Returns 0 if parsing fails.
func NumericOnly(in string) float64 {
var out string
for _, r := range in {
if (r >= '0' && r <= '9') || r == '.' {
out += string(r)
}
}
val, err := strconv.ParseFloat(out, 64)
if err != nil {
return 0
}
return val
}

View File

@@ -0,0 +1,25 @@
package parse
import "testing"
func TestNumericOnly(t *testing.T) {
tests := []struct {
input string
want float64
}{
{"$1.5 Billion", 1.5},
{"$100 Million", 100},
{"$200,000", 200000},
{"no numbers", 0},
{"", 0},
{"42", 42},
{"3.14159", 3.14159},
}
for _, tt := range tests {
got := NumericOnly(tt.input)
if got != tt.want {
t.Errorf("NumericOnly(%q) = %v, want %v", tt.input, got, tt.want)
}
}
}