【问题标题】:How to cast a character to int in Clojure?如何在 Clojure 中将字符转换为 int?
【发布时间】:2013-11-14 00:04:50
【问题描述】:

如何在 Clojure 中将字符转换为 int?

我正在尝试用 clojure 编写一个 rot 13,所以我需要一些东西来将我的 char 转换为 int。我找到了一个叫做 (int) 的东西,所以我把:

(int a)

Get: CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compile:(NO_SOURCE_PATH:13:1)

然后我输入:

(int 'a)

获取:ClassCastException clojure.lang.Symbol 无法转换为 `java.lang.Character clojure.lang.RT.intCast (RT.java:1087)

然后:

(rot13 ''a')

获取:ClassCastException clojure.lang.PersistentList 无法转换为 java.lang.Character clojure.lang.RT.intCast (RT.java:1087)

还有:

(rot13 "a")

获取:

ClassCastException java.lang.String cannot be cast to java.lang.Character  clojure.lang.RT.intCast (RT.java:1087)

那么正确的做法是什么?

顺便说一句,我总是对所有这些 clojure 语法感到困惑。但我永远找不到任何来源只能帮助我解决我的问题。有什么建议?谢谢!!

【问题讨论】:

  • 我相信您正在寻找"character literal",例如\a(错误消息说它需要一个字符,而不是整数)。
  • 谢谢!这解决了我的问题。第一次使用stackoverflow,这是一个好地方!
  • 使用documentation,尤其是reader

标签: clojure functional-programming lisp


【解决方案1】:

如果你问得好,Clojure 会自动将字符转换为 int。它将使用 ascii 等价转换它(实际上是 unicode)。

(int \a);;=>97
(int \b);;=>98
(int \c);;=>99

但是,如果您想将也是数字的 Clojure char 转换为 int 或 long :

(Character/digit \1 10) ;; => 1
(Character/digit \2 10) ;; => 2

非数字字符将转换为-1

(Character/digit \a 10) ;;=> -1

在这种情况下可以,因为\-1 不是字符。

(Character/digit \-1 10);;=>java.lang.RuntimeException: Unsupported character: \-1

注意- 将转换为-1 也很方便,尽管我不太依赖它:

(Character/digit \- 10);;=>-1

第二个参数显然是基数。例如:

(Character/digit \A 16);;=>10

【讨论】:

  • (Character/digit \101 10) ;;=> 101 应该会出错,因为\101 不是有效字符(当然也不是数字)。它对我有用:> (Character/digit \101 10) Syntax error reading source at (REPL:89:43). Unsupported character: \101
  • @Jun-DaiBates-Kobashigawa 正确,我将从我的答案中删除它。谢谢!
【解决方案2】:

您正在寻找的是字符文字\a。字符文字由单个字符或 16 位 unicode 代码点表示,前缀为 \ 阅读器宏。

(int \a) ;; => 97

(int \0) ;; => 48

(int \u0030) ;; => 48


对于(int a)a 是一个符号。因此,运行时尝试并未能解析该符号所绑定的内容。


对于(int 'a)a 也是一个符号,但是,因为你用单引号 (') 声明它是一个符号,运行时按字面意思理解它并尝试将 clojure.lang.Symbol 转换为 @987654330 并失败@。


对于(rot13 ''a')'a'a' 声明为符号。但是,额外的 ' 前缀使运行时处理从字面上声明 a' 的表达式。 'a' 扩展为 (quote a'),因此“文字文字”''a' 扩展为列表 (quote a')

''a' ;; => (quote a')

(second ''a') ;; => a'


对于(rot13 "a")a 是一个字符串。字符串不能转换为字符,但可以将它们视为字符的集合。因此,(rot13 (first "a")) 将按预期工作。

【讨论】:

  • 谢谢!这绝对有帮助!
  • 只是意识到您稍后编辑并且有更多内容。这解决了我所有关于数据时间的问题。非常感谢!!
  • Clojurescript: (.charCodeAt "a") => 97
【解决方案3】:

不知道为什么上面讨论了这么长时间。

(Integer/parseInt s)

【讨论】:

  • 我认为Integer/parseInt 接受一个字符串,如果传递一个字符则抛出异常。
猜你喜欢
  • 2011-08-03
  • 2010-12-13
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多