콘솔에 출력 형식을 지정하고 탭 수를 지정합니다.
콘솔에 정보를 출력하는 스크립트를 생성하고 있습니다. 정보는 값이있는 일종의 통계입니다. 해시와 매우 흡사합니다.
따라서 한 값의 이름은 8 자이고 다른 값은 3입니다. 두 개의 정보를 출력하는 동안 반복 할 때 \ t 일부 열이 올바르게 정렬되지 않습니다.
예를 들어 출력은 다음과 같을 수 있습니다.
long value name 14
short 12
little 13
tiny 123421
long name again 912421
모든 값이 올바르게 정렬되기를 바랍니다. 지금 나는 이것을하고있다 :
puts "#{value_name} - \t\t #{value}"
하나의 탭만 사용하기 위해 긴 이름을 어떻게 말할 수 있습니까? 아니면 다른 해결책이 있습니까?
일반적 으로 멋지게 형식을 지정 하는 %10s
일종의 printf
체계가 있습니다.
하지만 루비를 전혀 사용하지 않았기 때문에 확인해야합니다.
예, 서식이있는 printf가 있습니다.
위의 예는 10 자 간격으로 오른쪽 정렬되어야합니다.
열에서 가장 넓은 필드를 기준으로 형식을 지정할 수 있습니다.
printf ([포트,] 형식, 인수 ...)
sprintf와 같은 형식에 따라 형식이 지정된 인수를 인쇄합니다. 첫 번째 인수가 IO 또는 해당 하위 클래스의 인스턴스 인 경우 해당 개체로 리디렉션 된 인쇄. 기본값은 $ stdout의 값입니다.
최대 길이가 20 자 이하인 경우 :
printf "%-20s %s\n", value_name, value
좀 더 역동적으로 만들고 싶다면 다음과 같이 잘 작동합니다.
longest_key = data_hash.keys.max_by(&:length)
data_hash.each do |key, value|
printf "%-#{longest_key.length}s %s\n", key, value
end
String에는 정확히 다음과 같은 내장 ljust 가 있습니다.
x = {"foo"=>37, "something long"=>42, "between"=>99}
x.each { |k, v| puts "#{k.ljust(20)} #{v}" }
# Outputs:
# foo 37
# something long 42
# between 99
또는 탭을 원하는 경우 약간의 수학 (탭 표시 너비가 8이라고 가정)을 수행하고 짧은 표시 기능을 작성할 수 있습니다.
def tab_pad(label, tab_stop = 4)
label_tabs = label.length / 8
label.ljust(label.length + tab_stop - label_tabs, "\t")
end
x.each { |k, v| puts "#{tab_pad(k)}#{v}" }
# Outputs:
# foo 37
# something long 42
# between 99
이전에는 버그가 거의 없었지만 이제 % 연산자와 함께 대부분의 printf 구문을 사용할 수 있습니다.
1.9.3-p194 :025 > " %-20s %05d" % ['hello', 12]
=> " hello 00012"
물론 미리 계산 된 너비도 사용할 수 있습니다.
1.9.3-p194 :030 > "%-#{width}s %05x" % ['hello', 12]
=> "hello 0000c"
내가 썼다
- 열 너비 자동 감지
- 공백이있는 공간
- 배열
[[],[],...]
또는 해시 배열[{},{},...]
콘솔 창에 비해 너무 넓은 열을 감지하지 못함
목록 = [[123, "SDLKFJSLDKFJSLDKFJLSDKJF"], [123456, "ffff"],]
array_maxes
def array_maxes(lists)
lists.reduce([]) do |maxes, list|
list.each_with_index do |value, index|
maxes[index] = [(maxes[index] || 0), value.to_s.length].max
end
maxes
end
end
array_maxes(lists)
# => [6, 24]
puts_arrays_columns
def puts_arrays_columns(lists)
maxes = array_maxes(hashes)
lists.each do |list|
list.each_with_index do |value, index|
print " #{value.to_s.rjust(maxes[index])},"
end
puts
end
end
puts_arrays_columns(lists)
# Output:
# 123, SDLKFJSLDKFJSLDKFJLSDKJF,
# 123456, ffff,
그리고 다른 것
hashes = [
{ "id" => 123, "name" => "SDLKFJSLDKFJSLDKFJLSDKJF" },
{ "id" => 123456, "name" => "ffff" },
]
hash_maxes
def hash_maxes(hashes)
hashes.reduce({}) do |maxes, hash|
hash.keys.each do |key|
maxes[key] = [(maxes[key] || 0), key.to_s.length].max
maxes[key] = [(maxes[key] || 0), hash[key].to_s.length].max
end
maxes
end
end
hash_maxes(hashes)
# => {"id"=>6, "name"=>24}
puts_hashes_columns
def puts_hashes_columns(hashes)
maxes = hash_maxes(hashes)
return if hashes.empty?
# Headers
hashes.first.each do |key, value|
print " #{key.to_s.rjust(maxes[key])},"
end
puts
hashes.each do |hash|
hash.each do |key, value|
print " #{value.to_s.rjust(maxes[key])},"
end
puts
end
end
puts_hashes_columns(hashes)
# Output:
# id, name,
# 123, SDLKFJSLDKFJSLDKFJLSDKJF,
# 123456, ffff,
편집 : 길이에 고려 된 해시 키를 수정합니다.
hashes = [
{ id: 123, name: "DLKFJSDLKFJSLDKFJSDF", asdfasdf: :a },
{ id: 123456, name: "ffff", asdfasdf: :ab },
]
hash_maxes(hashes)
# => {:id=>6, :name=>20, :asdfasdf=>8}
열 열을 허용 하시겠습니까?
hashes.map{ |h| h.slice(:id, :name) }
# => [
# { id: 123, name: "DLKFJSDLKFJSLDKFJSDF" },
# { id: 123456, name: "ffff" },
#]
나중에 참조하고 이것을 보거나 찾는 사람들을 위해 ... 보석을 사용하십시오. https://github.com/wbailey/command_line_reporter를 제안합니다.
일반적으로 탭을 사용하지 않고 공백을 사용하고 기본적으로 "열"을 설정하거나 이러한 유형의 문제가 발생합니다.
ReferenceURL : https://stackoverflow.com/questions/1087658/nicely-formatting-output-to-console-specifying-number-of-tabs
'programing' 카테고리의 다른 글
Android Room Persistences 라이브러리 및 Kotlin (0) | 2021.01.19 |
---|---|
쿠키 JSESSIONID 이름 변경 (0) | 2021.01.19 |
인덱스를 포함하는 MySQL 테이블 복사 (0) | 2021.01.19 |
JS / jQuery를 사용하여 브라우저에서 터치 스타트 지원을 확인하는 방법은 무엇입니까? (0) | 2021.01.19 |
구조체를 초기화하는 방법? (0) | 2021.01.19 |