嘿伙计们我正在编写一个ocaml程序,我无法弄清楚如何查看int的具体数字
所以说我们有
let a = 405;;
我希望能够查看第一个数字,第4个数字,或第二个数字,0。我怎样才能完成此操作?我想把它变成一个字符串并查看字符,但我觉得应该有另一种方法。
答案 0 :(得分:5)
(我认为这是一般编程问题,而不是OCaml问题。)
要获得右边0的数字k,你将(/)
除以10的k次方,然后取结果模10。
左侧的编号数字使这个问题更难。如果必须这样做,您需要知道该数字所具有的位数,您可以从日志库中获取该数字。
转换为字符串(或者,如填充建议的数字列表)可能完全没问题。这基本上按顺序执行所有数字的所有除法和修改。如果你没有做很多这些转换,那么它就足够快了(恕我直言)。
答案 1 :(得分:4)
您可以编写一个递归函数来从数字中提取所有数字:
(* Assuming n is a non-negative number *)
let digits n =
let rec loop n acc =
if n = 0 then acc
else loop (n/10) (n mod 10::acc) in
match n with
| 0 -> [0]
| _ -> loop n []
一旦有了数字列表
# digits 405;;
- : int list = [4; 0; 5]
您可以使用某些List函数获取任何数字。
答案 2 :(得分:0)
我要添加一个新答案,因为@pad的解决方案会丢弃前导'0'。我正在提议一种解决方案,该方案可以保留所有前导零,如果您想解析电话号码,则很有用。
let digits s =
let rec aux n nb_chars accu = match n with
| 0 -> (if nb_chars=0 then accu else (aux 0 (nb_chars-1) (0::accu)))
| _ -> aux (n/10) (nb_chars - 1) (n mod 10::accu)
in
let rec init_list = function
| 0 -> []
| n -> 0 :: (init_list (n-1))
in
if s=(String.make (String.length s) '0')
then (init_list (String.length s))
else aux (int_of_string s) (String.length s) [] ;;