diff options
-rw-r--r-- | src/gleam/float.gleam | 35 | ||||
-rw-r--r-- | src/gleam_stdlib.js | 10 | ||||
-rw-r--r-- | test/gleam/float_test.gleam | 55 |
3 files changed, 66 insertions, 34 deletions
diff --git a/src/gleam/float.gleam b/src/gleam/float.gleam index 857b593..b3f0df2 100644 --- a/src/gleam/float.gleam +++ b/src/gleam/float.gleam @@ -2,20 +2,33 @@ import gleam/order.{Order} if erlang { import gleam/string_builder +} - /// Attempts to parse a string as a float, returning `Error(Nil)` if it was not - /// possible. - /// - /// ## Examples - /// > parse("2.3") - /// Ok(2.3) - /// - /// > parse("ABC") - /// Error(Nil) - /// - pub external fn parse(String) -> Result(Float, Nil) = +/// Attempts to parse a string as a float, returning `Error(Nil)` if it was not +/// possible. +/// +/// ## Examples +/// > parse("2.3") +/// Ok(2.3) +/// +/// > parse("ABC") +/// Error(Nil) +/// +pub fn parse(string: String) -> Result(Float, Nil) { + do_parse(string) +} + +if erlang { + external fn do_parse(String) -> Result(Float, Nil) = "gleam_stdlib" "parse_float" +} + +if javascript { + external fn do_parse(String) -> Result(Float, Nil) = + "../gleam_stdlib.js" "parse_float" +} +if erlang { /// Returns the string representation of the provided float. /// /// ## Examples diff --git a/src/gleam_stdlib.js b/src/gleam_stdlib.js index 1e93901..a60b361 100644 --- a/src/gleam_stdlib.js +++ b/src/gleam_stdlib.js @@ -22,7 +22,15 @@ export function identity(x) { export function parse_int(value) { if (/^[-+]?(\d+)$/.test(value)) { - return gleam_ok(Number(value)); + return gleam_ok(parseInt(value)); + } else { + return gleam_error(Nil); + } +} + +export function parse_float(value) { + if (/^[-+]?(\d+)\.(\d+)$/.test(value)) { + return gleam_ok(parseFloat(value)); } else { return gleam_error(Nil); } diff --git a/test/gleam/float_test.gleam b/test/gleam/float_test.gleam index 79dba56..774f448 100644 --- a/test/gleam/float_test.gleam +++ b/test/gleam/float_test.gleam @@ -1,34 +1,45 @@ +import gleam/should +import gleam/float + if erlang { - import gleam/should - import gleam/float import gleam/order +} - pub fn parse_test() { - "1.23" - |> float.parse - |> should.equal(Ok(1.23)) +pub fn parse_test() { + "1.23" + |> float.parse + |> should.equal(Ok(1.23)) - "5.0" - |> float.parse - |> should.equal(Ok(5.0)) + "+1.23" + |> float.parse + |> should.equal(Ok(1.23)) - "0.123456789" - |> float.parse - |> should.equal(Ok(0.123456789)) + "-1.23" + |> float.parse + |> should.equal(Ok(1.23)) - "" - |> float.parse - |> should.equal(Error(Nil)) + "5.0" + |> float.parse + |> should.equal(Ok(5.0)) - "what" - |> float.parse - |> should.equal(Error(Nil)) + "0.123456789" + |> float.parse + |> should.equal(Ok(0.123456789)) - "1" - |> float.parse - |> should.equal(Error(Nil)) - } + "" + |> float.parse + |> should.equal(Error(Nil)) + + "what" + |> float.parse + |> should.equal(Error(Nil)) + "1" + |> float.parse + |> should.equal(Error(Nil)) +} + +if erlang { pub fn to_string_test() { 123.0 |> float.to_string |