erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

164 lines
5.5 KiB

-module(utTypeCast).
-compile([export_all, nowarn_export_all]).
toFloat(Value) when is_list(Value) -> list_to_float(Value);
toFloat(Value) when is_binary(Value) -> binary_to_float(Value);
toFloat(Value) when is_integer(Value) -> erlang:float(Value);
toFloat(Value) when is_float(Value) -> Value.
toList(undefined) -> "undefined";
toList(null) -> "null";
toList(Value) when is_tuple(Value) -> tuple_to_list(Value);
toList(Value) when is_binary(Value) -> binary_to_list(Value);
toList(Value) when is_bitstring(Value) -> bitstring_to_list(Value);
toList(Value) when is_integer(Value) -> integer_to_list(Value);
toList(Value) when is_float(Value) -> float_to_list(Value, [{decimals, 6}, compact]);
toList(Value) when is_atom(Value) -> atom_to_list(Value);
toList(Value) when is_list(Value) -> Value;
toList([Tuple | PropList] = Value) when is_list(PropList) and is_tuple(Tuple) ->
lists:map(fun({K, V}) -> {toList(K), toList(V)} end, [Value]).
%% to_list(Term) when is_binary(Term) ->
%% case unicode:characters_to_binary(Term, utf8, utf8) of
%% Term ->
%% unicode:characters_to_list(Term);
%% _ ->
%% binary_to_list(Term)
%% end.
toBinary(Value) when is_integer(Value) -> integer_to_binary(Value);
toBinary(Value) when is_list(Value) -> list_to_binary(Value);
toBinary(Value) when is_float(Value) -> float_to_binary(Value, [{decimals, 6}, compact]);
toBinary(Value) when is_atom(Value) -> atom_to_binary(Value, utf8);
toBinary(Value) when is_binary(Value) -> Value;
toBinary([Tuple | PropList] = Value) when is_list(PropList) and is_tuple(Tuple) ->
lists:map(fun({K, V}) -> {toBinary(K), toBinary(V)} end, Value);
toBinary(Value) -> term_to_binary(Value).
toInteger(undefined) -> undefined;
toInteger(Value) when is_float(Value) -> trunc(Value);
toInteger(Value) when is_list(Value) -> list_to_integer(Value);
toInteger(Value) when is_binary(Value) -> binary_to_integer(Value);
toInteger(Value) when is_tuple(Value) -> toInteger(tuple_to_list(Value));
toInteger(Value) when is_integer(Value) -> Value.
dataType(Data) when is_list(Data) -> list;
dataType(Data) when is_integer(Data) -> integer;
dataType(Data) when is_binary(Data) -> binary;
dataType(Data) when is_function(Data) -> function;
dataType(Data) when is_tuple(Data) -> tuple;
dataType(Data) when is_map(Data) -> map;
dataType(Data) when is_atom(Data) -> atom;
%%dataType(Data) when is_boolean(Data) -> boolean;
dataType(Data) when is_bitstring(Data) -> bitstring;
dataType(Data) when is_float(Data) -> float;
dataType(Data) when is_number(Data) -> number;
dataType(Data) when is_reference(Data) -> reference;
dataType(Data) when is_pid(Data) -> pid;
dataType(Data) when is_port(Data) -> port;
dataType(_Data) -> not_know.
%% Trim the binary
-spec trim(Bin :: binary()) -> binary().
trim(Bin) when is_binary(Bin) -> trimHead(trimTail(Bin)).
%% Trim head of binary
-spec trimHead(Bin :: binary()) -> binary().
trimHead(<<>>) -> <<>>;
trimHead(<<C, BinTail/binary>> = Bin) ->
case is_whitespace(C) of
true -> trimHead(BinTail);
false -> Bin
end.
%% Trim tail of binary
-spec trimTail(Bin :: binary()) -> binary().
trimTail(<<>>) -> <<>>;
trimTail(Bin) ->
Size = byte_size(Bin) - 1,
<<BinHead:Size/binary, C>> = Bin,
case is_whitespace(C) of
true -> trimTail(BinHead);
false -> Bin
end.
%% Check if the char is a whitespace
-spec is_whitespace(char()) -> true | false.
is_whitespace($\s) -> true;
is_whitespace($\t) -> true;
is_whitespace($\n) -> true;
is_whitespace($\r) -> true;
is_whitespace(_) -> false.
%% term序列化, term转为string
term_to_string(Bin) when is_binary(Bin) ->
binary_to_list(Bin);
term_to_string(Term) ->
case catch io_lib:format("~w", [Term]) of
{'EXIT', _} -> lists:flatten(io_lib:format("~p", [Term]));
GoodString -> lists:flatten(GoodString)
end.
%% term反序列化, string转换为term
string_to_term(String) ->
case erl_scan:string(String ++ ".") of
{ok, Tokens, _} ->
case erl_parse:parse_term(Tokens) of
{ok, Term} -> Term;
_Err -> String
end;
_Error ->
undefined
end.
%% term序列化,term转换为string格式,e.g., [{a},1] => "[{a},1]"
term_to_string1(Term) ->
binary_to_list(list_to_binary(io_lib:format("~w", [Term]))).
%% term序列化,term转换为bitstring格式,e.g., [{a},1] => <<"[{a},1]">>
term_to_bitstring(Term) ->
erlang:list_to_bitstring(io_lib:format("~w", [Term])).
%% term反序列化,string转换为term,e.g., "[{a},1]" => [{a},1]
string_to_term1(String) ->
case String of
[] -> [];
_ ->
case erl_scan:string(String ++ ".") of
{ok, Tokens, _} ->
case erl_parse:parse_term(Tokens) of
{ok, Term} -> Term;
_Err -> undefined
end;
_Error ->
undefined
end
end.
%%将列表转换为string [a,b,c] -> "a,b,c"
list_to_string(List) ->
case List == [] orelse List == "" of
true -> "";
false ->
F = fun(E) ->
tool:to_list(E) ++ ","
end,
L1 = [F(E) || E <- List],
L2 = lists:concat(L1),
string:substr(L2, 1, length(L2) - 1)
end.
%% term反序列化,bitstring转换为term,e.g., <<"[{a},1]">> => [{a},1]
bitstring_to_term(undefined) -> undefined;
bitstring_to_term(BitString) ->
string_to_term(tool:to_list(BitString)).
termToBase64(Term) ->
base64:encode(term_to_binary(Term)).
base64ToTerm(Base64String) ->
binary_to_term(base64:decode(Base64String)).