aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam/float.gleam35
-rw-r--r--src/gleam_stdlib.js10
-rw-r--r--test/gleam/float_test.gleam55
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