String to Decimal Conversion

878 views
Skip to first unread message

Don

unread,
Nov 22, 2009, 7:14:05 PM11/22/09
to Clojure
I am having a problem converting a string to decimal. I want to
convert "1.0" to decimal 1.0. I have tried the java.lang.Integer
class

use=> (Integer/parseInt "1.1")
java.lang.NumberFormatException: For input string:
"1.1" (NO_SOURCE_FILE:0)

But it won't give. It does however work when I run it with "1".

Any suggestions would be greatly appreciated. Thank you.

Kevin Downey

unread,
Nov 22, 2009, 7:20:48 PM11/22/09
to clo...@googlegroups.com
1.1 is not representable as an Integer(Java class, or primitive int)
and is not an integer (mathematical sense) so expecting to be
representable as one, is kind of... odd.
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clo...@googlegroups.com
> Note that posts from new members are moderated - please be patient with your first post.
> To unsubscribe from this group, send email to
> clojure+u...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en



--
And what is good, Phaedrus,
And what is not good—
Need we ask anyone to tell us these things?

Don

unread,
Nov 22, 2009, 7:47:10 PM11/22/09
to Clojure
Yes you are right. Hence the error message I posted. But it was the
only idea that came to mind. I'm new to clojure and not a java
programmer.

Richard Newman

unread,
Nov 22, 2009, 7:47:39 PM11/22/09
to clo...@googlegroups.com
> I am having a problem converting a string to decimal. I want to
> convert "1.0" to decimal 1.0.

For a double (not decimal):

(Double/parseDouble "1.1")
=>
1.1

for a decimal:

(BigDecimal. "1.1")
1.1M

Note that Clojure has reader support for BigDecimal (the "M").

Don

unread,
Nov 22, 2009, 7:48:48 PM11/22/09
to Clojure
Thanks a bunch Richard.

Kevin Downey

unread,
Nov 22, 2009, 8:02:39 PM11/22/09
to clo...@googlegroups.com
user=> (read-string "1.1")
1.1
user=>

Don

unread,
Nov 22, 2009, 8:14:05 PM11/22/09
to Clojure
Awesome Kevin. That solution is sexy. I don't even need the
libraries anymore.

Don

unread,
Nov 22, 2009, 8:16:11 PM11/22/09
to Clojure
Awesome Kevin. That solution is sexy. I don't even need the java
library anymore.

On Nov 22, 5:02 pm, Kevin Downey <redc...@gmail.com> wrote:

Richard Newman

unread,
Nov 22, 2009, 8:37:00 PM11/22/09
to clo...@googlegroups.com
> Awesome Kevin. That solution is sexy. I don't even need the java
> library anymore.

Note, however, that this can return (or do!) near anything, because it
accepts any Clojure syntax.

user=> (read-string "\"foo\"")
"foo" ; a string

user=> (read-string "(1.1)")
(1.1) ; a list containing a float

user=> (read-string "foo")
user/foo ; an interned symbol

including executing arbitrary code, unless you bind *read-eval*:

user=> (read-string "#=(println \"Oof\")")
Oof ; this gets printed. It could do much worse.
nil

In short... use the reader when you want to handle Clojure syntax. If
you want to convert a string to a decimal, do it properly. You'll get
useful exceptions, prevent bad input, and avoid inadvertent attack
vectors.

There's no "needing the Java library" -- you always have the core Java
classes available, including Double and BigDecimal.

HTH,

-R
Reply all
Reply to author
Forward
0 new messages