|
-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)).
|