ocaml查看int的特定数字

时间:2013-01-14 23:18:38

标签: int ocaml digit

嘿伙计们我正在编写一个ocaml程序,我无法弄清楚如何查看int的具体数字

所以说我们有

let a = 405;;

我希望能够查看第一个数字,第4个数字,或第二个数字,0。我怎样才能完成此操作?我想把它变成一个字符串并查看字符,但我觉得应该有另一种方法。

3 个答案:

答案 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) [] ;;