2009-02-25 80 views
48

Tôi biết, các chuỗi Erlang nên tránh bằng mọi giá ...chuyển đổi một số nguyên thành chuỗi trong Erlang

nhưng nếu tôi không làm như vậy, làm cách nào để tạo "5" từ 5?

đặc biệt, có bất kỳ điều gì như io: format ("~ p", [5]) sẽ trả lại chuỗi được định dạng thay vì in tới luồng không?

+1

Tránh mọi chi phí? Nơi mà bạn có được ý tưởng đó? Có một số mối quan tâm về hiệu suất và các phiền toái khác, nhưng chúng vẫn là một kiểu dữ liệu cốt lõi và sự lựa chọn mặc định cho các chuỗi. – cthulahoops

+1

Tôi nói với lưỡi trong má. Nếu tôi tin chắc rằng bạn không bao giờ nên sử dụng chúng, tôi sẽ không hỏi câu hỏi này. Mặt khác, mô tả chúng như là một "loại dữ liệu cốt lõi" có thể kéo dài mọi thứ một chút, theo quan điểm của tôi. – collapsinghrung

+1

chuỗi trong erlang là một danh sách. nó là loại dữ liệu cốt lõi. giống như nhị phân hoặc nguyên tử. – Worker

Trả lời

10

Sau đây có lẽ không phải là cách thú vị nhất, nhưng nó hoạt động:

1> lists:flatten(io_lib:format("~p", [35365])). 
"35365" 

EDIT: Tôi đã phát hiện ra rằng các chức năng sau đây do thỏa thuận hữu ích:

%% string_format/2 
%% Like io:format except it returns the evaluated string rather than write 
%% it to standard output. 
%% Parameters: 
%% 1. format string similar to that used by io:format. 
%% 2. list of values to supply to format string. 
%% Returns: 
%% Formatted string. 
string_format(Pattern, Values) -> 
    lists:flatten(io_lib:format(Pattern, Values)). 

EDIT 2 (để trả lời các bình luận): chức năng trên xuất phát từ một chương trình nhỏ mà tôi đã viết một lúc để học Erlang. Tôi đang tìm kiếm một chức năng chuỗi định dạng và phát hiện các hành vi của io_lib:format/2 trong erl phản trực giác, ví dụ:

1> io_lib:format("2 + 2 = ~p", [2+2]). 
[50,32,43,32,50,32,61,32,"4"] 

Vào thời điểm đó, tôi đã không nhận thức được 'tự động làm phẳng' hành vi của các thiết bị đầu ra nói bởi @archaelus và do đó kết luận rằng hành vi trên không phải là những gì tôi muốn.

Tối nay, tôi đã quay lại chương trình này và thay thế cuộc gọi tới chức năng string_format ở trên với io_lib:format. Các vấn đề duy nhất mà điều này gây ra là một vài bài kiểm tra của EU không thành công vì họ đang mong đợi một chuỗi phẳng. Đây là một cách dễ dàng cố định.

Tôi đồng ý với @gleber và @womble rằng việc sử dụng hàm này là quá mức cần thiết để chuyển đổi số nguyên thành chuỗi. Nếu bạn chỉ cần sử dụng integer_to_list/1. HÔN!

+21

Hoàn toàn không cần sử dụng 'io_lib: format/2' cho tác vụ đơn giản này. 'integer_to_list/1' là đủ. – gleber

+2

Ngoài ra, làm phẳng các iolist kết quả thường là lãng phí. Ổ cắm/cổng/tập tin/IoDevices tất cả flatten trên đầu ra, do đó, làm phẳng mình là dư thừa. – archaelus

+0

integer_to_list/1 là đủ cho câu hỏi được đặt tiêu đề, nhưng điều này gọn gàng trả lời "bạn có thể tạo chuỗi định dạng có số nội suy" câu hỏi con ... – collapsinghrung

131

Ngoài ra còn có integer_to_list/1, thực hiện chính xác những gì bạn muốn mà không có sự xấu xí.

+0

Tôi nghĩ rằng bạn có nghĩa là list_to_integer/1 và list_to_float/1 khi anh ta cố gắng đi từ một chuỗi đến một số. Ngoài ra tài liệu cho các chức năng này là 'khó tìm' vì chúng là một phần của mô-đun Erlang và bạn cần biết để xem ở đó. –

+7

Anh ấy đang cố chuyển đổi 5 thành "5". Vì vậy, số nguyên để chuỗi. –

+3

integer_to_list/1 là đúng. – ErJab

4

Là một phần nếu bạn cần xử lý chuỗi đại diện của phao, bạn nên xem số work mà Bob Ippolito đã thực hiện trên mochinum.

25

Một chuỗi là một danh sách:

9> integer_to_list(123). 
"123" 
2

danh sách: concat ([Số]). cũng hoạt động.

Các vấn đề liên quan